C#中的true和false运算符

本文介绍了C#中true和false运算符的使用,包括基础用法和如何定义这两个运算符。C#通过定义&&和||来实现短路逻辑运算,并通过运算符来判断最终的真或假。同时提到了三元逻辑值在C#中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C#中的truefalse运算符

基础用法

我们先定义一个示例用的类

public class BoolTest
{
    public int X { get; set; }
    public BoolTest(int x) { X = x; }
    public static bool operator true(BoolTest test)
    {
        Console.WriteLine("call op_true");
        return test.X > 0;
    }
    public static bool operator false(BoolTest test)
    {
        Console.WriteLine("call op_false");
        return test.X < 0;
    }
}

定义了truefalse运算符后,类可以在可以用于ifdowhilefor语句以及条件表达式中的控制表达式。

if (new BoolTest(1))
    ; // 会有空语句警告,请忽视
if (new BoolTest(-1))
    ;
// output:
// call op_true
// call op_true

可以看到,我们只调用了true运算符,那么false运算符用在哪里呢

定义||&&运算符

更确切地说,false运算符是用于定义||运算符的

在此之前,我默认你已经知道逻辑运算符的短路运算

C#不能直接定义||&&运算符,而是通过定义|true来获得||,定义&false来得到&&,其原因就是为了支持短路运算。

现在更新我们的类

public class BoolTest
{
    public int X { get; set; }
    public BoolTest(int x) { X = x; }

    public static bool operator true(BoolTest test)
    {
        Console.WriteLine("call op_true");
        return test.X > 0;
    }
    public static bool operator false(BoolTest test)
    {
        Console.WriteLine("call op_false");
        return test.X < 0;
    }

    public static BoolTest operator |(BoolTest left, BoolTest right)
    {
        return new BoolTest(Math.Max(left.X, right.X));
    }
    public static BoolTest operator &(BoolTest left, BoolTest right)
    {
        return new BoolTest(Math.Min(left.X, right.X));
    }
    // 这两个运算符必须返回BoolTest类型(准确的说是返回和参数相同的类型)
}
BoolTest p = new BoolTest(1);
BoolTest n = new BoolTest(-1);

if (p || n)
    WriteLine("p || n");
    /*
    call op_true
    call op_true 调用了两次true()
    p || n
    */
if (p && n)
    WriteLine("p && b");
    /*
    call op_false 使用了false()来作短路判断
    call op_true 此时p是True,调用&()生成新的BoolTest,再对新的BoolTest调用true()
    */
if (n || p)
    WriteLine("n || p");
    /*
    call op_true 对n
    call op_true 对(n | p)
    n || p
    */
if (n && p)
    WriteLine("n && p");
    /*
    call op_false 对n
    call op_true 对n
    */

结论就是
a || b等价于operator_true(operator_true(a) ? a : (a | b))
a && b等价于operator_true(operator_false(a) ? a : (a & b))

注意:最终的真或假还是交由true运算符判断false运算符只在短路中用到

truefalse运算符还用于支持三元逻辑值*(True, False, Null)*,不过现在有bool?类型了

这个链接是三元逻辑值的示例类 struct DBBool

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值