Это - пустой оператор объединения, и вполне как троичное (непосредственный - если) оператор. См. также ?? Оператор - MSDN.
FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();
расширяется до:
FormsAuth = formsAuth != null ? formsAuth : new FormsAuthenticationWrapper();
, который далее расширяется до:
if(formsAuth != null)
FormsAuth = formsAuth;
else
FormsAuth = new FormsAuthenticationWrapper();
На английском языке, это означает, "Если то независимо от того, что налево, не является пустым, используйте это, иначе используйте то, что направо".
Примечание, что можно использовать любое количество их в последовательности. Следующее утверждение присвоит первый непустой указатель Answer#
Answer
(если все Ответы будут пустыми тогда эти Answer
, является пустым):
string Answer = Answer1 ?? Answer2 ?? Answer3 ?? Answer4;
Также это стоит упомянуть, в то время как расширение выше концептуально эквивалентно, результат каждого выражения только оценен однажды. Это важно, если, например, выражение является вызовом метода с побочными эффектами. (Кредит к @Joey для указания на это.)
Вот список рекомендуемых тегов в Visual Studio, и вот список примеров C #, многие из которых должны содержать XML-документы. Одним из примеров загрузки C # является "XMLDoc", и файл readme из него начинается со следующего ...
Образец документации XML
В этом примере показано, как использовать XML для код документа.