在C#中,是否可以在不使用运算符的情况下计算变量是否与null不同?

在C#中,是否可以在不使用运算符的情况下计算变量是否与null不同?,c#,null,if-statement,C#,Null,If Statement,比如说,有没有可能写这个 if(变量!=null) 不使用操作员!=或者==?如果不想使用运算符,如何检查某个内容是否为null? 这个问题的原因是什么?如果您不想使用运算符,您将如何检查内容是否为null? 这个问题的原因是什么?您可以使用(variable,null)您可以使用(variable,null)好吧,我只需要使用==(如果您试图避免自定义相等运算符,可能强制转换为对象,它无论如何都是nop强制转换) 除此之外,我的钱将用于object.ReferenceEquals(obj,nu

比如说,有没有可能写这个

if(变量!=null)


不使用操作员!=或者==?

如果不想使用运算符,如何检查某个内容是否为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。