标签: null-coalescing-operator

试一试(如"??"或三元运算符)

所以我们有三元运算符.大!然后是??运算符,它对nullable变量进行合并.

例:

string emptyIfNull = strValue ?? "";
Run Code Online (Sandbox Code Playgroud)

问题:是否可以为try-catch实现这样的简单运算符?

例:

string result = CoalesceException(someExpression, "");

public static T CoalesceException<T>(expression, defaultValue)
{
    try
    {
        return evaluate expression; // ?
    }
    catch
    {
        return defaultValue;
    }
}
Run Code Online (Sandbox Code Playgroud)

是否有可能实现一种尽可能容易使用的方法,甚至是某种类似于聚结的算子?

c# exception null-coalescing-operator

6
推荐指数
1
解决办法
1997
查看次数

为什么 PHP 的空合并运算符 (??) 不能处理具有不同可见性的类常量?

考虑下面的例子。a类有private const SOMETHING,b类有protected const SOMETHING

class a {
    private const SOMETHING = 'This is a!';

    public static function outputSomething() {
        return static::SOMETHING ?? self::SOMETHING;
    }
}

class b extends a {
    protected const SOMETHING = 'This is b!';
}

echo (new b())::outputSomething();
Run Code Online (Sandbox Code Playgroud)

输出:

This is b!
Run Code Online (Sandbox Code Playgroud)

但是现在如果我注释掉SOMETHING类 b 中的定义,则会引发错误:

class a {
    private const SOMETHING = 'This is a!';

    public static function outputSomething() {
        return static::SOMETHING ?? self::SOMETHING;
    }
}

class b extends a …
Run Code Online (Sandbox Code Playgroud)

php visibility constants null-coalescing-operator php-7

6
推荐指数
1
解决办法
990
查看次数

更改此条件,使其不总是评估为“假”

在 SonarQube 的分析过程中,我们看到了许多此警告的示例

更改此条件,使其不总是评估为“假”;一些后续代码永远不会执行。

所以发生这种情况的一个例子是 - 对于给定的代码......


    if (components?.ContainsKey(machineType) ?? false)
    {
        return components[machineType];
    }

    throw new ArgumentException($"There is no available configuration for {machineType}!");
Run Code Online (Sandbox Code Playgroud)

……我们得到……

在此处输入图片说明

我们正在使用 C# null 合并来快捷地进行空检查,以便提供components是一个字典,不是null,并且components 确实包含由machineType我们指定的键,然后我们返回components字典中machineType键的值。

否则,如果 components为 null,或者如果 Dictionary包含键,则表达式计算为false并且我们不进入块并返回值,而是抛出异常。

请有人解释为什么 SonarQube 抱怨这个。如果我们重写它以使用空检查和&&ing的“老式”冗长风格,那么 SonarQube 就是一个快乐的兔子。

仅仅是 SonarQube 不了解??操作符吗?

还是我们只是在这样的语句中滥用?.or??运算符?

c# null-coalescing-operator sonarqube

6
推荐指数
0
解决办法
508
查看次数

C#coalesce运算符不替换null方法返回值?

我有这个代码:

MyClass _localMyClass = MyClassDAO.GetMyClassByID(123) ?? new MyClass();
Run Code Online (Sandbox Code Playgroud)

这是方法:

    public static MyClass GetMyClassByID(int id)
    {
        var query = from m in ctx.MyClass
                    where m.MyClassID == id
                    select m;

        return query.FirstOrDefault<MyClass>();
    }
Run Code Online (Sandbox Code Playgroud)

因此FirstOrDefault(),在实体框架上下文中找不到命中,这是"ctx"对象.因此,要返回的'default'值是null,因为查询的目标是一个类.

第一个代码的??结果,使用,导致_localMyClass什么?我会说它会是new MyClass().相反,_localMyClass最终为空.我尝试用各种括号分组逻辑,但仍然没有运气.

还在; 当我设置一个调试断点,并将其复制/粘贴MyClassDAO.GetMyClassByID(123) ?? new MyClass()到Visual Studio的监视屏幕时,结果是new MyClass()而不是null.

任何人都可以解释为什么它会以这种方式工作吗?为什么它不能识别方法返回值null然后使用该new部分?

c# coalesce null-coalescing-operator null-coalescing

5
推荐指数
1
解决办法
751
查看次数

如何使用CodeDOM表示null合并运算符?

比方说,我有以下简化类型:

