¿Qué hace el signo de interrogación y el operador punto. ¿media en C # 6.0?


Con C # 6.0 en la vista previa de VS2015 tenemos un nuevo operador, ?., que se puede usar así:

public class A {
   string PropertyOfA { get; set; }
}

...

var a = new A();
var foo = "bar";
if(a?.PropertyOfA != foo) {
   //somecode
}

¿Qué hace exactamente?

Author: Marcos Dimitrio, 2015-02-05

3 answers

Es el condicional nulo operadora. Básicamente significa:

"Evalúe el primer operando; si es null, stop, con un resultado de null. De lo contrario, evalúe el segundo operando (como un acceso miembro del primer operando)."

En su ejemplo, el punto es que si a es null, entonces a?.PropertyOfA evaluará a null en lugar de lanzar una excepción-entonces comparará esa referencia null con foo (usando la sobrecarga de cadena ==), encontrará que no son equal y execution entrarán en el cuerpo de la declaración if.

En otras palabras, es así:{[19]]}

string bar = (a == null ? null : a.PropertyOfA);
if (bar != foo)
{
    ...
}

... excepto que a solo se evalúa una vez.

Tenga en cuenta que esto también puede cambiar el tipo de la expresión. Por ejemplo, considere FileInfo.Length. Esa es una propiedad de type long, pero si la usas con el operador condicional nulo, terminas con una expresión de type long?:

FileInfo fi = ...; // fi could be null
long? length = fi?.Length; // If fi is null, length will be null
 284
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-23 16:01:09

Puede ser muy útil al aplanar una jerarquía y/o mapear objetos. En lugar de:

if (Model.Model2 == null
  || Model.Model2.Model3 == null
  || Model.Model2.Model3.Model4 == null
  || Model.Model2.Model3.Model4.Name == null)
{
  mapped.Name = "N/A"
}
else
{
  mapped.Name = Model.Model2.Model3.Model4.Name;
}

Se puede escribir como (misma lógica que la anterior)

mapped.Name = Model.Model2?.Model3?.Model4?.Name ?? "N/A";

DotNetFiddle.Net Ejemplo De Trabajo.

(el ?? ¿o el operador coalescente nulo es diferente al ? o null operador condicional ).

También se puede usar fuera de los operadores de asignación con Action. En lugar de

Action<TValue> myAction = null;

if (myAction != null)
{
  myAction(TValue);
}

Se puede simplificar a:

myAction?.Invoke(TValue);

DotNetFiddle Ejemplo :

Usando el Sistema;

public class Program
{
  public static void Main()
  {
    Action<string> consoleWrite = null;

    consoleWrite?.Invoke("Test 1");

    consoleWrite = (s) => Console.WriteLine(s);

    consoleWrite?.Invoke("Test 2");
  }
}

Resultado:

Prueba 2

 38
Author: Erik Philips,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-30 23:14:50

Esto es relativamente nuevo para C#, lo que nos facilita llamar a las funciones con respecto a los valores null o non-null en el encadenamiento de métodos.

La antigua forma de lograr lo mismo era:

var functionCaller = this.member;
if (functionCaller!= null)
    functionCaller.someFunction(var someParam);

Y ahora se ha hecho mucho más fácil con solo:

member?.someFunction(var someParam);

Le recomiendo encarecidamente que lo lea aquí:

Https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/null-conditional-operators

 1
Author: Zeeshan Adil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-04 06:11:40