“??”是什么? 运算符为?

发布于 2024-07-19 09:18:10 字数 320 浏览 11 评论 0原文

我想知道 C# 代码中的 ?? 符号。 它是做什么用的? 我该如何使用它?

int 怎么样?? 它是一个可为 null 的 int 吗?

也可以看看:

? 空合并运算符 —> 合并是什么意思?

I was wondering about ?? signs in C# code. What is it for? And how can I use it?

What about int?? Is it a nullable int?

See also:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(12

像你 2024-07-26 09:18:10

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

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

两件好事:

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

    <前><代码>int? 也许= ...;
    int 肯定 = 也许? 10;

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

  • 关联性规则意味着您可以非常轻松地链接它。 例如:

    字符串地址 = 送货地址 ??   帐单地址 ??   联系地址; 
      

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

It's the null coalescing operator. It was introduced in C# 2.

The result of the expression a ?? b is a if that's not null, or b otherwise. b isn't evaluated unless it's needed.

Two nice things:

  • The overall type of the expression is that of the second operand, which is important when you're using nullable value types:

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

    (Note that you can't use a non-nullable value type as the first operand - it would be
    pointless.)

  • The associativity rules mean you can chain this really easily. For example:

    string address = shippingAddress ?? billingAddress ?? contactAddress;
    

That will use the first non-null value out of the shipping, billing or contact address.

2024-07-26 09:18:10

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

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

现在可以执行以下操作:

int result = number ?? 0;

It's called the "null coalescing operator" and works something like this:

Instead of doing:

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

You can now just do:

int result = number ?? 0;
桃气十足 2024-07-26 09:18:10

这就是合并运算符。 它本质上是以下

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

关于运算符

That is the coalesce operator. It essentially is shorthand for the following

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

MSDN Documentation on the operator

宁愿没拥抱 2024-07-26 09:18:10

这是新的 Null Coalesce 运算符。

这 ?? 如果左侧操作数不为空,则运算符返回左侧操作数,否则返回右侧操作数。

你可以在这里读到它:
http://msdn.microsoft.com/en-us/库/ms173224(VS.80).aspx

It's the new Null Coalesce operator.

The ?? operator returns the left-hand operand if it is not null, or else it returns the right operand.

You can read about it here:
http://msdn.microsoft.com/en-us/library/ms173224(VS.80).aspx

小嗲 2024-07-26 09:18:10

它是以下功能的快捷方式:

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

It is a shortcut for:

Text = (category == null ? "Home" : category);
我是男神闪亮亮 2024-07-26 09:18:10

它是合并运算符。 如果第一个值为 null,它将返回另一个值

string value1 = null;
string value2 = "other";

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

it's the coalesce operator. it will return another value if the first value is null

string value1 = null;
string value2 = "other";

string value3 = value1 ?? value2; // assigns "other" to value 3
等待圉鍢 2024-07-26 09:18:10

它检查类别是否为空 - 如果是这种情况,空值将被“Home”替换。

it checks if category is null - when this is the case the null value is replaced by "Home".

话少情深 2024-07-26 09:18:10

我最喜欢的空合并运算符的用途之一是避免代码中的 if 语句(我认为 if 语句很丑陋,而且大多数时候只会让事情变得混乱)。 例如,采用一种典型的场景,如果可用,人们可能会选择从缓存加载某些内容,否则从数据库加载并填充缓存。

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;
}

对我来说,这是丑陋的代码。 我可能有点肛门,但为什么不将其重构为这个呢?

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,并且更清晰、更易于阅读。 这些功能各自执行一个明确可识别的功能。

One of my favorite uses for the null coalescing operator is to avoid if statements in my code (I think if statements are ugly and just clutter things up most times). For example, take a typical scenario where one might choose to load something from cache if available, otherwise load from the db and populate the cache.

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;
}

To me, that's ugly code. I may be a bit anal, but why not refactor it to this instead?

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();
}

It more closely follows SRP and is cleaner and easier to read, IMO. The functions perform exactly one clearly identifiable function each.

葬﹪忆之殇 2024-07-26 09:18:10

如果类别为空,文本将变为“Home”

if category is null, Text will become "Home"

纵性 2024-07-26 09:18:10

返回第一个非空值。 便利。

Returns the first not-null value. Handy.

悲欢浪云 2024-07-26 09:18:10

?? 空合并运算符

int? 是一个可空 int,这意味着它可以具有普通 int 和 null 的值。
有关详细信息,请阅读

?? Null-Coalescing Operator

int? is a nullable int, which means it can have the values of a normal int and null.
Read this for details.

烟─花易冷 2024-07-26 09:18:10

这就是空合并运算符。 它与 可空类型(除其他外)一起使用, 对不起 :)

That's the null-coalescing operator . It's used with nullable types (among other things, sorry :)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文