Pregunta

¿Cree que C # apoyará algo así ?? operador =?

En lugar de esto:

if (list == null)
  list = new List<int>();

Puede ser que sea posible escribir:

list ??= new List<int>();

Ahora, podría usar (pero me parece que no está bien legibles):

list = list ?? new List<int>();
¿Fue útil?

Solución

Siempre he querido algo como esto. Yo lo uso mucho más a menudo que el ?? por sí mismo.

Lo que realmente quiero, sin embargo, es una forma de operador que le permite eliminar la referencia al objeto sólo si no nula. Para reemplazar esto:

    int count = (list != null)? list.Count : 0

con algo como esto:

    int count = list??.Count : 0

Lo que sería especialmente útil para mí con largas cadenas de referencias (mal diseño, lo sé), pero por ejemplo

    int count = foo??.bar??.baz??.list??.Count : 0

Esto no es posible en la actualidad con ?? porque sólo se puede decir "Asignar a foo, o una alternativa si nula", pero no "Asignar a un propiedad de foo, o una alternativa si nula. "

Otros consejos

En lo personal creo que sólo la segunda expansión tiene sentido (en términos de mantener a lo largo de la misma línea que += etc):

list = list ?? new List<int>();

pero para ser honesto me parece un poco innecesario. La gente por lo general "se" i += 5;, pero tienden a tener un problema con nula coalescencia (??). Añadir un operador nulo coalescencia-misiones y ... bueno, yo no lo veo terminando así.

En lo personal estoy a favor del código original:

if(list == null) { list = new List<int>(); }
....

También - tener en cuenta: en todos los demás +=, -= etc - el lado derecho siempre se evalúa. En este caso no sería (en algunos casos). Que añade aún más confusión. Por lo cual quiero decir:

i += SomethingCriticalThatMustBeCalled(); // fine - always runs
j ??= SomethingElseCriticalThatMustBeCalled(); // is this run? if j != null?

Un truco que encontré en algún lugar aquí en stackoverflow era hacer algo como esto ...

private List<string> myList;
public List<string> MyProp 
{
    get { return myList ?? (myList= new List<string>()); }
}

... es posible que pueda utilizar eval perezoso similar en su código.

me gusta - es un agradable, de forma sucinta de expresar una expresión perezosa de carga. Si es o no se agrega a la lengua es otra cosa totalmente distinta - como Eric Lippert ama señalar , las nuevas características requieren una cantidad significativa de trabajo para poner en práctica y, como tales, deben contribuir con una neta positiva significativa de la lengua con el fin de ser incluidos .

A menos que leí tu pregunta equivocada, que el operador no existe en C #: http://msdn.microsoft.com/en-us/library/ms173224 (VS.80) .aspx

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top