C#中!=运算符和is not运算符之间是否存在区别?
C#中
!=与is not条件判断的差异说明 二者的逻辑并不完全一致,核心差异主要体现在三个方面:
- 对自定义运算符重载的处理不同
!=是C#支持重载的运算符,若比较的类型自定义了==/!=逻辑,判断时会优先执行自定义的相等规则;而is not是C# 9.0引入的模式匹配语法,永远使用默认相等语义:值类型判断内容是否一致,引用类型判断是否指向同一内存地址,完全忽略自定义的运算符重载。
代码示例:
public class CustomClass { public int Num { get; set; } // 自定义相等逻辑:只要Num属性相等就判定为相等 public static bool operator ==(CustomClass left, CustomClass right) { if (ReferenceEquals(left, null) || ReferenceEquals(right, null)) return false; return left.Num == right.Num; } public static bool operator !=(CustomClass left, CustomClass right) { return !(left == right); } } // 运行测试 CustomClass obj1 = new CustomClass { Num = 2 }; CustomClass obj2 = new CustomClass { Num = 2 }; Console.WriteLine(obj1 != obj2); // 输出False,走自定义重载逻辑,Num相等即判定相等 Console.WriteLine(obj1 is not obj2); // 输出True,走默认引用判断,两个对象指向不同地址
- null值判断的逻辑不同
做null比较时,x != null如果对应类型重载了!=运算符,会执行重载逻辑;而x is not null完全忽略任何自定义逻辑,直接判断引用是否不为null、可空值类型是否存在有效值。如果你的类型重载!=时故意修改了和null比较的逻辑,二者的结果会完全不同。 - 编译期类型检查严格度不同
is not要求比较的两个类型存在兼容转换的可能,否则会直接编译报错;!=在部分弱类型场景(如两边都声明为object类型)允许跨类型比较,仅在运行时返回结果。
只有当比较的类型没有自定义==/!=重载,且比较的是同类型非null值时,二者的判断结果才会一致,其余场景都可能出现差异。
内容的提问来源于stack exchange,提问作者Thanos Kyprianos
相关产品推荐
相关产品推荐

