c# shorthand for if not null then 赋值
c# shorthand for if not null then assign value
现在c#中是否有任何shorthand可以减少以下代码:
var testVar1 = checkObject();
if (testVar1 != null)
{
testVar2 = testVar1;
}
在这种情况下,如果 CheckObject() 结果中的 testVar1 不为空,则只想分配 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);
您可以使用 null-coalescing operator,它看起来像这样:testVar2 = testVar1 ?? testVar2
。如果 testVar1
为空,您可以将 ?? testVar2
替换为您想要设置的任何内容。
您提到 testVar2
有一个 setter 会在设置时触发某些事件。如果您不检查 testVar2
是否被设置为自身,该事件仍将使用 null 合并运算符(或三元运算符)触发。
我认为您要么必须检查 testVar2
是否在其 setter 中设置为自身,要么按照您现在的操作进行。
public MyObj testVar2
{
get { return _testVar2; }
set
{
if (_testVar2 != value)
{
_testVar2 = value;
RunSomeCode();
}
}
}
我认为这完全是我的意见,但我会保留您现在的看法。我认为它比简写更能表达意图。
testVar2 = testVar1 ?? tesrVar2
说,"set testVar2
to testVar1
. Unless testVar1
is null. Then set testVar2
to testVar2
".
if (testVar1 != null)
{
testVar2 = testVar1;
}
说,"if testVar1
is not null, set testVar2
to 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
的情况下抛出异常值),那么你的原始代码就没有问题(ternary/null-coalescing 解决方案似乎 "wasteful" 不知何故,因为它们可能会为自己设置一些东西),你可以在一行中完成:
if (testVar1 != null) SomeClass.TestVar2 = testVar1;
但是,如果您创建 testVar1
只是为了捕获对 CheckObject()
的调用结果,那么 null-coalescing 运算符更有意义,因为您不必创建变量来存储值:
SomeClass.TestVar2 = CheckObject() ?? SomeClass.TestVar2;
不是问题的答案,但我用谷歌搜索了“c# shorthand set if null”并首先登陆这里,所以只是为了别人。问题是“shorthand for if NOT null then assign value”,下面是“shorthand for if null then assign value”。
在 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);
}
现在c#中是否有任何shorthand可以减少以下代码:
var testVar1 = checkObject();
if (testVar1 != null)
{
testVar2 = testVar1;
}
在这种情况下,如果 CheckObject() 结果中的 testVar1 不为空,则只想分配 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);
您可以使用 null-coalescing operator,它看起来像这样:testVar2 = testVar1 ?? testVar2
。如果 testVar1
为空,您可以将 ?? testVar2
替换为您想要设置的任何内容。
您提到 testVar2
有一个 setter 会在设置时触发某些事件。如果您不检查 testVar2
是否被设置为自身,该事件仍将使用 null 合并运算符(或三元运算符)触发。
我认为您要么必须检查 testVar2
是否在其 setter 中设置为自身,要么按照您现在的操作进行。
public MyObj testVar2
{
get { return _testVar2; }
set
{
if (_testVar2 != value)
{
_testVar2 = value;
RunSomeCode();
}
}
}
我认为这完全是我的意见,但我会保留您现在的看法。我认为它比简写更能表达意图。
testVar2 = testVar1 ?? tesrVar2
说,"set testVar2
to testVar1
. Unless testVar1
is null. Then set testVar2
to testVar2
".
if (testVar1 != null)
{
testVar2 = testVar1;
}
说,"if testVar1
is not null, set testVar2
to 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
的情况下抛出异常值),那么你的原始代码就没有问题(ternary/null-coalescing 解决方案似乎 "wasteful" 不知何故,因为它们可能会为自己设置一些东西),你可以在一行中完成:
if (testVar1 != null) SomeClass.TestVar2 = testVar1;
但是,如果您创建 testVar1
只是为了捕获对 CheckObject()
的调用结果,那么 null-coalescing 运算符更有意义,因为您不必创建变量来存储值:
SomeClass.TestVar2 = CheckObject() ?? SomeClass.TestVar2;
不是问题的答案,但我用谷歌搜索了“c# shorthand set if null”并首先登陆这里,所以只是为了别人。问题是“shorthand for if NOT null then assign value”,下面是“shorthand for if null then assign value”。
在 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);
}