所以我们有三元运算符.大!然后是??运算符,它对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)
是否有可能实现一种尽可能容易使用的方法,甚至是某种类似于聚结的算子?
考虑下面的例子。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) 在 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??运算符?
我有这个代码:
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部分?
比方说,我有以下简化类型:
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) 我在java中搜索了一段相同的C#'nullable',发现最接近的方法之一是使用包装类; 现在我想知道java中的c#null coalescing运算符(??)是否相等?(当然除了普通的'if'陈述)
我写了这段代码:
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或我错过了什么?该程序似乎行为正确......
编辑 - >看我的答案
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
从 PHP7 开始,空合并运算符( $a ?? $b) 表示isset($a) ? $a : $b。
在我的代码中,我经常将兼性变量从控制器传递到视图,如果未传递该变量,我需要在视图中设置默认值。
我想要这样的东西:($someVar ??= 42不工作)这意味着$someVar = $someVar ?? 42.
是否有这样的快捷方式可以做到这一点,还是我必须坚持使用长版本?(是的,我知道,没那么长,但是懒人就会偷懒)。
Python具有很好的空合并语法:
c = a or b
Run Code Online (Sandbox Code Playgroud)
设置c为aif 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,第二个给出按位|(或)运算符。
结果,我有两个问题:
a or b?两者的答案似乎都没有,但这令我有些惊讶。
python null-coalescing-operator null-coalescing python-3.x nonetype