137

I am pulling varchar values out of a DB and want to set the string I am assigning them to as "" if they are null. I'm currently doing it like this:

if (string.IsNullOrEmpty(planRec.approved_by) == true)
  this.approved_by = "";
else
  this.approved_by = planRec.approved_by.toString();

There seems like there should be a way to do this in a single line something like:

this.approved_by = "" || planRec.approved_by.toString();

However I can't find an optimal way to do this. Is there a better way or is what I have the best way to do it?

Alexander Abakumov
  • 13,617
  • 16
  • 88
  • 129
Splashlin
  • 7,225
  • 12
  • 46
  • 50

12 Answers12

146

Try this:

this.approved_by = IsNullOrEmpty(planRec.approved_by) ? string.Empty : planRec.approved_by.toString();

You can also use the null-coalescing operator as other have said - since no one has given an example that works with your code here is one:

this.approved_by = planRec.approved_by ?? planRec.approved_by.toString();

But this example only works since a possible value for this.approved_by is the same as one of the potential values that you wish to set it to. For all other cases you will need to use the conditional operator as I showed in my first example.

Flimtix
  • 356
  • 1
  • 4
  • 17
Andrew Hare
  • 344,730
  • 71
  • 640
  • 635
  • 11
    Doesn't this null coalescing operator throw a nullreference anyways? The way I see this code does the following: `if (planRec.approved_by == null) { this.approved_by = planRec.approved_by.toString(); //<= nullref } else { this.approved_by = planRec.approved_by;}`. If I'm wrong please point out the error. – Destrictor Feb 19 '13 at 08:18
  • 15
    @Destrictor is right, the code is broken. Here's a fix using another fun operator: `this.approved_by = planRec.approved_by?.toString() ?? "";` <- That's the null-conditional operator, and I don't think it was around when this question was first asked and answered. Hopefully OP sees this, so he can go refactor his 7 year old code, from two jobs ago :) . – Patrick Jul 20 '16 at 05:56
  • I could swear I've seen some kind of syntax that lets you assign to an attribute of an object if that object isn't null, like someObject?.someAttribute = value; but I can't seem to find anything like that. – Shavais Oct 20 '21 at 22:28
78

Starting with C# 8.0, you can use the ??= operator to replace the code of the form

if (variable is null)
{
    variable = expression;
}

with the following code:

variable ??= expression;

More information is here

phoenix
  • 7,988
  • 6
  • 39
  • 45
nzrytmn
  • 6,193
  • 1
  • 41
  • 38
61

You are looking for the C# coalesce operator: ??. This operator takes a left and right argument. If the left hand side of the operator is null or a nullable with no value it will return the right argument. Otherwise it will return the left.

var x = somePossiblyNullValue ?? valueIfNull;
JaredPar
  • 733,204
  • 149
  • 1,241
  • 1,454
  • This answer does not cover the all cases from the question (only partially). Notice, that there is "string.IsNullOrEmpty". So Empty case is not handled here. – Bronek Jan 23 '20 at 10:43
  • 2
    upvoted because this was the answer I was looking for. (I just needed the null check) – edank Jan 26 '21 at 06:16
41

The coalesce operator (??) is what you want, I believe.

Dave Ward
  • 59,815
  • 13
  • 117
  • 134
30

My guess is the best you can come up with is

this.approved_by = IsNullOrEmpty(planRec.approved_by) ? string.Empty
                                                      : planRec.approved_by.ToString();

Of course since you're hinting at the fact that approved_by is an object (which cannot equal ""), this would be rewritten as

this.approved_by = (planRec.approved_by ?? string.Empty).ToString();
Dmitri Nesteruk
  • 23,067
  • 22
  • 97
  • 166
26

With C#6 there is a slightly shorter way for the case where planRec.approved_by is not a string:

this.approved_by = planRec.approved_by?.ToString() ?? "";
Malcolm
  • 1,239
  • 1
  • 14
  • 25
25

Use the C# coalesce operator: ??

// if Value is not null, newValue = Value else if Value is null newValue is YournullValue
var newValue = Value ?? YourNullReplacement;
Nova Ardent
  • 161
  • 1
  • 16
Ramgy Borja
  • 2,330
  • 2
  • 19
  • 40
13

To extend @Dave's answer...if planRec.approved_by is already a string

this.approved_by = planRec.approved_by ?? "";
Community
  • 1
  • 1
Paul Alexander
  • 31,970
  • 14
  • 96
  • 151
3

To assign a non-empty variable without repeating the actual variable name (and without assigning anything if variable is null!), you can use a little helper method with a Action parameter:

public static void CallIfNonEmpty(string value, Action<string> action)
{
    if (!string.IsNullOrEmpty(value))
        action(value);
}

And then just use it:

CallIfNonEmpty(this.approved_by, (s) => planRec.approved_by = s);
Jake Chasan
  • 6,290
  • 9
  • 44
  • 90
Jack Miller
  • 6,843
  • 3
  • 48
  • 66
3

The accepted answer was correct in time, when it was given.

For people still finding this question: Today you can use the ??= Operator.

e.g:

private string _test = null;

private void InitIfNull(){
 _test ??= "Init";
}
Steav
  • 1,478
  • 13
  • 28
1

You can also do it in your query, for instance in sql server, google ISNULL and CASE built-in functions.

Taryn
  • 242,637
  • 56
  • 362
  • 405
user133371
  • 323
  • 2
  • 6
  • 18
-4

I use extention method SelfChk

static class MyExt {
//Self Check 
 public static void SC(this string you,ref string me)
    {
        me = me ?? you;
    }
}

Then use like

string a = null;
"A".SC(ref a);
Ali Humayun
  • 1,756
  • 1
  • 15
  • 12