C# 空条件运算符应该一直使用到什么时候?。ToString()?.Trim()等
我对空条件运算符有一些误解?。机制 获取字符串变量长度的示例C# 空条件运算符应该一直使用到什么时候?。ToString()?.Trim()等,c#,.net,operators,null-conditional-operator,C#,.net,Operators,Null Conditional Operator,我对空条件运算符有一些误解?。机制 获取字符串变量长度的示例 object variable = null; int? Length = variable?.ToString()?.Trim()?.Length; 我们应该在需要测试的对象成员的所有级联属性中使用?。运算符吗? 变量对象为null,因此使用null条件运算符进行的测试应仅针对ToString()方法或ToString()的级联成员 这个 或 我认为如果ToString为null,则不需要在它之后测试下一个成员。好的,null条件
object variable = null;
int? Length = variable?.ToString()?.Trim()?.Length;
我们应该在需要测试的对象成员的所有级联属性中使用?。
运算符吗?变量对象为null,因此使用null条件运算符进行的测试应仅针对
ToString()
方法或ToString()的级联成员
这个
或
我认为如果ToString
为null,则不需要在它之后测试下一个成员。好的,null条件运算符返回null
或某个类
;因为int
是一个struct
,所以您不能将
// Doesn't compile. What is Length when variable == null?
int Length = variable?.ToString()?.Trim()?.Length;
但是使用Nullable
或者将null
转换为合理的int
:
// in case variable is null let Length be -1
int Length = variable?.ToString()?.Trim()?.Length ?? -1;
由于null.ToString()
引发异常,因此变量?中的。
。ToString()
是必需的;如果我们假设ToString()
和Trim()
从不返回null
,那么所有其他?。
都是可选的
如果变量
为空
,则?。
将立即返回空
如果变量
不是null
,则.ToString()
和.Trim()
都不会返回null
,并且检查?。
是多余的
所以你可以把
int? Length = variable?.ToString().Trim().Length;
或
空条件运算符只是空检查的语法糖。因此,以下两种代码相似:
object variable = null;
int? Length = variable?.ToString()?.Trim()?.Length;
VS:
因此,根据成员是否可以返回null
-例如ToString
可以,而Trim
不可以-您可能需要使用?
检查它
在您的示例中,您可以省略对Trim
的检查,但对ToString
int?长度=…
,请注意?
或整数长度=??0;代码>a)您可以自己测试。b) 您只需要变量?
一个(假设ToString
从不返回null
,这是一个非常安全的赌注)。这取决于您调用的成员。数据是否可以为空?例如,Trim
从不返回null
,ToString
但是可以。它不适用于ToString()。这是例如,但可能您有图像或任何您需要来自它的许多嵌套成员的东西。如果该方法不能返回null
,那么您不需要在它后面加?
。规则就这么简单。
// in case variable is null let Length be -1
int Length = variable?.ToString()?.Trim()?.Length ?? -1;
int? Length = variable?.ToString().Trim().Length;
int Length = variable?.ToString().Trim().Length ?? -1;
object variable = null;
int? Length = variable?.ToString()?.Trim()?.Length;
object variable = null;
int? Length;
if(variable != null)
{
var a = variable.ToString()?;
if(a != null)
{
var result = a.Trim();
if(result != null)
Length = result.Length;
}
}