在这行代码中运行:
FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();
这两个问号是什么意思,是某种三元运算符吗?在谷歌里很难查到。
在这行代码中运行:
FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();
这两个问号是什么意思,是某种三元运算符吗?在谷歌里很难查到。
当前回答
它是一个空合并运算符,其工作方式与三元运算符类似。
a ?? b => a !=null ? a : b
另一个有趣的点是,“可为null的类型可以包含值,也可以是未定义的”。因此,如果尝试将可为null的值类型分配给不可为null值类型您将得到一个编译时错误。
int? x = null; // x is nullable value type
int z = 0; // z is non-nullable value type
z = x; // compile error will be there.
所以要使用??操作员:
z = x ?? 1; // with ?? operator there are no issues
其他回答
仅供消遣(知道你们都是C#家伙;-)。
我认为它起源于Smalltalk,在那里它已经存在了很多年。其定义如下:
在对象中:
? anArgument
^ self
在UndefinedObject(也称为nil的类)中:
? anArgument
^ anArgument
这既有评估版(?),也有非评估版本(??)。它经常出现在惰性初始化的私有(实例)变量的getter方法中,在真正需要之前,这些变量保持为零。
接合运算符
相当于
FormsAuth = formsAUth == null ? new FormsAuthenticationWrapper() : formsAuth
其他人已经很好地描述了空合并运算符。在需要对null进行一次测试的情况下,缩短的语法??=可以增加可读性。
传统空测试:
if (myvariable == null)
{
myvariable = new MyConstructor();
}
使用空合并运算符,这可以写成:
myvariable = myvariable ?? new MyConstructor();
其也可以用缩短的语法编写:
myvariable ??= new MyConstructor();
有些人觉得它更易读、简洁。
这是三元运算符的短手。
FormsAuth = (formsAuth != null) ? formsAuth : new FormsAuthenticationWrapper();
或者对于那些不做三元的人:
if (formsAuth != null)
{
FormsAuth = formsAuth;
}
else
{
FormsAuth = new FormsAuthenticationWrapper();
}
这个运算符称为空合并运算符。如果操作数不为空,则返回左侧操作数;否则返回右手操作数。
int? variable1 = null;
int variable2 = variable1 ?? 100;
如果variable1不为空,则将variable2设置为variable1的值;否则,如果variable1==null,则将variable2设置为100。