C# 简写,如果不是 null,则赋值



现在 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;

最新更新