标签: null-coalescing-operator

理解空合并运算符(??)

我有一个自定义WebControl,它实现了一个.Value返回Nullable <decimal> 的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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

decimal Amount = uxAmount.Value ?? 0M;
Run Code Online (Sandbox Code Playgroud)

uxAmount.Value返回10000 时,我看到Amount被设置为"0" .

这符合我的预期(原则是套管的变化):

decimal? _Amount = uxAmount.Value;
decimal amount = _Amount ?? 0;
Run Code Online (Sandbox Code Playgroud)

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

c# nullable null-coalescing-operator

9
推荐指数
1
解决办法
935
查看次数

是C#'??' 操作员线程安全?

每个人都知道这不是线程安全的:

public StringBuilder Builder
{
    get 
    {
        if (_builder != null)
            _builder = new StringBuilder();
        return _builder; 
    }
}
Run Code Online (Sandbox Code Playgroud)

那这个呢?

public StringBuilder Builder
{
    get { return _builder ?? (_builder = new StringBuilder()); }
}
Run Code Online (Sandbox Code Playgroud)

.net c# thread-safety null-coalescing-operator

8
推荐指数
3
解决办法
1992
查看次数

Null Coalescing Operator的使用不当?

myFoo = myFoo ?? new Foo();
Run Code Online (Sandbox Code Playgroud)

代替

if (myFoo == null) myFoo = new Foo();
Run Code Online (Sandbox Code Playgroud)

我是否认为第一行代码将始终执行赋值?此外,这是否使用空合并运算符?

c# null-coalescing-operator

8
推荐指数
2
解决办法
638
查看次数

C# ??null合并运算符问题

我已将Class Person属性Birthday定义为空的DateTime?,那么为什么空融合运算符不应该在以下示例中起作用?

cmd.Parameters.Add(new SqlParameter("@Birthday",
   SqlDbType.SmallDateTime)).Value =       
     person.Birthday ?? DBNull.Value; 
Run Code Online (Sandbox Code Playgroud)

我得到的编译器错误是"操作员'??' 不能应用于'System.DateTime?'类型的操作数 和'System.DBNull'"

以下也出现了编译错误:

cmd.Parameters.Add(new SqlParameter("@Birthday", 
  SqlDbType.SmallDateTime)).Value = 
   (person.Birthday == null) ? person.Birthday:DBNull.Value;
Run Code Online (Sandbox Code Playgroud)

我按照Refactor的建议添加了一个强制转换为(对象),然后编译,但是没有正常工作,并且在两种情况下,值都存储在sqlserver db中为null.

SqlDbType.SmallDateTime)).Value =       
         person.Birthday ?? (object)DBNull.Value;
Run Code Online (Sandbox Code Playgroud)

有人能解释一下这里发生了什么吗?

我需要使用以下笨拙的代码:

   if (person.Birthday == null) 
    cmd.Parameters.Add("@Birthday", SqlDbType.SmallDateTime).Value 
      = DBNull.Value;
     else cmd.Parameters.Add("@Birthday", SqlDbType.SmallDateTime).Value = 
          person.Birthday;
Run Code Online (Sandbox Code Playgroud)

c# dbnull null-coalescing-operator

8
推荐指数
2
解决办法
4263
查看次数

Null Coalescing Operator的替代方案

