Я наткнулся на интересный сайт, на котором рассматриваются некоторые из новых (предлагаемых) функций C# 6.0. Вы можете прочитать его здесь: Probable C# 6.0 features.Monadic null check in C# 6.0
То, что я нахожу особенно интересным, является монадическая нулевая проверка (также известная как оператор распространения нуля ...). По данным сайта, следующий оператор
var bestValue = points?.FirstOrDefault()?.X ?? -1;
содержит монадическое проверку нулевой, которая в настоящее время реализуется с этим фрагментом кода:
if (points != null)
{
var next = points.FirstOrDefault();
if (next != null && next.X != null) return next.X;
}
return -1;
Мой первый взгляд был, эй, что щеколда написано Вот? Но, посмотрев на «старый» код, мне начинает нравиться.
Однако у меня также возникают вопросы, которые я хотел бы задать.
- Я предполагаю, что этот оператор, несущий нуль, является потокобезопасным. Но как это происходит? Исключить условия гонки или они сохраняются?
Как этот оператор будет обрабатывать общие типы? Более того, как бы это касалось неограниченных родовых типов? Например, рассмотрит
var resultAfterNullCheck = x?.Y;
Если типа Y здесь создаются с ссылочными типами, ненулевыми типами значений и обнуляемыми типами значений, то не было бы ничего разумно сделать (так как я не могу думать о том, что делать, так как Я просто не знаю, что делать). Итак, есть ли дефолт, который будет возвращен? Или это вызовет ошибку?
При взгляде на пример, который предоставляет сайт (и который я скопировал выше), я предполагаю, что одним из основных преимуществ оператора NULL-распространения является то, что он будет оценивать оператор только один раз. Однако (возможно, из-за моего незнания CLR), мне очень любопытно, как это можно выполнить.
Что касается меня, то первая оценка (если точки равны нулю) должна инициировать метод расширения FirstOrDefault() для запуска, когда точки не являются нулевыми, а затем оценка возвращаемого типа должна быть нулевой или нет, если нет, X будут возвращены. Значит, это три оценки в сочетании с одной? Или я понимаю это неправильно? Это повлияет на скорость исполнения?
Другими словами, что будет быстрее, старый способ выполнения нулевых проверок или этот новый прекрасный оператор? Я попытаюсь изучить это, выполнив некоторые исследования, как только будет завершена загрузка Visual Studio 2015 ... Но это требует некоторого терпения ...
Есть ли какие-либо мысли по этому новому типу оператора? Это действительно все еще предлагаемый вариант, или мы действительно можем рассчитывать на работу с этой новой монадической нулевой проверкой?
EDIT
Как Мэтью Уотсон предоставил хороший MSDN article обсуждение этого (и более) темы (ы), мне было интересно, если он упомянул мой предыдущий вопрос о неограниченных дженерик и как этот оператор имеет дело с этим. К сожалению, я еще не нашел ответа. Хотя я буду предполагать, что программист должен попытаться предотвратить использование неконституционных дженериков, я все же могу предположить, что это иногда невозможно. Если это так, будет ли необходимость в редизайне?
Теперь он называется [«Null условный оператор»] (http://blogs.msdn.com/b/csharpfaq/archive/2014/11/20/new-features-in-c-6.aspx). –
Здесь вы найдете много информации https://roslyn.codeplex.com/discussions/540883. – adrianm
@MatthewWatson 'if (MyEvent! = Null) MyEvent (this, EventArgs.Empty);' является хорошо известным примером того, что должно быть переписано как «var myEvent = MyEvent; if (myEvent! = null) myEvent (this, EventArgs.Empty); ': даже если доступ к' MyEvent' является атомарным, он может меняться от ненулевого значения до нуля между сравнением и вызовом. Это то, что «MyEvent» .Invoke (this, EventArgs.Empty); 'должен обращаться уже, как я понимаю. – hvd