在这行代码中运行:

FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

这两个问号是什么意思,是某种三元运算符吗?在谷歌里很难查到。


当前回答

接合运算符

相当于

FormsAuth = formsAUth == null ? new FormsAuthenticationWrapper() : formsAuth

其他回答

如果您熟悉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";

以最简单的方式,两个问号被称为“合并运算符”,它返回链中的第一个非空值。

例如,如果您从一个不可为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)我希望这能澄清你的问题。

仅供消遣(知道你们都是C#家伙;-)。

我认为它起源于Smalltalk,在那里它已经存在了很多年。其定义如下:

在对象中:

? anArgument
    ^ self

在UndefinedObject(也称为nil的类)中:

? anArgument
    ^ anArgument

这既有评估版(?),也有非评估版本(??)。它经常出现在惰性初始化的私有(实例)变量的getter方法中,在真正需要之前,这些变量保持为零。

这个运算符称为空合并运算符。如果操作数不为空,则返回左侧操作数;否则返回右手操作数。

int? variable1 = null;
int variable2  = variable1 ?? 100;

如果variable1不为空,则将variable2设置为variable1的值;否则,如果variable1==null,则将variable2设置为100。

正如在众多答案中正确指出的那样,“空合并运算符”(??),说到它,您可能还想看看它的表亲“空条件运算符”(.或?[),它是一个多次与??一起使用的运算符??

空条件运算符

用于在执行成员访问(?.)或索引(?[)操作之前测试null。这些运算符可以帮助您编写更少的代码来处理null检查,尤其是在数据结构下降时。

例如:

// if 'customers' or 'Order' property or 'Price' property  is null,
// dollarAmount will be 0 
// otherwise dollarAmount will be equal to 'customers.Order.Price'

int dollarAmount = customers?.Order?.Price ?? 0; 

没有?。和这样做是

int dollarAmount = customers != null 
                   && customers.Order!=null
                   && customers.Order.Price!=null 
                    ? customers.Order.Price : 0; 

这更加冗长和麻烦。