¿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?
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
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);
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
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í:
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