目 录CONTENT

文章目录

CSharp(八) 比较和逻辑运算符

CSharp(八) 比较和逻辑运算符

本文重点讲解 比较和逻辑运算符

比较运算符(关系运算符)

运算符 名称 示例 结果
== 等于 5 == 5 true
!= 不等于 5 != 3 true
> 大于 5 > 3 true
< 小于 5 < 3 false
>= 大于等于 5 >= 5 true
<= 小于等于 5 <= 3 false

基本示例


int a = 10, b = 20;

Console.WriteLine(a == b);  // False
Console.WriteLine(a != b);  // True
Console.WriteLine(a > b);   // False
Console.WriteLine(a < b);   // True
Console.WriteLine(a >= 10); // True
Console.WriteLine(b <= 20); // True

字符串比较

string s1 = "Hello";
string s2 = "hello";

// 区分大小写
bool result1 = s1 == s2;           // False

// 不区分大小写
bool result2 = string.Equals(s1, s2, StringComparison.OrdinalIgnoreCase); // True

// Compare 方法:返回 0 表示相等,<0 表示 s1 < s2,>0 表示 s1 > s2
int result3 = string.Compare(s1, s2); // 不等于 0(H 的 ASCII 值小于 h)

引用类型比较

// 值相等(调用 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? x = null;
int? y = 5;

Console.WriteLine(x == null);  // True
Console.WriteLine(x == y);     // False(有一个为 null 则返回 False)
Console.WriteLine(x != y);     // True

模式匹配(C# 9.0+)

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 会执行

基本逻辑运算示例

bool a = true, b = false;

Console.WriteLine(a && b);   // False
Console.WriteLine(a || b);   // True
Console.WriteLine(!a);       // False
Console.WriteLine(a ^ b);    // True(异或)
Console.WriteLine(a ^ a);    // False

实际应用场景

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

常见注意事项

注意点 说明
浮点数比较时要注意精度问题 避免直接用 == ,使用容差值 Math.Abs(a - b) < 0.0001
字符串 == 比较时要注意 比较内容,不是引用(字符串重载了)
null 比较 null == null 为 true , null != 任意值 为 true
短路求值 && 和 `
优先级 复杂表达式建议用括号明确
0

评论区