在这行代码中运行:
FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();
这两个问号是什么意思,是某种三元运算符吗?在谷歌里很难查到。
在这行代码中运行:
FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();
这两个问号是什么意思,是某种三元运算符吗?在谷歌里很难查到。
当前回答
其他人已经很好地描述了空合并运算符。在需要对null进行一次测试的情况下,缩短的语法??=可以增加可读性。
传统空测试:
if (myvariable == null)
{
myvariable = new MyConstructor();
}
使用空合并运算符,这可以写成:
myvariable = myvariable ?? new MyConstructor();
其也可以用缩短的语法编写:
myvariable ??= new MyConstructor();
有些人觉得它更易读、简洁。
其他回答
仅供消遣(知道你们都是C#家伙;-)。
我认为它起源于Smalltalk,在那里它已经存在了很多年。其定义如下:
在对象中:
? anArgument
^ self
在UndefinedObject(也称为nil的类)中:
? anArgument
^ anArgument
这既有评估版(?),也有非评估版本(??)。它经常出现在惰性初始化的私有(实例)变量的getter方法中,在真正需要之前,这些变量保持为零。
?? 当值为null时,为可为null的类型提供值。因此,如果formsAuth为空,它将返回新的FormsAuthenticationWrapper()。
以最简单的方式,两个问号被称为“合并运算符”,它返回链中的第一个非空值。
例如,如果您从一个不可为null的变量中的可为null对象获取值,则可以使用此运算符。即
int a=1;整数?b=空;a=b??0;
上述方程的结果将为零,因为b为空,我们使用了??运算符,这意味着当且仅当b为空时,它将返回0。
int a=1;整数?b=15;a=b??0;
在上式中,a将得到值“15”,因为b具有有效值且不为空。还有,你不能使用??运算符。
在以上示例中,我使用了??0,但是,在??之后也可以使用一个完整的新公式??操作人员
例如a=b??(x==1?10:15)我希望这能澄清你的问题。
FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();
相当于
FormsAuth = formsAuth != null ? formsAuth : new FormsAuthenticationWrapper();
但它很酷的一点是,你可以像其他人说的那样,把它们拴起来。没有提到的一点是,您实际上可以使用它来抛出异常。
A = A ?? B ?? throw new Exception("A and B are both NULL");
如果您熟悉Ruby,那么它的||=似乎类似于C#的??给我。这是一些红宝石:
irb(main):001:0> str1 = nil
=> nil
irb(main):002:0> str1 ||= "new value"
=> "new value"
irb(main):003:0> str2 = "old value"
=> "old value"
irb(main):004:0> str2 ||= "another new value"
=> "old value"
irb(main):005:0> str1
=> "new value"
irb(main):006:0> str2
=> "old value"
在C#中:
string str1 = null;
str1 = str1 ?? "new value";
string str2 = "old value";
str2 = str2 ?? "another new value";