La forma más corta de verificar nulo y asignar otro valor si no

86

Estoy sacando varcharvalores de una base de datos y quiero establecer el stringque los estoy asignando como "" si lo están null. Actualmente lo estoy haciendo así:

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

Parece que debería haber una forma de hacer esto en una sola línea, algo como:

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

Sin embargo, no puedo encontrar una forma óptima de hacer esto. ¿Existe una mejor manera o es la que tengo la mejor manera de hacerlo?

Splashlin
fuente
5
El == verdadero es superfluo aquí ...
cjk

Respuestas:

104

Prueba esto:

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

También puede usar el operador de fusión nula como han dicho otros, ya que nadie ha dado un ejemplo que funcione con su código, aquí hay uno:

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

Pero este ejemplo solo funciona ya que un valor posible para this.approved_byes el mismo que uno de los valores potenciales al que desea establecerlo. Para todos los demás casos, deberá usar el operador condicional como mostré en mi primer ejemplo.

Andrew Hare
fuente
8
¿Este operador de fusión nula no arroja una referencia nula de todos modos? La forma en que veo el código hace lo siguiente: if (planRec.approved_by == null) { this.approved_by = planRec.approved_by.toString(); //<= nullref } else { this.approved_by = planRec.approved_by;}. Si me equivoco, indique el error.
Destrictor
10
@Destrictor tiene razón, el código está roto. Aquí hay una solución usando otro operador divertido: this.approved_by = planRec.approved_by?.toString() ?? ""; <- Ese es el operador condicional nulo, y no creo que existiera cuando esta pregunta se hizo y respondió por primera vez. Con suerte, OP ve esto, para poder refactorizar su código de 7 años, de hace dos trabajos :)
Patrick
34

El operador de unión (??) es lo que quieres, creo.

Dave Ward
fuente
4
Sí ... pero solo porque el valor predeterminado es "".
Paul Alexander
Um, ¿cómo es eso? Se puede usar cualquier expresión para reemplazar nulo con ..
TaW
30

Está buscando el operador de fusión de C #: ??. Este operador toma un argumento de izquierda y derecha. Si el lado izquierdo del operador es nulo o anulable sin valor, devolverá el argumento derecho. De lo contrario, volverá a la izquierda.

var x = somePossiblyNullValue ?? valueIfNull;
JaredPar
fuente
Esta respuesta no cubre todos los casos de la pregunta (solo parcialmente). Observe que hay "string.IsNullOrEmpty". Entonces, el caso vacío no se maneja aquí.
Bronek
28

Supongo que lo mejor que se te ocurre es

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

Por supuesto, dado que está insinuando el hecho de que approved_byes un object(que no puede ser igual a ""), esto se reescribirá como

this.approved_by = (planRec.approved_by ?? string.Empty).ToString();
Dmitri Nesteruk
fuente
20

Con C # 6 hay una forma un poco más corta para el caso donde planRec.approved_by no es una cadena:

this.approved_by = planRec.approved_by?.ToString() ?? "";
Malcolm
fuente
15

Utilice el operador de fusión de C #: ??

// if Value is not null, newValue = Value else if Value is null newValue is YournullValue
var newValue = Value ?? YourNullReplacement;
Ramgy Borja
fuente
15

Comenzando con C # 8.0, puede usar el operador ?? = para reemplazar el código del formulario

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

con el siguiente código:

variable ??= expression;

Más información está aquí

nzrytmn
fuente
9

Para extender la respuesta de @ Dave ... si planRec.approved_by ya es una cadena

this.approved_by = planRec.approved_by ?? "";
Paul Alexander
fuente
2

Para asignar una variable no vacía sin repetir el nombre de la variable real (¡y sin asignar nada si la variable es nula!), Puede usar un pequeño método auxiliar con un Actionparámetro:

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

Y luego solo úsalo:

CallIfNonEmpty(this.approved_by, (s) => planRec.approved_by = s);
Jack Miller
fuente
1

También puede hacerlo en su consulta, por ejemplo en sql server, google ISNULLy CASEfunciones integradas.

usuario133371
fuente
-4

Yo uso el método de extensión SelfChk

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

Entonces usa like

string a = null;
"A".SC(ref a);
Ali Humayun
fuente
Supongo que quieres decir, pero no es fácil de leer y entender, ¿es así?
Ali Humayun
3
¡UPS! Tiene toda la razón: muy breve, pero NO fácil de leer y entender (al menos si no está acostumbrado a esta notación)
Jack Miller
bueno, en ese caso intenta leer un libro. Lo encontrará realmente elaborado y fácil de entender: p
Ali Humayun