C# 空传播-空检查时执行函数

C# 空传播-空检查时执行函数,c#,null-propagation-operator,C#,Null Propagation Operator,这可以使用空传播运算符(?)实现吗 不,空传播在这里帮不了你,因为它与你想要的方向相反 它将检查第一部分是否为空,只有在这种情况下才运行第二部分。我无法想象你会怎样颠倒它 但正如@JohanP所说,最好将该检查转移到您的功能中: public object GetObj(object input) { if (input == null) return null; .... } origObj = GetObj(model.ProjectId); 不,空传播在这里帮不了你,因为它

这可以使用空传播运算符(?)实现吗


不,空传播在这里帮不了你,因为它与你想要的方向相反

它将检查第一部分是否为空,只有在这种情况下才运行第二部分。我无法想象你会怎样颠倒它

但正如@JohanP所说,最好将该检查转移到您的功能中:

public object GetObj(object input)
{
   if (input == null) return null;
   ....
}

origObj = GetObj(model.ProjectId);

不,空传播在这里帮不了你,因为它与你想要的方向相反

它将检查第一部分是否为空,只有在这种情况下才运行第二部分。我无法想象你会怎样颠倒它

但正如@JohanP所说,最好将该检查转移到您的功能中:

public object GetObj(object input)
{
   if (input == null) return null;
   ....
}

origObj = GetObj(model.ProjectId);
这可以使用空传播运算符(?)实现吗

首先,运算符
是空合并运算符。若您想使用它,它只是意味着若
的左侧为空,那个么就执行右侧,否则执行左侧。因此,在您的情况下,它将不起作用,因为如果您要写以下内容:

var origObj = model.ProjectId ?? GetObj(model.ProjectId.Value);
这意味着:如果
model.ProjectId
不为空,则将其分配给
origObj
。否则,从
GetObj(model.ProjectId.value)
分配返回值,它将崩溃,因为
model.ProjectId
为空

空传播操作符
的工作原理如下:如果
的左侧不为空,则对其调用某些内容。例如:

public class Foo
{ 
    public void Bar() {}
}

var foo = new Foo();
foo?.Bar();
在您的情况下,三元运算符会很好。但这完全取决于
GetObj
方法的返回类型。如果该方法返回
void
,则它将不会编译。如果该方法返回一个基元类型,那么您将需要像这样强制转换,因为三元运算符的两个分支都必须返回相同的类型。例如,如果
GetObj
返回一个
bool
,那么您将需要:

 var origObj = model.ProjectId != null 
     ? GetObj(model.ProjectId.Value) : 
     (bool?)null;
明白了

最后,如果将空检查留给
GetObj
方法,那么如果
GetObj
方法如下所示,您可能会遇到麻烦,并且您的程序可能会崩溃:

public object GetObj(object value)
{
    if (value == null)
    {
        throw new InvalidOperationException("Cannot call with null");
    }
}
这可以使用空传播运算符(?)实现吗

首先,运算符
是空合并运算符。若您想使用它,它只是意味着若
的左侧为空,那个么就执行右侧,否则执行左侧。因此,在您的情况下,它将不起作用,因为如果您要写以下内容:

var origObj = model.ProjectId ?? GetObj(model.ProjectId.Value);
这意味着:如果
model.ProjectId
不为空,则将其分配给
origObj
。否则,从
GetObj(model.ProjectId.value)
分配返回值,它将崩溃,因为
model.ProjectId
为空

空传播操作符
的工作原理如下:如果
的左侧不为空,则对其调用某些内容。例如:

public class Foo
{ 
    public void Bar() {}
}

var foo = new Foo();
foo?.Bar();
在您的情况下,三元运算符会很好。但这完全取决于
GetObj
方法的返回类型。如果该方法返回
void
,则它将不会编译。如果该方法返回一个基元类型,那么您将需要像这样强制转换,因为三元运算符的两个分支都必须返回相同的类型。例如,如果
GetObj
返回一个
bool
,那么您将需要:

 var origObj = model.ProjectId != null 
     ? GetObj(model.ProjectId.Value) : 
     (bool?)null;
明白了

最后,如果将空检查留给
GetObj
方法,那么如果
GetObj
方法如下所示,您可能会遇到麻烦,并且您的程序可能会崩溃:

public object GetObj(object value)
{
    if (value == null)
    {
        throw new InvalidOperationException("Cannot call with null");
    }
}

您需要让
GetObj
决定如何处理
null
输入,否则您需要在调用它时到处进行检查。您需要让
GetObj
决定如何处理
null
输入,否则您需要在调用它时到处进行检查。