C#:与null比较

C#:与null比较,c#,null,C#,Null,这些是否等同于: if (null==myobject) { //do something } 及 或者他们会产生不同的代码吗?在99%的情况下,此代码是等效的 一个例外是当所讨论对象的类型重写==运算符时。有可能在==中引入错误,当一个参数为null时会导致问题 我以前见过的一个特别的例子如下 public static bool operator==(Student left, Student right) { return left.Equals(right); } 当null位

这些是否等同于:

if (null==myobject)
{
//do something 
}


或者他们会产生不同的代码吗?

在99%的情况下,此代码是等效的

一个例外是当所讨论对象的类型重写==运算符时。有可能在==中引入错误,当一个参数为null时会导致问题

我以前见过的一个特别的例子如下

public static bool operator==(Student left, Student right) {
  return left.Equals(right);
}
当null位于左侧时,此操作将失败,但当null位于右侧时,此操作可能不会失败

不过,这是一个非常离谱的案例

将常量放在左边的“
if
”语句的形式是C/C++的一种保留,在C/C++中,可以在if语句中使用任意表达式


C#的if语句语法要求表达式计算为bool,这意味着
if(foo=0)
不会编译。

正如其他人所指出的,它们基本上是等价的

你还应该看看:

这是一个非常有用的替代方法,而不是简单地检查空引用。

if (null==myobject) {
是编写if语句的安全方法。它来自C/C++,其中条件是一个计算为
int
的表达式。如果结果为零,则表示
为假
,其他任何结果均为
为真
。你可以这样写

if (variable == 1) {
但如果你不小心,你也可以写

if (variable = 1) { 
在这种情况下,赋值值总是为1,因此始终为真

您可以编译并运行它,而不会出现任何问题,但结果并不是您所期望的。因此C/C++程序员开始编写类似

if (1 == variable) {

如果你拼错了它,它将无法编译,所以你必须按照你的意思来编写它。这后来成为一个(好)习惯,你可以在所有编程语言中使用它,例如C。

对于那些错过它的人,如果你想减少混乱,也可以为你的
C
类启用
C语言
样式的空值检查:

class MyObj
{
    public void implicit_null_comparison_demo()
    {
        MyObj mo = null;
        // ...

        if (mo)         //  <-- like so (can also use !mo)
        {
            // it's not null...
        }
        else
        {
            // it's null...
        }
    }

    public static implicit operator bool(MyObj mo)
    {
        return (Object)mo != null;
    }
};
类MyObj
{
public void隐式\u null\u比较\u demo()
{
MyObj-mo=null;
// ...

if(mo)//解决方案是:
if((object)left==null)
if(ReferenceEquals(left,null))
。前者的性能可能更高。@Justice,但永远不要对性能做任何假设,请相信分析器:)清楚:这并不意味着一个比较比另一个更正确。错误可以通过两种方式引入。运算符可以重写为
返回right.Equals(left);
然后,如果
右侧的
学生为
null
myobject==null
)。无论操作数顺序如何,
null==student
student==null
都将调用重写的
=
运算符。因此,这个答案在我看来是错误的。是的@DmytroShevchenko是对的。这是b/s答案。。哦,很好。我记得几年前学习C#的时候,我发誓我记得在if语句中使用赋值(意外)以及其他安全设备(例如switch语句中缺少中断)时,收到编译器警告或错误+1我们过去常常故意这样做,同时分配任务并检查值。C++中的赋值操作符返回赋值。我有点错过这个特性,但是它很容易滥用。@贾斯敏:我有时也使用这个构造——你只要做“如果((Foo= Bar())=null pTR)”。。但通常情况下,这无法通过代码审查—它会更改为“foo=bar();if(foo==nullptr)”是的,我同意。如果你总是要做赋值,不妨把它放在另一行。无论如何,它可能是这样编译的。当你在比较中涉及bool时,仍然存在意外赋值的风险,这是相当罕见的,但存在:
If(wasaenabled==isEnabled())…
第一个也被称为Yoda条件:)很好。这样做的危险是什么?主要是,你会错过错误使用赋值
=
而不是等式测试
=
,这类错误与C和C++不同,通常会标记为语法错误。确切地说,这是一个很难看到的错误,因为dif引用只是一个字符,由于视觉上的相似性,所以它过去(现在仍然是?)是C语言的一个常见抱怨。我想一些Linter可以捕捉到它,但它不再是一个语法错误。@PeterWood可能吧,但我不认为C语言开发人员已经发展出一个非常强大的“lint”传统,因为这两个原因(1)最初的、基本的语言设计理念是从过去的糟糕经验中学习到的,以避免我们在这里讨论的问题,而且(2)IDE实时编辑的经验非常丰富。
class MyObj
{
    public void implicit_null_comparison_demo()
    {
        MyObj mo = null;
        // ...

        if (mo)         //  <-- like so (can also use !mo)
        {
            // it's not null...
        }
        else
        {
            // it's null...
        }
    }

    public static implicit operator bool(MyObj mo)
    {
        return (Object)mo != null;
    }
};