// 值相等(调用 Equals 方法)
object obj1 = "hello";
object obj2 = "hello";
Console.WriteLine(obj1 == obj2); // True(字符串重载了 ==)
// 引用相等(是否是同一个对象)
object obj3 = new object();
object obj4 = new object();
Console.WriteLine(obj3 == obj4); // False
Console.WriteLine(ReferenceEquals(obj3, obj4)); // False
// 自定义类
class Person
{
public string Name { get; set; }
public override bool Equals(object obj) => obj is Person p && p.Name == Name;
public static bool operator ==(Person a, Person b) => a?.Equals(b) ?? b is null;
public static bool operator !=(Person a, Person b) => !(a == b);
}
int value = 50;
// 范围判断
bool inRange = value is >= 1 and <= 100; // True
// 类型判断
object obj = "hello";
if (obj is string s && s.Length > 3) { }
// 空检查
string str = null;
if (str is not null) { }
逻辑运算符
运算符
名称
说明
&&
逻辑与
两个都为 true 才返回 true
!
逻辑非
取反, true 变 false
&
按位与
非短路,两边都会执行
^
异或
两边不同返回 true
短路求值示例
bool a = true, b = false;
// &&:左边为 false 时,右边不执行
bool result1 = b && SomeMethod(); // SomeMethod 不会执行
// ||:左边为 true 时,右边不执行
bool result2 = a || SomeMethod(); // SomeMethod 不会执行
// & 和 |:两边都会执行(不短路)
bool result3 = b & SomeMethod(); // SomeMethod 会执行
bool result4 = a | SomeMethod(); // SomeMethod 会执行
int age = 25;
bool hasId = true;
// 逻辑与:必须同时满足
if (age >= 18 && hasId)
{
Console.WriteLine("可以进入");
}
// 逻辑或:满足一个即可
int score = 85;
if (score < 60 || score > 100)
{
Console.WriteLine("成绩无效");
}
// 逻辑非
bool isClosed = false;
if (!isClosed)
{
Console.WriteLine("门是开着的");
}
// 组合使用
int x = 50;
if (x > 0 && x < 100 && x != 50)
{
Console.WriteLine("x 在 1-99 之间且不等于 50");
}
三目运算符(条件运算符)
int age = 20;
string status = age >= 18 ? "成年人" : "未成年人";
// 嵌套
int score = 85;
string grade = score >= 90 ? "A" :
score >= 80 ? "B" :
score >= 60 ? "C" : "D";
空合并和空条件运算符
// ?? 空合并
string name = null;
string displayName = name ?? "未知"; // "未知"
// ??= 空合并赋值
name ??= "默认值";
// ?. 空条件
string text = null;
int? length = text?.Length; // null,不会抛异常
// 组合
string result = text?.Trim()?.ToUpper() ?? "空字符串";
运算符优先级
顺序(由高到低)
! (逻辑非)
== , != , > , < , >= , <= (比较)
&& (逻辑与)
|| (逻辑或)
?? (空合并)
?: (三目)
建议用括号明确优先级
// 建议用括号明确优先级
bool result = (a > 0 && b > 0) || (c > 0 && d > 0);
自定义运算符重载(了解就好)
public class Money
{
public decimal Amount { get; set; }
// 重载比较运算符
public static bool operator >(Money a, Money b) => a.Amount > b.Amount;
public static bool operator <(Money a, Money b) => a.Amount < b.Amount;
public static bool operator >=(Money a, Money b) => a.Amount >= b.Amount;
public static bool operator <=(Money a, Money b) => a.Amount <= b.Amount;
public static bool operator ==(Money a, Money b) => a.Amount == b.Amount;
public static bool operator !=(Money a, Money b) => a.Amount != b.Amount;
public override bool Equals(object obj) => obj is Money m && m.Amount == Amount;
public override int GetHashCode() => Amount.GetHashCode();
}
// 使用
Money m1 = new Money { Amount = 100 };
Money m2 = new Money { Amount = 200 };
Console.WriteLine(m1 < m2); // True
评论区