NRT ! vs ?
От: vaa https://www.youtube.com/playlist?list=PLtrvASfI1KW7VOYRKjglcagQzWLoxlncl
Дата: 09.03.22 03:29
Оценка:
В чем преимущество, если оно есть:
List<FooBar>? fooList = FooListFactory.GetFooList();

FooBar fooBar = fooList!.Find(f => f.Name=="Bar")!;


перед:
FooBar? fooBar = fooList?.Find(f => f.Name=="Bar");


источник

Два ? заменили на два !.
Причем во 2-м случае мы явно будем извлекать Value из контейнера.
А в 1-м просто подавили предупреждение.
Re: NRT ! vs ?
От: Ночной Смотрящий Россия  
Дата: 09.03.22 07:11
Оценка: +1
Здравствуйте, vaa, Вы писали:

vaa>источник

vaa>Два ? заменили на два !.
vaa>Причем во 2-м случае мы явно будем извлекать Value из контейнера.
vaa>А в 1-м просто подавили предупреждение.

Странный вопрос. В первом случае мы просто отключили анализ (поведение на 100% идентично #nullable disable), во втором анализ не отключен.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re: NRT ! vs ?
От: _NN_ www.nemerleweb.com
Дата: 09.03.22 09:49
Оценка: 10 (1) +2
vaa>Два ? заменили на два !.
vaa>Причем во 2-м случае мы явно будем извлекать Value из контейнера.
vaa>А в 1-м просто подавили предупреждение.

Так генерируется разный код.
SharpLab

// Оригинальный код
    public void Suppress() {
        string? a = "";
        _ = a!.Contains("a");
    }
    
// Результат компиляции
    public void Suppress()
    {
        "".Contains("a");
    }

// Оригинальный код
    public void Check() {
        string? a = "";
        _ = a?.Contains("a");
    }

// Результат компиляции
    public void Check()
    {
        if ("" != null)
        {
            "".Contains("a");
        }
    }
}
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: NRT ! vs ?
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.03.22 13:25
Оценка: +1
Здравствуйте, vaa, Вы писали:

vaa>В чем преимущество, если оно есть:


А тебя не смущает, что в первом случае тип "FooBar?", а во втором "FooBar"?

Это уже должно натолкнуть на мысли. Нет?

Подумай как может оказаться тип "FooBar", если искомого объекта в списке не будет? Как только ты задумаешься, к тебе сразу придет правильный ответ и ты не будешь задавать глупых вопросов на форуме.

"!" — это не проверка, а утверждение. Аналог ассерта. Ты просто затыкаешь типизатор и он не анализируя принимает твою версию о том, что в переменной точно будет значение. Но если ты не прав, в рантайме такой код грохнет.

"?" — это ратнтайм-проверка. См. декомпилят приведенный _NN_-ом.
http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: NRT ! vs ?
От: vaa https://www.youtube.com/playlist?list=PLtrvASfI1KW7VOYRKjglcagQzWLoxlncl
Дата: 13.03.22 02:49
Оценка:
Здравствуйте, VladD2, Вы писали:


VD>"!" — это не проверка, а утверждение. Аналог ассерта. Ты просто затыкаешь типизатор и он не анализируя принимает твою версию о том, что в переменной точно будет значение. Но если ты не прав, в рантайме такой код грохнет.


он грохнет в любом случае, т.к. fooList = null
хоть с ! хоть без.
проверка все равно нужна, по-моему смысла никакого вводить ! нет.
тут нет ассерта, грохнет при обращении к fooBar, а не при обращении к Find.
простое отключение предупреждений. полезно только если глобально включен Nullable.

https://devblogs.microsoft.com/dotnet/nullable-reference-types-in-csharp/

судя по всему хотели как лучше(требовать инициализации и запрет обнуления после)
без иммутабельности на всю глубину св-в объекта бесполезное занятие.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.