gpt4 book ai didi

c# - 了解空合并运算符 (??)

转载 作者:太空狗 更新时间:2023-10-29 17:58:26 26 4
gpt4 key购买 nike

我有一个自定义 WebControl它实现了一个 .Value返回 Nullable

的 getter/setter

这是一个客户端过滤文本框(TextBox 的子类,包含 javascript 和一些用于设置/获取值的服务器端逻辑)

这是该控件的 getter 和 setter:

public decimal? Value
{
get
{
decimal amount = 0;
if (!decimal.TryParse(this.Text, NumberStyles.Currency, null, out amount))
{
return null;
}
else
{
return amount;
}
}
set
{
if (!value.HasValue)
{
this.Text = "";
}
else
{
this.Text = string.Format("${0:#,##0.00}", value);
}
}
}

我看到的问题是这条语句的输出:

decimal Amount = uxAmount.Value ?? 0M;

uxAmount.Value 时,我看到金额被设置为“0”返回 10000。

这如我所料(请原谅外壳的变化):

decimal? _Amount = uxAmount.Value;
decimal amount = _Amount ?? 0;

在调用 Linq2Sql 数据上下文中定义的 UDF 函数以及空合并运算符时,我也看到了这种行为(最近),也就是说,我知道我的 UDF 调用返回了预期值,但我得到的是 RHS 值。

更让我困惑的是,如果我在 watch 中评估 uxAmount.Value,我得到 10000 类型的 Nullable<decimal> .

以下是我尝试过的一些表达方式:

decimal? _Amount = uxAmount.Value; //10000
decimal amount = _Amount ?? 0; //10000
decimal amount2 = _Amount ?? 0M; //10000
decimal Amount = uxAmount.Value ?? 0M; //0

然后我在上面的4之后加了这个表达式

decimal amount3 = (uxTaxAmount.Value) ?? 0M;

现在

decimal Amount = uxAmount.Value ?? 0M; //10000
decimal amount3 = (uxAmount.Value) ?? 0M; //0

好像最后一次调用总是0,但是uxAmount.Value的值(根据上面的 getter/setter 使用 .TextTryParse 中解析出来是稳定的。我在断点处停止,没有其他线程可以操纵此值。

注意使用 M 后缀强制常量为十进制,因为它是整数,我怀疑是类型转换问题。

有什么想法吗?

LHS 和 RHS 的值似乎稳定且已知。

--edit-- 一些来自 VS2010 的屏幕截图

Stepping through the code showing the value of amount3

Watch dialog and some more detail about state of variables

最佳答案

(这个答案是根据我上面的评论构建的。)

您确定调试器向您正确显示了此内容吗?您是否尝试过进一步降低一些行以确保您拥有 amount3 的更新值?

我确定这只是调试器的问题。有时你必须更进一步。也许翻译后的代码 (IL) 有一些优化会混淆调试器(或者我会知道什么)。但是如果没有调试器,该值将在您期望的时候准确更新。

我见过其他有经验的开发人员对类似情况感到困惑,所以我知道在查看对局部变量的赋值时,调试器有时会落后“一行代码”。也许有人可以找到讨论该链接的链接?

关于c# - 了解空合并运算符 (??),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11960732/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com