关于C#:什么是??操作符?

What is the “??” operator for?

本问题已经有最佳答案,请猛点这里访问。

我在想关于C#代码中的??符号。它是用来干什么的?我该如何使用它呢?

int?呢?它是一个可以为空的int吗?

参见:

?? Null Coalescing Operator —> What does coalescing mean?


它是空合并运算符。它是在C 2中引入的。

如果不为空,则表达式a ?? b的结果为a,否则为b。除非需要,否则不会对b进行评估。

两件好事:

  • 表达式的整体类型是第二个操作数的类型,这在使用可为空的值类型时很重要:

    1
    2
    int? maybe = ...;
    int definitely = maybe ?? 10;

    (请注意,不能将不可为空的值类型用作第一个操作数-它将是毫无意义的。)

  • 关联性规则意味着您可以很容易地将其链接起来。例如:

    1
    string address = shippingAddress ?? billingAddress ?? contactAddress;

这将使用发货地址、帐单地址或联系人地址中的第一个非空值。


它被称为"空合并运算符",工作原理如下:

而不是:

1
2
int? number = null;
int result = number == null ? 0 : number;

你现在可以做:

1
int result = number ?? 0;


这是合并运算符。它本质上是以下内容的简写

1
2
x ?? new Student();
x != null ? x : new Student();

有关操作员的msdn文档

  • http://msdn.microsoft.com/en-us/library/ms173224.aspx


这是一个快捷方式:

1
Text = (category == null ?"Home" : category);

这是新的空合并运算符。

这个??如果左操作数不为空,则返回左操作数,否则返回右操作数。

您可以在这里阅读:http://msdn.microsoft.com/en-us/library/ms173224(vs.80).aspx


它是凝聚运算符。如果第一个值为空,则返回另一个值

1
2
3
4
string value1 = null;
string value2 ="other";

string value3 = value1 ?? value2; // assigns"other" to value 3


它检查类别是否为空-在这种情况下,空值将替换为"home"。


如果类别为空,文本将变为"主页"


我最喜欢使用的一个空合并操作符是避免代码中的if语句(我认为if语句很难看,而且大多数时候都会把事情搞得乱七八糟)。例如,在一个典型的场景中,如果可用,可以选择从缓存加载某些内容,否则从数据库加载并填充缓存。

1
2
3
4
5
6
7
8
9
10
private SomeData GetData() {
    var data = HttpRuntime.Cache.Get("key") as SomeData;

    if (data == null) {
        data = DAL.GetData(some parameters...);
        HttpRuntime.Cache.Add("key", data, ....);
    }

    return data;
}

对我来说,这是一个丑陋的准则。我可能有点不太明白,但为什么不改为重构它呢?

1
2
3
4
5
6
7
8
9
10
private SomeData GetDataAndCache() {
    var data = DAL.GetData(some parameters...);
    HttpRuntime.Cache.Add("key", data, ....);
    return data;
}

private SomeData GetData() {
    var data = HttpRuntime.Cache.Get("key") as SomeData;
    return data ?? GetDataAndCache();
}

它更接近SRP,更清洁,更容易阅读,IMO。功能执行一个明确可识别的功能。


返回第一个非空值。手巧。


??空合并运算符

int?是一个可以为空的int,这意味着它可以有一个正常int和null的值。阅读此了解详细信息。


这是空合并运算符。它与可以为空的类型一起使用(除其他之外,抱歉:)