使用Java,为了安全地访问深层嵌套引用 a.b.c.d.e,我们通常必须在每个级别指定空检查或包装Optional并使用orElse().(与Kotlin/C#等语言a?.b?.c?.d?.e或类似作品不同.

我想知道以下帮助方法是否是一个合理的替代方法:

public <T> T valueOrNull(Supplier<T> expression) {
    try {
        return expression.get();
    } catch (NullPointerException e) {
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后可以安全地使用它value = valueOrNull(() -> a.b.c.d.e).

注意:据我所知,NullPointerException由于性能原因等原因,捕获s通常是不受欢迎的,但是想知道这里的用法是否是一个合理的例外.

java null nullpointerexception null-coalescing-operator

8
推荐指数
1
解决办法
1682
查看次数

如何为布尔条件取消合并?

我正试着安全地检查一下IList<>是不是空的.

var Foo = Bar.GimmeIListT(); // Returns an IList<SomeObject>
if (Foo?.Any())
    // Do cool stuff with items in Foo
Run Code Online (Sandbox Code Playgroud)

但是条件有错误:

不能隐含地转换'bool?' 'bool'.存在显式转换(您是否错过了演员?)

因此,似乎条件评估为可空的布尔,所以我尝试

if (Foo?.Any().Value())
Run Code Online (Sandbox Code Playgroud)

但这也不好:

'bool'不包含'Value'的定义,也没有扩展.... blah blah blah

因此,在第一种情况下,它抱怨它是一个可以为空的布尔,但在第二种情况下,它抱怨它不是.

作为另一种途径,我尝试:

if (Foo?.Any() == true)
Run Code Online (Sandbox Code Playgroud)

这有效 - 但它不应该因为这使用了第一条消息说它不想要的隐式转换!

到底是怎么回事?这样做的正确方法是什么?

c# null-coalescing-operator

8
推荐指数
1
解决办法
2794
查看次数

Visual Studio 2019 + ReSharper 智能感知无法识别 JavaScript 中的空合并运算符 (??)

将 Visual Studio 2019 与 ReSharper(均为最新版本)一起使用,我无法获得智能感知来停止抱怨 ECMAScript 2020 功能,例如空合并运算符 (??)。

该代码有效,但编辑器认为这是一个错误,这很烦人。这是我看到的:

截屏

我尝试在 VS 中将项目的 TypeScript Build ECMAScript 版本设置为 ECMAScript 2020:ReSharper ECMAScript 版本设置为“实验性”。有没有人设法让这个工作?

resharper null-coalescing-operator javascript-intellisense visual-studio-2019

8
推荐指数
0
解决办法
152
查看次数

C#聚结算子的原子性

我今天在代码库中遇到了一些单例代码,我不确定以下是否是线程安全的:

public static IContentStructure Sentence{ 
    get {
       return _sentence ?? (_sentence = new Sentence()); 
    }
}
Run Code Online (Sandbox Code Playgroud)

该陈述相当于:

if (_sentence != null) {
       return _sentence;
}
else {
    return (_sentence = new Sentence());
}
Run Code Online (Sandbox Code Playgroud)

我相信 ??只是一个编译器技巧,结果代码仍然不是原子的.换句话说,在将_sentence设置为新句子并返回之前,两个或多个线程可以找到_sentence为null.

为了保证原子性,我们必须锁定那段代码:

public static IContentStructure Sentence{ 
    get {

       lock (_sentence) { return _sentence ?? (_sentence = new Sentence()); }
    }
}
Run Code Online (Sandbox Code Playgroud)

那一切都正确吗?

c# atomic null-coalescing-operator

7
推荐指数
2
解决办法
634
查看次数

C# ??null合并运算符LINQ

当我使用LINQ将XML文件解析为自定义对象时,我试图阻止具有NULL值.

我在Scott Gu的博客上找到了一个很好的解决方案,但由于某些原因它对我的整数不起作用.我想我使用了相同的语法,但似乎我错过了一些东西.哦,由于某种原因,当节点不为空时它可以工作.

下面是我的代码的摘录.

List<GrantAgresso> lsResult = (from g in xml.Element("root").Elements("Elementname")
        select new GrantAgresso()
        {
             Year = (int?)g.Element("yearnode") ?? 0,
             Subdomain = (string)g.Element("domainnode") ?? ""
        }).ToList();
Run Code Online (Sandbox Code Playgroud)

错误消息是:

输入字符串的格式不正确.

如果有人知道我做错了什么,请帮忙:)

编辑:一块XML(奇怪的名字,但它不是选择)

<Agresso>
  <AgressoQE>
    <r3dim_value>2012</r3dim_value>
    <r0r0r0dim_value>L5</r0r0r0dim_value>
    <r7_x0023_province_x0023_69_x0023_V005>0</r7_x0023_province_x0023_69_x0023_V005>
    <r7_x0023_postal_code_x0023_68_x0023_V004 />
    <r7_x0023_country_x0023_67_x0023_V003>1004</r7_x0023_country_x0023_67_x0023_V003>
    <r7_x0023_communitydistrict_x0023_70_x0023_V006>0</r7_x0023_communitydistrict_x0023_70_x0023_V006>
  </AgressoQE>
</Agresso>
Run Code Online (Sandbox Code Playgroud)

c# xml linq null-coalescing-operator

7
推荐指数
1
解决办法
1511
查看次数

如何将可为空的DateTime强制转换为UTC DateTime

我正在读回DateTime?从我看来的价值.现在我检查一下NextUpdateDateTime?HasValue如果是这样,将时间转换为UTC.

从阅读起来看来,我似乎需要使用a null coalescing operator但是我的任务告诉我System.NUllable不包含ToUniversalTime()使用该运算符时的定义.

我在SO上搜索了类似的问题,但没有运气.

题:

如何将null DateTime值转换为UTC?

码:

我只是检查DateTime?有一个值,如果是这样,将DateTie转换为UTC -

            if (escalation.NextUpdate.HasValue)
            { 
                escalation.NextUpdate = escalation.NextUpdate ?? escalation.NextUpdate.ToUniversalTime(); 
            }
            else
            {
                escalation.NextUpdate = null;
            }
Run Code Online (Sandbox Code Playgroud)

NextUpdate在模型中的属性:

    public DateTime? NextUpdate { get; set; }
Run Code Online (Sandbox Code Playgroud)

c# model-view-controller datetime nullable null-coalescing-operator

7
推荐指数
2
解决办法
4355
查看次数