! — оператор (допускающий значение NULL) (справочник по C#)
Статья
Унарный оператор постфикса ! — это оператор null-forgiving, или null-подавление. В контексте заметки с включенным значением NULL используется оператор null-forgiving для подавления всех предупреждений, допускающих значение NULL для предыдущего выражения. Унарный префиксный оператор ! является оператором логического отрицания. Оператор, допускающий NULL, ни на что не влияет во время выполнения. Он влияет только на статический анализ потока компилятора путем изменения состояния NULL выражения. Во время выполнения выражение x! сравнивается с результатом базового выражения x.
Один из вариантов использования оператора, допускающего значение NULL, — тестирование логики проверки аргументов. Например, рассмотрим следующий класс.
C#
#nullable enablepublicclassPerson
{
publicPerson(string name) => Name = name ?? thrownew ArgumentNullException(nameof(name));
publicstring Name { get; }
}
[TestMethod, ExpectedException(typeof(ArgumentNullException))]
publicvoidNullNameShouldThrowTest()
{
var person = new Person(null!);
}
Без оператора, допускающего значение NULL, компилятор создает следующее предупреждение для предыдущего кода: Warning CS8625: Cannot convert null literal to non-nullable reference type. Используя оператор, допускающий значение NULL, вы сообщаете компилятору, что передача null ожидается и что о ней не нужно предупреждать.
Вы также можете использовать оператор с прощения null, если определенно известно, что выражение не может быть null , но компилятор не может распознать это. В следующем примере, если IsValid метод возвращает, его аргумент не true является nullи его можно безопасно разыменовать:
C#
publicstaticvoidMain()
{
Person? p = Find("John");
if (IsValid(p))
{
Console.WriteLine($"Found {p!.Name}");
}
}
publicstaticboolIsValid(Person? person)
=> person isnotnull && person.Name isnotnull;
Без оператора, допускающего значение NULL, компилятор создает следующее предупреждение для кода p.Name: Warning CS8602: Dereference of a possibly null reference.
Если метод можно изменить IsValid , можно использовать атрибут NotNullWhen для информирования компилятора о том, что аргумент IsValid метода не может быть при null возврате trueметода:
C#
publicstaticvoidMain()
{
Person? p = Find("John");
if (IsValid(p))
{
Console.WriteLine($"Found {p.Name}");
}
}
publicstaticboolIsValid([NotNullWhen(true)] Person? person)
=> person isnotnull && person.Name isnotnull;
В предыдущем примере не требуется использовать оператор с прощания null, так как компилятор имеет достаточно сведений, чтобы узнать, что p не может находиться null внутри инструкции if . См. сведения об атрибутах, позволяющих указать дополнительную информацию о состоянии NULL для переменной, в руководстве по включению в API атрибутов для определения ожидаемых значений NULL.
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Отзыв о .NET
.NET — это проект с открытым исходным кодом. Выберите ссылку, чтобы оставить отзыв:
Присоединитесь к серии встреч для создания масштабируемых решений искусственного интеллекта на основе реальных вариантов использования с другими разработчиками и экспертами.