在这行代码中运行:
FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();
这两个问号是什么意思,是某种三元运算符吗?在谷歌里很难查到。
在这行代码中运行:
FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();
这两个问号是什么意思,是某种三元运算符吗?在谷歌里很难查到。
当前回答
两个问号(??)表示它是一个联合运算符。
合并运算符返回链中的第一个非空值。你可以看到这段youtube视频,它实际演示了整个事情。
但让我补充一下视频中的内容。
如果你看到联合的英文意思,它会说“巩固在一起”。例如,下面是一个链接四个字符串的简单合并代码。
因此,如果str1为空,它将尝试str2,如果str2为空,则将尝试str3,依此类推,直到找到具有非空值的字符串。
string final = str1 ?? str2 ?? str3 ?? str4;
简单来说,合并运算符返回链中的第一个非NULL值。
其他回答
这是三元运算符的短手。
FormsAuth = (formsAuth != null) ? formsAuth : new FormsAuthenticationWrapper();
或者对于那些不做三元的人:
if (formsAuth != null)
{
FormsAuth = formsAuth;
}
else
{
FormsAuth = new FormsAuthenticationWrapper();
}
注:
我已经阅读了这篇文章和其他许多文章,但我找不到像这样彻底的答案。
由此,我完全理解了“为什么要使用?何时使用?以及如何使用?”
资料来源:
Craig McMurtry发布的Windows通信基础为0-672-32948-4
可为空的值类型
有两种常见的情况,人们想知道值已分配给值类型的实例。第一种是当实例表示数据库中的值时。在这种情况下,希望能够检查实例以确定数据库中是否确实存在值。另一种与本书主题更相关的情况是,当实例表示从某个远程源接收的数据项时。同样,人们希望从实例中确定是否接收到该数据项的值。
.NETFramework2.0包含了一个通用类型定义,它提供了这样的情况,即希望为值类型的实例分配null,并测试该实例的值是否为null。该泛型类型定义是System.Nullable<T>,它将可以替换T的泛型类型参数约束为值类型。从System.Nullable<T>构造的类型的实例可以赋值为null;实际上,它们的值默认为空。因此,从System.Nullable<T>可以称为可为null的值类型。System.Nullable<T>具有一个属性Value,通过该属性值分配给如果实例的值不为空,则可以获得由其构造的类型。因此,可以这样写:
System.Nullable<int> myNullableInteger = null;
myNullableInteger = 1;
if (myNullableInteger != null)
{
Console.WriteLine(myNullableInteger.Value);
}
C#编程语言为声明类型提供了缩写语法由System.Nullable<T>构造。该语法允许缩写:
System.Nullable<int> myNullableInteger;
to
int? myNullableInteger;
编译器将防止试图以以下方式将可空值类型的值分配给普通值类型:
int? myNullableInteger = null;
int myInteger = myNullableInteger;
它阻止人们这样做,因为可为null的值类型可能具有null值,在这种情况下它实际上具有null值并且该值不能分配给普通值类型。尽管编译器将允许该代码,
int? myNullableInteger = null;
int myInteger = myNullableInteger.Value;
第二条语句将导致引发异常,因为如果类型为从System.Nullable<T>构造的函数未分配有效值T,在本例中未发生这种情况。
结论:
将可为null的值类型的值分配给普通值类型的一种适当方法是使用System.nullable<T>.HasValue属性来确定是否已将有效值T分配给可为null值类型:
int? myNullableInteger = null;
if (myNullableInteger.HasValue)
{
int myInteger = myNullableInteger.Value;
}
另一种选择是使用此语法:
int? myNullableInteger = null;
int myInteger = myNullableInteger ?? -1;
如果为普通整数myInteger分配了有效整数值,则为其分配可空整数“myNullableInteger”的值;否则,myInteger的值为-1。
只是因为还没有人说过这个神奇的词:它是空合并运算符。它在C#3.0语言规范的第7.12节中定义。
它非常方便,特别是因为它在表达式中多次使用时的工作方式。形式的表达式:
a ?? b ?? c ?? d
将给出表达式a的结果,如果它是非空的,否则尝试b,否则尝试c,否则尝试d。它在每个点都短路。
此外,如果d的类型不可为null,则整个表达式的类型也不可为空。
两个问号(??)表示它是一个联合运算符。
合并运算符返回链中的第一个非空值。你可以看到这段youtube视频,它实际演示了整个事情。
但让我补充一下视频中的内容。
如果你看到联合的英文意思,它会说“巩固在一起”。例如,下面是一个链接四个字符串的简单合并代码。
因此,如果str1为空,它将尝试str2,如果str2为空,则将尝试str3,依此类推,直到找到具有非空值的字符串。
string final = str1 ?? str2 ?? str3 ?? str4;
简单来说,合并运算符返回链中的第一个非NULL值。
它是空合并运算符。
http://msdn.microsoft.com/en-us/library/ms173224.aspx
是的,几乎不可能搜索,除非你知道它叫什么!:-)
编辑:这是另一个问题的一个很酷的特点。你可以把它们拴起来。
C#的隐藏功能?