现在 c# 中是否有任何速记可以减少以下代码:
var testVar1 = checkObject();
if (testVar1 != null)
{
testVar2 = testVar1;
}
在这种情况下,如果 testVar1 在 CheckObject(( 结果中不为空,则只想分配 testVar2(testVar2 有一个将触发代码的 setter(。试图思考如何使用零合并的东西,但没有真正解决。
添加到此testVar2的setter上有代码要触发,因此如果值为null,则不希望testVar2设置为任何内容。
public MyObj testVar2
{
get { return _testVar2; }
set
{
_testVar2 = value;
RunSomeCode();
}
}
有一对!
三元运算符:
testvar2 = testVar1 != null ? testvar1 : testvar2;
将是完全相同的逻辑。
或者,如前所述,您可以使用空合并运算符:
testVar2 = testVar1 ?? testVar2
(虽然现在也被评论了(
或者第三种选择:编写一次方法并按照自己喜欢的方式使用它:
public static class CheckIt
{
public static void SetWhenNotNull(string mightBeNull,ref string notNullable)
{
if (mightBeNull != null)
{
notNullable = mightBeNull;
}
}
}
并称之为:
CheckIt.SetWhenNotNull(test1, ref test2);
问题的答案,但我用谷歌搜索了">c# 速记集如果为 null">并首先降落在这里,所以只是为了其他人。问题是"如果不是空则分配值的简写",以下是"如果空则分配值的简写"。
在 C# 8.0+ 中,您可以使用??=
:
// Assign testVar1 to testVar2, if testVar2 is null
testVar2 ??= testVar1;
// Which is the same as:
testVar2 = testVar2 ?? testVar1;
// Which is the same as:
if(testVar2 == null)
{
testVar2 = testVar1;
}
而我最喜欢的:
// Create new instance if null:
testVar1 ??= new testClass1();
// Which is the same as:
if(testVar1 == null)
{
testVar1 = new testClass1();
}
只是我经常使用的一个例子:
List<string> testList = null;
// Add new test value (create new list, if it's null, to avoid null reference)
public void AddTestValue(string testValue)
{
testList ??= new List<string>();
testList.Add(testValue);
}
您可以使用 null 合并运算符,如下所示:testVar2 = testVar1 ?? testVar2
.如果 null,您可以将?? testVar2
替换为要设置的任何内容testVar1
。
你提到testVar2
有一个二传手,当它被设置时会触发一些事件。如果不检查testVar2
是否设置为自身,则事件仍将使用 null 合并运算符(或三元运算符(触发。
我认为你要么必须检查testVar2
是否在其设置器中被设置为自己,要么做你现在正在做的事情。
public MyObj testVar2
{
get { return _testVar2; }
set
{
if (_testVar2 != value)
{
_testVar2 = value;
RunSomeCode();
}
}
}
我认为这完全是我的意见,但我会把它留在你现在拥有它的方式。我认为它比短手更好地传达了意图。
testVar2 = testVar1 ?? tesrVar2
说,"testVar2
设置为testVar1
。除非testVar1
为空。然后将testVar2
设置为 testVar2
"。
if (testVar1 != null)
{
testVar2 = testVar1;
}
说:"如果testVar1
不为空,请将testVar2
设置为 testVar1
"。
如果你永远不想允许 testVar2 设置为 null
,那么在 setter 本身中检查null
可能更有意义。否则,您必须记住在尝试设置时检查null
。
请注意,我还修改了大小写以符合 C# 标准
private MyObj testVar2;
public MyObj TestVar2
{
get { return testVar2; }
set
{
if (value == null) return; // Or throw an ArgumentNullException
if (testVar2 == value) return; // No need to RunSomeCode if the value isn't changing
testVar2 = value;
RunSomeCode();
}
}
现在,如果您仍然关心在设置属性之前检查null
(例如,如果您决定在 null
值的情况下抛出异常(,那么您的原始代码没有任何问题(三元/空合并解决方案似乎以某种方式"浪费",因为它们可能会为自己设置一些东西(,您可以在一行中完成:
if (testVar1 != null) SomeClass.TestVar2 = testVar1;
但是,如果您只是为了捕获调用 CheckObject()
的结果而创建testVar1
,那么 null 合并运算符更有意义,因为您不必创建变量来存储值:
SomeClass.TestVar2 = CheckObject() ?? SomeClass.TestVar2;