在这行代码中运行:
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
其他回答
这个运算符称为空合并运算符。如果操作数不为空,则返回左侧操作数;否则返回右手操作数。
int? variable1 = null;
int variable2 = variable1 ?? 100;
如果variable1不为空,则将variable2设置为variable1的值;否则,如果variable1==null,则将variable2设置为100。
仅供消遣(知道你们都是C#家伙;-)。
我认为它起源于Smalltalk,在那里它已经存在了很多年。其定义如下:
在对象中:
? anArgument
^ self
在UndefinedObject(也称为nil的类)中:
? anArgument
^ anArgument
这既有评估版(?),也有非评估版本(??)。它经常出现在惰性初始化的私有(实例)变量的getter方法中,在真正需要之前,这些变量保持为零。
这是三元运算符的短手。
FormsAuth = (formsAuth != null) ? formsAuth : new FormsAuthenticationWrapper();
或者对于那些不做三元的人:
if (formsAuth != null)
{
FormsAuth = formsAuth;
}
else
{
FormsAuth = new FormsAuthenticationWrapper();
}
这没什么危险。事实上,它很美。如果需要,可以添加默认值,例如:
CODE
int x = x1 ?? x2 ?? x3 ?? x4 ?? 0;
接合运算符
相当于
FormsAuth = formsAUth == null ? new FormsAuthenticationWrapper() : formsAuth