public class Model
{
    public decimal? Result { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

如何使用CodeDOM表示空合并运算符来生成C#代码,它有可能吗?现在我正在使用以下解决方法:

new CodePropertyReferenceExpression(
    new CodePropertyReferenceExpression(modelArgument, "Result"),
        "Value"))
Run Code Online (Sandbox Code Playgroud)

这等于model.Result.Value,但不是model.Result ?? 0M

更好的解决方法

CodeExpressionequalent到model.Result.GetValueOrDefault(0M)适合于空值类型

new CodeMethodInvokeExpression(
                        new CodeMethodReferenceExpression(
                            new CodePropertyReferenceExpression(modelArgument, "Result"),
                            "GetValueOrDefault"),
                            new [] { new CodePrimitiveExpression(0m) })),
Run Code Online (Sandbox Code Playgroud)

c# codedom null-coalescing-operator

5
推荐指数
1
解决办法
851
查看次数

java中的c#null合并运算符是否相等?

我在java中搜索了一段相同的C#'nullable',发现最接近的方法之一是使用包装类; 现在我想知道java中的c#null coalescing运算符(??)是否相等?(当然除了普通的'if'陈述)

java nullable null-coalescing-operator

5
推荐指数
2
解决办法
2013
查看次数

.NET Reflector无法正确反映n​​ull合并运算符吗?

我写了这段代码:

private Queue<int> EnsureQueue()
{
    return _queue ?? (_queue = new Queue<int>(10));
}
Run Code Online (Sandbox Code Playgroud)

反射器给了我:

private Queue<int> EnsureQueue()
{
    if (this._queue == null)
    {
    }
    return (this._queue = new Queue<int>(10));
}
Run Code Online (Sandbox Code Playgroud)

显然,这不是原始代码所说的.该线(this._queue = new Queue<int>(10));总是返回a new Queue<int>(10)而不是_queue它不返回null.

这是一个错误.NET Reflector或我错过了什么?该程序似乎行为正确......

编辑 - >看我的答案

c# null-coalescing-operator null-coalescing .net-reflector

5
推荐指数
1
解决办法
204
查看次数

Elvis运算符在一个转换调用链中

elvis运算符,即null条件运算符,非常酷.

在LINQ查询中,它与null合并"??"一致很好用 运营商.

Somedata.Where(dt=>(dt?.Inner?.InnerMost?.Include=="Yes")??false);
Run Code Online (Sandbox Code Playgroud)

但是如果你需要施放中间值,你会怎么做?

对于链中的一个链接,它可以正常工作.

Somedata.Where(dt=>(
     ((InnerClass)dt?.Inner)
     ?.InnerMost)?.Include=="Yes")
     ??false);
Run Code Online (Sandbox Code Playgroud)

但是通过额外的必要施法,施法和调用被"驱散".

Somedata.Where(dt=>(
     ((InnerMostClass)            <=== Cast
     ((InnerClass)dt?.Inner)
     ?.InnerMost)?.Include=="Yes"))         <=== Use
     ??false);
Run Code Online (Sandbox Code Playgroud)

可能在这里不止一次弄乱了括号,但我希望你明白这个想法.

虽然这个"火车残骸"调用链是一种代码味道,但这样做是否有更具表现力的方式来提高简洁性和清晰度?

c# linq null-coalescing-operator c#-6.0 null-conditional-operator

5
推荐指数
1
解决办法
445
查看次数

PHP 中是否存在表示 ??= 的运算符?

从 PHP7 开始,空合并运算符( $a ?? $b) 表示isset($a) ? $a : $b

在我的代码中,我经常将兼性变量从控制器传递到视图,如果未传递该变量,我需要在视图中设置默认值。

我想要这样的东西:($someVar ??= 42不工作)这意味着$someVar = $someVar ?? 42.

是否有这样的快捷方式可以做到这一点,还是我必须坚持使用长版本?(是的,我知道,没那么长,但是懒人就会偷懒)。

null-coalescing-operator php-7

5
推荐指数
1
解决办法
3165
查看次数

Python中的多参数空值合并和内置的“或”函数

Python具有很好的空合并语法:

c = a or b
Run Code Online (Sandbox Code Playgroud)

设置caif anot not False、、Noneempty或0,否则c设置为b

(是的,从技术上讲,这不是空合并,更像是bool合并,但是对于这个问题而言,它足够接近。)

对于对象集合,没有明显的方法可以执行此操作,因此我编写了一个函数来执行此操作:

from functools import reduce

def or_func(x, y):
    return x or y

def null_coalesce(*a):
    return reduce(or_func, a)
Run Code Online (Sandbox Code Playgroud)

这行得通,但是写我自己的or_func似乎不太理想-肯定有一个内置的like __or__吗?我尝试使用object.__or__operator.__or__,但是第一个给出一个AttributeError,第二个给出按位|(或)运算符。

结果,我有两个问题:

  1. 是否有一个内置函数像a or b
  2. 是否有此类null合并函数的内置实现?

两者的答案似乎都没有,但这令我有些惊讶。

python null-coalescing-operator null-coalescing python-3.x nonetype

5
推荐指数
2
解决办法
98
查看次数