else { if {} } and else if {} - c#

Is there any difference between:
else
{
if {}
}
and
else if {}
For example,
var statusValue = "Error";
if (!canWrite)
{
statusValue = "NotOwner";
}
else
{
if (syncJob.Status == "Idle")
{
statusValue = "InProgress";
}
}
and
var statusValue = "Error";
if (!canWrite)
{
statusValue = "NotOwner";
}
else if (syncJob.Status == "Idle")
{
statusValue = "InProgress";
}
Do the above both codes work in the same way?

The two versions of code you showed us do the same thing as each other, but they are not syntactically the same.
When you use the else if language element, you can cascade the clauses, something like this:
if (a == 1) {
// some code
} else if (b == 2) {
// some other code
} else if (c == 3) {
// even more code
} else {
// still more
}
Only one of the compound ( code surrounded by { } ) statements inside that example gets executed, guaranteed.
When you nest if within else, you don't get exactly the same thing. And if you write it that way when you want else if you'll make your code much harder to read. It's a good way to make your future self hate your present self when you must change or debug your code.

Consider
if (condition1)
DoA();
else
DoB();
Is exactly equivalent to
if (condition1)
{
DoA();
}
else
{
DoB();
}
I strongly recommend the latter because you are less likely to slip errors into your code doing maintenance when the brackets are there.
So...
if (condition1)
DoA();
else if (condition2)
DoB();
else
DoC();
Is going to be the same as a version with brackets.
As long as you restrict yourself to single statements, you don't need brackets. The brackets demarcate blocks of statements, and both if and else can work equally well with either statements or blocks.
One thing that shakes out of all this is that
if (condition1)
DoA();
else
{
if (condition2)
DoB();
}
else
DoC();
And
if (condition1)
DoA();
else
{
if (condition2)
{
DoB();
}
}
else
DoC();
Are exactly equivalent to the previous bracket-free example

if (!canWrite)
{
statusValue = "NotOwner";
}
// else is ran if the above is false and the condition is true
else if (syncJob.Status == "Idle")
{
statusValue = "InProgress";
}
if (!canWrite)
{
statusValue = "NotOwner";
}
// Runs if the above is false
else
{
// Runs any code up to this point no matter the code condition below
// Runs if the first is false and this is true
if (syncJob.Status == "Idle")
{
statusValue = "InProgress";
}
// Runs any code up to this point no matter the code condition above
}
Syntax wise no, but when it is recompiled you will end up with different code... more jumps

Related

A followup if statement

My question is a bit hard to describe so I have written a hypothetical code (nonfunctioning) down below and I wonder if there is a similar alternative in C#:
if (Red == true)
{
i -= 3;
}
else if (Yellow == true)
{
i -= 2
}
then
{
list.Clear();
}
else{}
A "then" function of sorts that both if statements follow if one where to execute. The use of this would simply be so that I do not need to do in this case a list.Clear(); in every if statement.
No there is no syntax construct like your then but you can create a method that clear the list and accept and returns the value to decrement
private int ClearAndDecrementBy(int decrement)
{
list.Clear();
return decrement;
}
and call it as
if(Red)
{
i -= ClearAndDecrementBy(3);
}
else if(Yellow)
{
i -= ClearAndDecrementBy(2);
}
else
{
}
Not really sure that there is any advantage though. The list should be declared at the global class level and this is never a good practice if it is needed only to make it work in this way. So, adding the call to list.Clear inside the if blocks seems more clear and it won't do any harm
Try this:
if(Red == true)
{
i -= 3;
}
else if(Yellow == true)
{
i -= 2
}
else
{
}
if(Red == True || Yellow == true) //You can add more like: Blue == true
{
list.Clear();
}
You could get rid of the "then" statement from your pseudo code and add the following line to the end of everything.
if (Red || Yellow)
{
list.Clear();
}
Try this:
if (Red || Yellow)
{
i = Red ? -3 : -2;
list.Clear();
}
else { }

C# nested if-else optimization with almost similar values

