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;
}
};