【问题标题】:What are true and false operators in C#?C#中的真假运算符是什么?
【发布时间】:2010-10-15 17:52:50
【问题描述】:

C#中truefalse运算符的用途和作用是什么?这些上面的official documentation 完全无法解释。

【问题讨论】:

  • 如果 'true' 和 'false' 运算符都返回 true 怎么办?
  • @alex: 然后期待有趣的结果。
  • @alex,我认为在评估时确定真/假时实际上没有使用错误操作。我看看能不能确认。
  • 没关系,判断是否可以短路&&的时候调用。
  • @Samuel,它也可以在其他地方用于优化对“真”运算符的结果调用“非”运算符。然而,这只是一个猜测。

标签: c# operators


【解决方案1】:

查看文章中引用的示例

C# Language Specification -- Database boolean type

基本上,这些运算符允许在布尔条件逻辑中使用类型的实例,例如 &&||

【讨论】:

    【解决方案2】:

    它们允许您使用运算符重载语法重载它们,以便您定义的类型可以解释为布尔值。

    【讨论】:

      【解决方案3】:

      允许您使用自定义类型作为逻辑操作的一部分;例如,作为 if 或 while 语句的一部分。

      【讨论】:

        【解决方案4】:

        如果您要定义一个专门的布尔值,您将重载truefalse 运算符。 但是,这通常不需要,这就是它们看起来没有用的原因。例如,在一个模糊逻辑布尔类中,你可能有这样的东西:

        // Represents a boolean that can store truth values in a range from [0, 1], with
        //   a value of one indicating complete metaphysical certitude and a value of
        //   zero indicating complete impossibility.
        public class FuzzyBoolean {
        // ...
           public static bool operator true(FuzzyBoolean fb) {
              return fb.TruthValue > 0;
           }
        
           public static bool operator false(FuzzyBoolean fb) {
              return fb.TruthValue == 0;
           }
        // ...
        }
        

        请注意,如果您重载true,您还必须重载false(反之亦然)。

        当然,还有truefalse literals,您可以将这两个文字值分配给布尔实例。不要将这些与上面提到的运算符混淆。 MSDN 文档here 中提供了一个更重要的示例,说明如何使用它,涉及数据库中的布尔值。

        【讨论】:

        • 这似乎是一个非常人为的例子。我会看到对具有 OK 和 bad 状态的对象使用这样的东西 - 比如说一个文件对象如果它处于可读状态,它可以返回 true,允许人们编写一个像 'if (file) { /* do 这样的 C有些东西 */ }` 构造。
        • @Ori:IMO,这是个糟糕的主意。文件不是布尔值,不应该这样使用。如果你想检查它是否处于良好状态,那应该是一个布尔方法:“file.IsValid()”或类似的东西。
        • 无论你如何命名,FuzzyBooleans 都不是。在某些语言中,将各种事物用作布尔值是惯用的。它可能不在 C# 中,但考虑到支持转换为布尔值的广泛设施,我怀疑这是有意的,而不是定义的能力
        • 一种新的布尔类型,我怀疑这种类型非常罕见。
        • 我的意思是,FuzzyBoolean 和布尔值之间的距离比文件和布尔值之间的距离要小得多。 C# 不会阻止您对自己的内容进行隐式转换;我只是说我认为这不一定是个好主意。
        【解决方案5】:

        true 和 false 运算符可以重载,以允许一个类将自己的状态表示为 true 或 false,例如:

        public class MyClass
        {
            //...
            public static bool operator true(MyClass op)
            {
                // Evaluation code...
            }
        
            public static bool operator false(MyClass op)
            {
                // Evaluation code...
            }
        }
        

        您将能够在布尔表达式中使用运算符:

        MyClass test = new MyClass(4, 3);
        if (test)
            Console.WriteLine("Something true");
        else
            Console.WriteLine("Something false");
        
        string text = test ? "Returned true" : "Returned false";
        

        【讨论】:

        • 如果 'true' 和 'false' 运算符都返回 true 怎么办?
        • @alex,在上面的 CMS 示例中没有检查 false 的情况下,我希望没有什么不合时宜的。
        • @alex 此示例仅与operator true 相关。如果您在ifwhile 等内部使用上面的MyClass,或者使用? : 三元运算符,则只考虑operator trueoperator false 重要的唯一情况似乎是MyClass 也以适当的方式重载operator &。所以你可以说MyClass conj = GetMyClass1() & GetMyClass2();。然后使用operator false,您可以短路并说MyClass conj = GetMyClass1() && GetMyClass2();,使用&& 而不是&。如果第一个操作数不是“假”,那只会评估第二个操作数。
        【解决方案6】:

        在 C# 2.0 之前,true 和 false 运算符用于创建与 SqlBool 等类型兼容的用户定义的可为空值类型。但是,该语言现在提供了对可空值类型的内置支持,并且您应该尽可能使用它们,而不是重载 true 和 false 运算符。有关更多信息。对于可为空的布尔值,表达式 a != b 不一定等于 !(a == b),因为其中一个或两个值可能为空。您需要分别重载 true 和 false 运算符以正确识别表达式中的空值。下面的例子展示了如何重载和使用真假运算符。

        【讨论】:

          猜你喜欢
          • 2014-08-03
          • 1970-01-01
          • 2016-09-26
          • 2010-12-11
          相关资源
          最近更新 更多