I have new user data (i want to import/update it). Accounts is finded by user data.
I want to update or create new accounts depended on finded accounts by user data
:
if (accountById != null)
{
if (accountByNumber != null)
{
if (accountById.Id == accountByNumber.Id)
{
if (_isSpecialData)
{
AddUserDataToAccount(userData, accountByNumber);
if (userData.Status == Blocked) return;
}
}
else
{
_log.Error($"Bad");
return;
}
}
else
{
AddUserDataToAccount(userData, accountById);
}
}
else
{
if (accountByNumber != null)
{
if (accountByNumber.RefNo == null)
{
SetAccountAdditionalId(accountByNumber, userData.AdditionalId);
if (_isSpecialData)
{
AddUserDataToAccount(userData, accountByNumber);
if (userData.Status == Blocked) return;
}
}
else
{
_log.Error($"Bad");
return;
}
}
else
{
CreateCardAndProfile2(userData, out createdNewAccount);
CreateNewAccount(userData, out createdNewAccount);
}
}
UpdateAccountData(userData, createdNewAccount);
The above method works, but I would like to know if there is any way to make it more readable, optimized?
You can use the switch operator so you can remove a lot of the if statements. if works like this:
(Note: Make sure you have a default case and a break; at the end of every case)
switch(%a%variable%here%) {
case %variable%value& {
%code%here%;
break;
}
}

C# or vba check box

I'm new here and I have a problem (I think the solution is simple, but I can't solve this problem alone). I have to throw a few checkbox on userform (that is simple) but when I write something like this:
if(checkBox1.Checked)
{
MessageBox.Show("ok1");
}
else if(checkBox1.Checked && checkBox2.Checked)
{
MessageBox.Show("ok2");
}
else
{
MessageBox.Show("co nie tak");
}
always get "ok1" MsgBox...
Any ideas what I'm doing wrong? Thanks for helping.
The if statement will always go into the first block that is true. So if checkbox1 is checked you will always get "ok1". You can never get into the second block ( "ok2" ) because if it is true, the first check would also be true.
I think you want to switch your checks:
if(checkBox1.Checked && checkBox2.Checked)
{
MessageBox.Show("ok2");
}
else if(checkBox1.Checked)
{
MessageBox.Show("ok1");
}
else
{
MessageBox.Show("co nie tak");
}
You may also be looking to build up your string by adding to it. The += means add to the end of the string.
My example code is just an example, since I don't really know what you are trying to do, but it might give you some ideas.
if (checkBox1.checked )
{
mic.HTMLBody = "1) Example1";
}
if ( checkBox2.checked )
{
mic.HTMLBody += "<br>"""2) Example2";
if ( ComboBox2.Text == "Pan" )
{
mic.HTMLBody += "<br>Pana";
}
}
from the code i see if checkbox1.checked is true then "ok1" should display and the second an third evaluations would never be evavluated. if checkbox1.checked is false then only the third option would be evaluated and the second option should never be evaluated at all. Should be more like:
if (checkBox1.Checked)
{
if (checkBox2.Checked)
{
MessageBox.Show("ok2");
}
else
{
MessageBox.Show("ok1");
}
}
else
{
MessageBox.Show("co nie tak");
}
As it is currently written, it is impossible for it to enter the else if, because whenever the else if condition is true, the if condition is also true.
It goes from up to down, the first that is true is entered and the rest are ignored.
Instead you should switch their place as follows:
if(checkBox1.Checked && checkBox2.Checked)
{
MessageBox.Show("ok2");
}
else if(checkBox1.Checked)
{
MessageBox.Show("ok1");
}
else
{
MessageBox.Show("co nie tak");
}
A little unclear what you really want shown, but if you want it to first show ok1 and then ok2 then you can do this:
if(checkBox1.Checked)
{
MessageBox.Show("ok1");
if(checkBox2.Checked) {
MessageBox.Show("ok2");
//MessageBox.Show("ok1 ok2"); //If you want to show them both at the same time
}
}
else
{
MessageBox.Show("co nie tak");
}
I tried this one on a Console and it might be the logic you need. The inline comments will give you a bit of insight of what is doing what:
check1 = true;
check2 = true;
if (check1)
{
if (check2)
{
// Prints if BOTH check1 and check2 are TRUE
Console.WriteLine("ok2");
}
else
{
// Prints if ONLY check1 is TRUE
Console.WriteLine("ok1");
}
}
else
{
// Prints if BOTH check1 and check2 are FALSE
Console.WriteLine("co nie tak");
}
bool Check = checkBox1.Checked;
bool Check2 = checkBox2.Checked;
if (Check == true && Check2 == true)
{ MessageBox.Show("ok 1 & 2"); }
if (Check == true)
{ MessageBox.Show("ok 1"); }
if (Check2 == true)
{ MessageBox.Show("ok 2 "); }
else
{ MessageBox.Show("Not Checked"); }

