Tag: null coalescing operator

Null-Coallescing运算符 – 为什么选择铸造?

任何人都可以请告诉我为什么以下第一个语句抛出编译错误而第二个不抛出? NewDatabase.AddInParameter(NewCommand, “@SomeString”, DbType.String, SomeString ?? DBNull.Value); // <– Throws compilation error! NewDatabase.AddInParameter(NewCommand, "@SomeString", DbType.String, (object)(SomeString) ?? DBNull.Value); // <– Compiles! 我尝试过其他可以为空的类型,比如byte? 并得到了相同的结果。 任何人都可以告诉我为什么我需要先投射到物体?

如何在linq中处理空列表等空列表?

下面是一些linqpad测试代码。 当它运行时出错是因为“item”的第二个实例具有子项的空列表而不是空列表。 我想以完全相同的方式处理这两种情况(空或空列表),但我想知道是否有一种更简洁的方法,而不仅仅是在列表上进行空检查,并在存在空值时初始化空列表。 换句话说,我可以这样做: from si in (i.subitems == null ? new List() : i.subitems) 但那有点难看,我想知道我怎么能改进呢? public class item { public string itemname { get; set; } public List subitems { get; set; } } void Main() { List myItemList = new List() { new item { itemname = “item1”, subitems = new List() { […]

无效合并算子的使用不当?

myFoo = myFoo ?? new Foo(); 代替 if (myFoo == null) myFoo = new Foo(); 我是否认为第一行代码始终执行赋值是正确的? 另外,这是空合并运算符的错误用法吗?

C#中的空合并运算符(??)是否是线程安全的?

以下代码中是否存在可能导致NullReferenceException的竞争条件? – 要么 – 在空合并运算符检查空值之后但在调用函数之前,是否可以将Callback变量设置为null? class MyClass { public Action Callback { get; set; } public void DoCallback() { (Callback ?? new Action(() => { }))(); } } 编辑 这是一个出于好奇而产生的问题。 我通常不会这样编码。 我并不担心Callback变量会变得陈旧。 我担心从DoCallback抛出exception。 编辑#2 这是我的class级: class MyClass { Action Callback { get; set; } public void DoCallbackCoalesce() { (Callback ?? new Action(() => { }))(); […]

右侧的三元/空合并运算符和赋值表达式?

在C#中尝试使用三元和空合并运算符时,我发现可以在表达式的右侧使用赋值,例如,这是一个有效的C#代码: int? a = null; int? b = null; int? c = a ?? (b = 12); int? d = a == 12 ? a : (b = 15); 奇怪的是,不仅表达式右侧的赋值被评估到它自己的右侧(意味着这里的第三行被评估为12而不是像b = 12 => void ),但是此赋值也有效,因此在一个语句中分配了两个变量。 也可以使用任何可用变量在此赋值的右侧使用任何可计算表达式。 这种行为在我看来很奇怪。 我记得if (a = 2)而不是if (a == 2)在C ++中的比较时遇到麻烦,它总是被评估为true ,这是从Basic / Haskell切换到C ++之后的常见错误。 它是一个记录的function吗? 它有什么名字吗?

否定null-coalescing运算符

我有一堆字符串我需要使用.Trim(),但它们可以为null。 如果我可以这样做,那将更加简洁: string endString = startString !?? startString.Trim(); 如果左侧的部分为非null,则基本上返回右侧的部分,否则只返回空值。 我刚刚使用了三元运算符,但是为了这个目的,无论如何都使用空合并运算符?

在您看来,什么更具可读性? (运营商)或使用if

我有一个接收string的方法,但在我使用它之前,我必须将它转换为int 。 有时它可以为null ,我必须将其值更改为”0″ 。 今天我有: public void doSomeWork(string value) { int SomeValue = int.Parse(value ?? “0”); //it can throw an exception(i know) } 我做到了,但我的老板让我重构它: public void doSomeWork(string value) { if(string.IsNullOrEmpty(value)) value = “0”; int SomeValue = int.Parse(value); } 在您看来,什么是最好的选择?

在可空类型上使用coalescing null运算符更改隐式类型

我希望接下来的三行代码是相同的: public static void TestVarCoalescing(DateTime? nullableDateTime) { var dateTimeNullable1 = nullableDateTime.HasValue ? nullableDateTime : DateTime.Now; var dateTimeNullable2 = nullableDateTime != null ? nullableDateTime : DateTime.Now; var dateTimeWhatType = nullableDateTime ?? DateTime.Now; } 在所有情况下,我将nullableDateTime分配给新变量。 我希望所有变量的类型都成为DateTime? 因为那是nullableDateTime的类型。 但令我惊讶的是, dateTimeWhatType的类型只是DateTime ,因此不可为空。 更糟糕的是,ReSharper建议用空合并表达式替换第二个语句,将其转换为表达式3.因此,如果我让ReSharper做它的事情,变量的类型将从DateTime?改变DateTime? 到DateTime 。 事实上,让我们说在方法的其余部分,我会使用 if (someCondition) dateTimeNullable2 = null; 这将编译得很好,直到我让ReSharper用空合并版本替换第二个表达式。 AFAIK,取代 somevar != null ? somevar : […]

null合并运算符是否将结果缓存在c#中

我知道做(myValue ?? new SomeClass())类似于(myValue == null ? new SomeClass() : myValue) 但出于好奇,当我调用一个函数时,是否有任何性能优势,比如说(getResult() ?? new SomeClass()) 。 getResult()会被执行两次吗? 这似乎不直观,因为我只指定了一次方法调用。

Null在调用链中合并

如果我有一长串对象,每个对象都有可能在“Linq where”子句中返回null,例如 SomeSource.Where(srcItem=>(srcItem.DataMembers[“SomeText”].Connection.ConnectedTo as Type1).Handler.ForceInvocation == true)); 索引器可以返回null,“as”运算符可以返回null。 对象可能没有连接(即属性为null)。 如果在任何地方遇到null,我希望where子句为被评估的项返回“false”。 相反,它以null引用exception中止。 在我看来,这将被设计为在单个C#表达式中表达。 我不喜欢创建一个多行语句或为它创建一个单独的函数。 我是否缺少使用空合并运算符?