将 HasValue 重写为 ??运营商

发布于 2024-11-17 03:40:20 字数 215 浏览 3 评论 0原文

重写以下代码是否安全:

bool b = foo.bar.HasValue ? foo.bar.Value : false;

其中

bool b = foo.bar.Value ?? false;

bar 是可空类型 bool?

Is it safe to rewrite the following code:

bool b = foo.bar.HasValue ? foo.bar.Value : false;

to

bool b = foo.bar.Value ?? false;

where bar is the nullable type bool?

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

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

发布评论

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

评论(8

笨死的猪 2024-11-24 03:40:20

最简单的修复

bool b = foo.bar.GetValueOrDefault();

实际上也比 .Value 更便宜,因为它省略了 has-value 检查。它将默认为 default(T) ,这里确实是 false (它只是返回底层 T 字段的值,没有任何检查根本没有)。

如果您需要与 default(T) 不同的默认值,则:

var value = yourNullable.GetValueOrDefault(yourPreferredValue);

The easiest fix there is

bool b = foo.bar.GetValueOrDefault();

which is also actually cheaper than .Value as it omits the has-value check. It will default to default(T) , which is indeed false here (it just returns the value of the underlying T field, without any checks at all).

If you need a different default to default(T), then:

var value = yourNullable.GetValueOrDefault(yourPreferredValue);
梦纸 2024-11-24 03:40:20

您想要的是:

bool b = foo.bar ?? false;

这是(令人惊讶的)安全的,并且是空合并运算符的预期用途。

??运算符称为空合并运算符,用于定义可为空值类型以及引用类型定义默认值。如果左侧操作数不为空,则返回;否则返回正确的操作数。

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

对于 Nullable,它在功能上等同于 Nullable.GetValueOrDefault(T defaultValue)

代码:

bool b = foo.bar.Value ?? false;

将导致编译器错误,因为您无法将运算符应用于值类型,并且 Nullable.Value 始终返回值类型(或者在没有值时抛出异常)。

What you want is:

bool b = foo.bar ?? false;

This is (surprisingly) safe and an intended use for the null-coalescing operator.

The ?? operator is called the null-coalescing operator and is used to define a default value for a nullable value types as well as reference types. It returns the left-hand operand if it is not null; otherwise it returns the right operand.

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

In the case of Nullable<T>, it is functionally equivalent to Nullable<T>.GetValueOrDefault(T defaultValue).

The code:

bool b = foo.bar.Value ?? false;

Will cause a compiler-error, because you cannot apply the operator to value types, and Nullable<T>.Value always returns a value-type (or throws an exception when there is no value).

╰つ倒转 2024-11-24 03:40:20

不——这不安全。

则该行:

bool b = foo.bar.Value ?? false;

如果 foo.bar 没有值,

将抛出 InvalidOperationException。相反,使用

var b = foo.bar ?? false;

Update - 我刚刚从其他答案中了解到 .GetValueOrDefault(); - 这看起来是一个非常好的使用建议!


更新 2 - @ProgrammingHero 的答案也是正确的(添加了 +1!) - 该行:

bool b = foo.bar.Value ?? false

实际上不会编译 - 因为 Error 50 Operator '??'不能应用于“bool”和“bool”类型的操作数

No - this is not safe.

The line:

bool b = foo.bar.Value ?? false;

will throw an InvalidOperationException if foo.bar has no value.

Instead use

var b = foo.bar ?? false;

Update - I just learned about .GetValueOrDefault(); from the other answers - that looks like a very good suggestion to use!


Update 2 - @ProgrammingHero's answer is also correct (+1 added!) - the line:

bool b = foo.bar.Value ?? false

actually won't compile - because of Error 50 Operator '??' cannot be applied to operands of type 'bool' and 'bool'

谜泪 2024-11-24 03:40:20

没有。

Value 属性返回一个值,如果
一个被分配,否则一个
System.InvalidOperationException 是
抛出。

来自: http://msdn.microsoft.com /en-us/library/1t3y8s4s%28v=vs.80%29.aspx

因此,如果 hasValue 为 false,那么您将在第二个中抛出异常当你尝试运行它时。

Nope.

The Value property returns a value if
one is assigned, otherwise a
System.InvalidOperationException is
thrown.

From: http://msdn.microsoft.com/en-us/library/1t3y8s4s%28v=vs.80%29.aspx

So if hasValue is false then you will get an exception thrown in your second one when you try to run it.

梦过后 2024-11-24 03:40:20

ffoo.bar ?? false 使用起来会更安全

ffoo.bar ?? false would be more safer to use

坐在坟头思考人生 2024-11-24 03:40:20
bar.Value ?? false

有编译错误,因为 ?? 的左操作数运算符应该是引用类型或可为空类型。

bar.Value ?? false

has compilation error, because left operand of ?? operator should be of reference or nullable type.

给不了的爱 2024-11-24 03:40:20

也许您也看过 Stackoverflow 中的这篇文章 - 这是一个优雅的 obj 样式的 null 检查。 IfNotNull(lambdaExpression) - 如果 obj 不为 null,则返回所需的对象,否则返回 null(但不会引发异常)。

如果您要访问引用的实体,我将它与实体框架一起使用,例如

var str=Entity1.Entity2.IfNotNull(x=>x.EntityDescription) ?? string.Empty 

返回包含在由 Entity1 引用的 Entity2 中的 EntityDescription -如果任何对象 Entity1Entity2null,则为空字符串。如果没有 IfNotNull 你会得到一个又长又难看的表达式。

扩展方法 IfNotNull 定义如下:

public static TOut IfNotNull<TIn, TOut>(this TIn v, Func<TIn, TOut> f)
    where TIn : class 
    where TOut: class
{
    if (v == null) return null; else return f(v);
}

更新:
如果将代码更新到C# 版本 6.0(.NET Framework 4.6 - 但似乎支持较旧的框架 4. x 也),有一个新的运算符可以使此任务变得简单:“elvis”运算符 ?.

它的工作原理如下:

var str=(Entity1.Entity2?.EntityDescription) ?? string.Empty 

在这种情况下,如果 Entity2null,则计算停止,并且 (...) 变为 null代码> - 之后是<代码>?? string.empty 部分用 string.Empty 替换 null。换句话说,它的工作方式与 .IfNotNull(...) 相同。

Maybe you have a look at this article in Stackoverflow too - it is an elegant null checking in the style obj.IfNotNull(lambdaExpression) - returning the object you want if obj is not null otherwise just null (but without throwing an exception).

I used it with the Entity Framework if you're accessing a referenced entity, e.g.

var str=Entity1.Entity2.IfNotNull(x=>x.EntityDescription) ?? string.Empty 

which returns EntityDescription contained in Entity2 which is referenced by Entity1 - or an empty string if any object Entity1 or Entity2 is null. Without IfNotNull you would get a long and ugly expression.

The extension method IfNotNull is defined there as follows:

public static TOut IfNotNull<TIn, TOut>(this TIn v, Func<TIn, TOut> f)
    where TIn : class 
    where TOut: class
{
    if (v == null) return null; else return f(v);
}

Update:
If you update the code to C# version 6.0 (.NET Framework 4.6 - but seems to support older frameworks 4.x too), there is a new operator available which makes this task easy: The "elvis" operator ?..

It works as follows:

var str=(Entity1.Entity2?.EntityDescription) ?? string.Empty 

In this case, if Entity2 is null, evaluation stops and (...) becomes null - after which the ?? string.empty part replaces null by string.Empty. In other words, it works the same way as .IfNotNull(...) would.

树深时见影 2024-11-24 03:40:20

foo.bar.Value 当有一个值时表示不可为 null 的值,如果没有实际值,则抛出 InvalidOperationException

foo.bar.Value represents the non-nullable value when there is one, and throws an InvalidOperationException if there’s no real value.

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