#c# #dereference
#c# #разыменование
Вопрос:
Я читаю описание новой функции в C # 8 под названием nullable ссылочные типы. В описании обсуждается так называемый оператор, прощающий нуль. В примере в описании говорится об отмене ссылки на экземпляр ссылочного типа (я так думаю):
Вы также можете использовать оператор, прощающий нуль, когда вы точно знаете, что выражение не может быть нулевым, но компилятору не удается это распознать. В следующем примере, если
IsValid
метод возвращает true, его аргумент не равен null, и вы можете безопасно разыменовать его:
public static void Main() { Person? p = Find("John"); if (IsValid(p)) { Console.WriteLine($"Found {p!.Name}"); } } public static bool IsValid(Person? person) { return person != null amp;amp; !string.IsNullOrEmpty(person.Name); }
Без оператора, прощающего нуль, компилятор генерирует
следующее предупреждение дляp.Name
кода: ПредупреждениеCS8602
: разыменование
, возможно, нулевой ссылки.
У меня создалось впечатление, что в C # разыменование объекта означает установку для него значения null. Но похоже, что Microsoft называет доступ к свойству объекта разыменованием объекта.
Вопрос в том, что означает термин разыменования в C #, когда мы говорим об экземплярах ссылочного типа, а не об управляемых и неуправляемых указателях.
Комментарии:
1. Вопрос: c # разыменование объекта означает присвоение ему значения null. О: Нет, абсолютно нет. «Разыменование объекта» означает «получение переменной, на которую указывает указатель»: learn.microsoft.com/en-us/dotnet/csharp/language-reference /. … И да, «разыменование» применяется к «экземплярам ссылочного типа».
2. @paulsm4 Я бы сказал, что это такой же хороший ответ, как и любой другой, вы должны переместить его в ответ, чтобы получить представление :-).
Ответ №1:
Разыменование означает следование ссылке для доступа к фактическому базовому объекту. Если ссылка есть null
, это вызывает большую проблему.
Комментарии:
1. Здравствуйте. Какую проблему мы можем получить, если ссылка равна null? Можете ли вы дать мне несколько ссылок, где можно прочитать об этом?
2. @ВладимирБереза Это приведет к исключению NullReferenceException: learn.microsoft.com/en-us/dotnet/api/… Исключение NullReferenceException выдается при попытке получить доступ к элементу типа, значение которого равно
null
.3. @NielsR. Спасибо. Конечно, я знаю об исключении NullReferenceException и о том, как его предотвратить. Но Джоэл Коэхорн сказал о большой проблеме. Возможно, он имел в виду что-то другое в некоторых сценариях.