Эта функция была в Spec#. Они по умолчанию применяли нулевые ссылки и использовали! для указания непустых значений. Это было потому, что они хотели обратной совместимости.
На языке моей мечты (из которого я, вероятно, был бы единственным пользователем!) Я бы сделал тот же выбор, что и вы, по умолчанию не имеет значения по умолчанию.
Я также сделал бы незаконным использование. оператор по ссылке с нулевым значением (или что-нибудь еще, что бы разыменовать ее). Как бы вы их использовали? Сначала вам придется преобразовать их в не-nullables. Как бы вы это сделали? Проверяя их на null.
В Java и C# оператор if
может принимать только тестовое выражение bool
. Я бы продлить его принять имя обнуляемого ссылочной переменной:
if (myObj)
{
// in this scope, myObj is non-nullable, so can be used
}
Этот специальный синтаксис будет неудивителен для программистов C/C++. Я бы предпочел специальный синтаксис, подобный этому, чтобы было ясно, что мы делаем проверку, которая изменяет тип имени myObj
в ветке правды.
Я хотел бы добавить еще немного сахара:
if (SomeMethodReturningANullable() into anotherObj)
{
// anotherObj is non-nullable, so can be used
}
Это как раз дает имя anotherObj
в результате выражение слева от into
, поэтому он может быть использован в объеме, где его действует.
Я бы сделал то же самое для оператора ?:
.
string message = GetMessage() into m ? m : "No message available";
Обратите внимание, что string message
не является обнуляемой, но так являются двумя возможными результатами вышеуказанного теста, так что присвоение значения.
И тогда, возможно, немного сахара для предположительно общего случая подставляя значение нуля:
string message = GetMessage() or "No message available";
Очевидно or
только будет правомерно применяться к обнуляемому типу с левой стороны, и не- с нулевым значением с правой стороны.
(я бы также иметь встроенное понятие собственности для полого экземпляра;. Компилятор генерирует метод IDisposable.Dispose
автоматически, и синтаксис ~Destructor
будет использоваться для увеличения Dispose
, точно так, как в C++/CLI)
SpeC# был другой синтаксической расширение связано с не-nullables, в связи с проблемой обеспечения того, чтобы не-nullables были правильно инициализированы во время строительства:
class SpecSharpExampleClass
{
private string! _nonNullableExampleField;
public SpecSharpExampleClass(string s)
: _nonNullableExampleField(s)
{
}
}
другими словами, вы должны инициализировать поля в так же, как вы бы назвали другие конструкторы wit h base
или this
- если вы, конечно, не инициализируете их непосредственно рядом с объявлением поля.
Возможный дубликат [Лучшее объяснение для языков без пустых] (http://stackoverflow.com/questions/3989264/best-explanation-for-languages-without-null) – nawfal