How to choose between different if conditions depending on another variable

I've been thinking about this problem for some time, but i just can't think of a solution without having to write duplicate code. The problem in part c# and part pseudo-code:
bool test = true;
if (test == true)
{
if(first condition) {code}
}
else
{
if(different condition) {same code as above)
}
I have to use this part in a performance intensive part of my program and i'd have to transfer 3 big parameters, which is why i'd rather not use a method.
Is there another way to solve this?
if((test && firstCondition) || (!test && differentCondition)) {
//code
}
if ((test && first_condition) || (!test && different_condition)) {
callSomeFunction();
}
I'd do it like this:
// create an inline function to capture the
Action workAction = () => { //work; }
bool test = true;
if (test == true)
{
if(first condition) {workAction(); }
}
else
{
if(different condition) {workAction(); )
}
Depending on the complexity of the conditions, this approach can sometimes help:
bool doBigCall = false;
if (test1)
{
if (test2)
{
doBigCall = true;
}
else
{
// ...
}
}
else
{
// ...
}
if (doBigCall)
{
// write the big bit of code just once
}

break in a if else loop with a counter C#

I have a logic like below and i have a counter
if(condition1 == true)
{
// do something
if (counter==1)
{
// break and go to last else statement
}
}
else if (condition2==true)
{
if (counter == 2)
{
// break and go to last else statement
}
// do something
}
else
{
// do this
}
how do i use break in this logic ?
i tried putting goto tag for else but apparently it is not valid . and i want to avoid switch as there is too much logic.
counter will be 2 in second if else loop and if counter = 2 then first if and secong if else should execute if counter=3 then first if second if else third if else should execute ans so on –
Note: Question was changed, this answer is meanwhile incorrect!
You can change the if/else if to include the counter. Then you don't need a break or goto:
if (condition1 && counter != 1)
{
// do something
}
else if (condition2 && counter != 2)
{
// do something
}
else
{
// do this
}
use something like
if (condition1 && ( counter != 1 || counter != 2 || .... counter!= n )
{
// do something
}
else if (condition2 && (counter != 2 || .. || counter!= n )
{
// do something
}
and so on
else
{
// do this
}
Apart from the fact that a break statement doesn't jump outside an if condition, your code could be
refactored in a more simple way (just pretend that the closed brace after the first if it's only a typo)
if(condition1 ==true && counter != 1)
{
do something
}
else if (condition2==true && counter != 2)
{
do something
}
else
{
do this
}
I suspect that your algorithm could be entirely redesigned, but without more context that's impossible to know.
In the meantime, you can refactor your final else clause into a separate method. You don't actually need to use break (which isn't valid in an if statement anyway), with judicious use of else.
private void MyMethod()
{
if(condition1)
{
// do something
if (counter==1)
{
MyOtherMethod();
}
}
else if (condition2)
{
if (counter == 2)
{
MyOtherMethod();
}
else
{
// do something
}
}
else
{
MyOtherMethod()
}
}
private void MyOtherMethod()
{
// Do what was in your final else clause.
}
Prior to your question edits that moved the `do something' in the first if clause to before the counter check, this would have worked too:
Assuming your various "do something" statements were different things:
if (condition1 && counter != 1)
{
// Do something.
}
else if (condition2 && counter != 1)
{
// Do something.
}
else
{
// Do something else.
}
Just put the logic in the last else block in a seperate function which you can call whenever / wherever you want.
Don't. Using a break and continue in such a big loop adds complexity and clutters your logic.
If a loop is getting too big, use one or more well-named function calls within the loop instead.
bool myCondition = false;
if(condition1 ==true)
{
if (counter==1){myCondition = true;}
// do something
}
else if (condition2==true)
{
if (counter==1){myCondition = true;}
// do something
}
// so on
if(myCondition)
{
// do this
}

Categories