在C#中,是否可以在不使用运算符的情况下计算变量是否与null不同?
比如说,有没有可能写这个 if(变量!=null)在C#中,是否可以在不使用运算符的情况下计算变量是否与null不同?,c#,null,if-statement,C#,Null,If Statement,比如说,有没有可能写这个 if(变量!=null) 不使用操作员!=或者==?如果不想使用运算符,如何检查某个内容是否为null? 这个问题的原因是什么?如果您不想使用运算符,您将如何检查内容是否为null? 这个问题的原因是什么?您可以使用(variable,null)您可以使用(variable,null)好吧,我只需要使用==(如果您试图避免自定义相等运算符,可能强制转换为对象,它无论如何都是nop强制转换) 除此之外,我的钱将用于object.ReferenceEquals(obj,nu
不使用操作员!=或者==?如果不想使用运算符,如何检查某个内容是否为null?
这个问题的原因是什么?如果您不想使用运算符,您将如何检查内容是否为null?
这个问题的原因是什么?您可以使用
(variable,null)您可以使用(variable,null)
好吧,我只需要使用==
(如果您试图避免自定义相等运算符,可能强制转换为对象
,它无论如何都是nop强制转换)
除此之外,我的钱将用于object.ReferenceEquals(obj,null)
,但您也可以使用object.Equals(obj,null)
,因为它处理null
等
完整性:为什么我只使用==
/=代码>?简单:编译器可以直接这样做。针对对象的空检查的IL实际上是:
- 加载ref
- 如果为真,则分支(如果为假,则分支)
就这样。两个IL指令。它甚至不做“加载null,相等检查”-因为“true”的定义是“任何不是0/null的东西”,“false”是“0/null”
对于类似于ReferenceEquals
,即:
- 加载ref
- 加载空值
- 调用该方法
- (用于创建堆栈帧)
- 加载第一个参数
- 加载第二个参数
- 进行平等性检查
- (然后将值传回堆栈帧,返回真/假)
- 如果为真,则分支(如果为假,则分支)
我知道我更喜欢哪个…好吧,我只想使用=
(如果您试图避免使用自定义的相等运算符,可能会强制转换为对象
——无论如何它都将是nop强制转换)
除此之外,我的钱将用于object.ReferenceEquals(obj,null)
,但您也可以使用object.Equals(obj,null)
,因为它处理null
等
完整性:为什么我只使用==
/=代码>?简单:编译器可以直接这样做。针对对象的空检查的IL实际上是:
- 加载ref
- 如果为真,则分支(如果为假,则分支)
就这样。两个IL指令。它甚至不做“加载null,相等检查”-因为“true”的定义是“任何不是0/null的东西”,“false”是“0/null”
对于类似于ReferenceEquals
,即:
- 加载ref
- 加载空值
- 调用该方法
- (用于创建堆栈帧)
- 加载第一个参数
- 加载第二个参数
- 进行平等性检查
- (然后将值传回堆栈帧,返回真/假)
- 如果为真,则分支(如果为假,则分支)
我知道我更喜欢哪一种…对其调用ToString(),如果您得到System.NullReferenceException,则它为null.:-)
但是为什么呢?对其调用ToString(),如果您得到System.NullReferenceException,则它为null:-)
但是为什么呢?那么,符合您描述的唯一其他语法就是使用??运算符(仍然是运算符,i gues…),但它要么返回值,要么如果值为null,则返回下一个表达式值,如中所示
string nullStr = null;
string out1 = nullStr?? "NullString"; // out1 = "NullString";
// ------------------------------------------------------------
string realStr = "RealString";
string out2 = realStr ?? "NullString"; // out2 = "RealString";
那么,符合您描述的唯一其他语法是使用??运算符(仍然是运算符,i gues…),但它要么返回值,要么如果值为null,则返回下一个表达式值,如中所示
string nullStr = null;
string out1 = nullStr?? "NullString"; // out1 = "NullString";
// ------------------------------------------------------------
string realStr = "RealString";
string out2 = realStr ?? "NullString"; // out2 = "RealString";
你可能真的是个混蛋,并使用:
if (x is object) {
// not null
}
else {
// null
}
你可能真的是个混蛋,并使用:
if (x is object) {
// not null
}
else {
// null
}
你需要这个用于任何特定的东西,或者仅仅是好奇…?你需要这个用于任何特定的东西,或者仅仅是好奇…?使用静态方法?Staticclass.IsNull(变量)我想检查是否可以不使用运算符编写代码。@Dran-但是为什么要不使用运算符编写代码呢?操作符更快(尤其是在这种情况下)。使用静态方法?Staticclass.IsNull(变量)我想检查是否可以不使用运算符编写代码。@Dran-但是为什么要不使用运算符编写代码呢?操作员(尤其是在这种情况下)更快。。。。或者创建一个扩展方法并像调用obj.IsNotNull()
那样调用它。。。或者通过创建一个扩展方法并像调用obj.IsNotNull()
那样调用它,我不知道is
为null提供了false。谢谢并不是说我会在任何地方使用此代码:)我不知道是否为将false设为null。谢谢并不是说我会在任何地方使用这个代码:)马克,你怎么知道的?你怎么知道有多少IL指令是C#语句?“我怎样才能学会呢?”德兰:反射器。加上我现在正在做很多元编程,所以直接写IL。马克,你怎么知道的?你怎么知道有多少IL指令是C#语句?“我怎样才能学会呢?”德兰:反射器。另外,我目前正在做很多元编程,所以直接编写IL。