Esta característica estaba en Spec#. ¡Dejaron de forma predeterminada referencias anulables y se usaron! para indicar no-nulables. Esto fue porque querían compatibilidad con versiones anteriores.
En mi lenguaje de ensueño (del cual probablemente sería el único usuario!) Tomaría la misma decisión que usted, que no admite nulos por defecto.
También haría ilegal el uso de. operador en una referencia anulable (o cualquier otra cosa que lo desreferencia). Cómo los usarías? Tendría que convertirlos primero a no nulables. ¿Cómo harías esto? Probándolos para null.
En Java y C#, la instrucción if
solo acepta una expresión de prueba bool
. Me extiendo a aceptar el nombre de una variable de referencia anulable:
if (myObj)
{
// in this scope, myObj is non-nullable, so can be used
}
Esta sintaxis especial sería sorprendente que los programadores de C/C++. Prefiero una sintaxis especial como esta para dejar en claro que estamos haciendo un control que modifica el tipo del nombre myObj
dentro de la rama de verdad.
me gustaría añadir un poco más de azúcar:
if (SomeMethodReturningANullable() into anotherObj)
{
// anotherObj is non-nullable, so can be used
}
Esto sólo da el nombre anotherObj
al resultado de la expresión de la izquierda de la into
, por lo que se pueden utilizar en el ámbito donde es válida.
Haría el mismo tipo de cosas para el operador ?:
.
string message = GetMessage() into m ? m : "No message available";
Nota que string message
no es anulable, pero también lo son los dos posibles resultados de la prueba anterior, por lo que la asignación es el valor.
Y entonces tal vez un poco de azúcar para el caso de suponer común de sustituir un valor de nulo:
string message = GetMessage() or "No message available";
Obviamente or
solamente se aplicaría de forma válida a un tipo anulable en el lado izquierdo, y un no nullable en el lado derecho.
(También me tienen incorporado un concepto de propiedad para los campos de instancia;. El compilador generaría el método IDisposable.Dispose
de forma automática, y la sintaxis ~Destructor
sería utilizado para aumentar Dispose
, exactamente igual que en C++/CLI)
SpeC# tenía otra extensión sintáctica relacionado con los no nullables, debido al problema de asegurar que no nullables habían sido inicializado correctamente durante la construcción:
class SpecSharpExampleClass
{
private string! _nonNullableExampleField;
public SpecSharpExampleClass(string s)
: _nonNullableExampleField(s)
{
}
}
en otras palabras, usted tiene que inicializar los campos de la de la misma manera que llamarías a otros constructores con base
o this
- a menos que, por supuesto, los inicialice directamente junto a la declaración de campo.
posible duplicado de [La mejor explicación para idiomas sin nulo] (http://stackoverflow.com/questions/3989264/best-explanation-for-languages-without-null) – nawfal