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?


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.


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


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;

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();

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() ?? "";

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;

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í



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);

1

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


-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);

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.