将类用作布尔值时的自定义函数

本文关键字:自定义函数 布尔值 | 更新日期: 2023-09-27 17:53:24

有没有什么办法让我可以这样写

if(boolClass) {}

其中boolClass正在调用包含的函数。有点像重载bool操作符之类的

谢谢你的帮助

将类用作布尔值时的自定义函数

实际上有一个'true'操作符可以用于此目的,尽管它有点晦涩。这比转换为bool稍微具体一些,因为它仅限于在检查true/false的表达式中使用。

public class BoolClass
{
    public static bool operator true(BoolClass instance)
    {
        return true; //Logic goes here
    }
    public static bool operator false(BoolClass instance)
    {
        return true; //Logic goes here
    }
    public void Test()
    {
        BoolClass boolClass = new BoolClass();
        if (boolClass)
        {
            //Do something here
        }
    }
}

注意,MS实际上不建议使用此操作符,因为它最初的目的是允许一种可空bool类型(其中值既不能为真也不能为假)。由于现在本机支持可空的bool,因此它们是首选。我不建议在产品代码中使用它,主要是因为大多数开发人员不熟悉语法,导致混乱。

我的第一点是要提醒您不要这样做,通常您希望直接或间接使用boolbool?类。

如果您确定这是您需要的,那么您将需要一个隐式转换操作符到bool

//In the definition of boolClass
public static implicit operator bool(boolClass obj)
{
    //Return a bool in this method
}

可以使用隐式操作符将类转换为布尔值。

这是一个完整而简单的例子:

架势

using System;
namespace TestLogic
{
    internal class FuzzyLogic
    {
        public FuzzyLogic(Double init)
        {
            this.value = init;
        }
        public Double value { get; private set; }
        public static implicit operator Boolean(FuzzyLogic logic)
        {
            return logic.value < 0.1;
        }
    }
}

使用转换

using System;
namespace TestLogic
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            FuzzyLogic logic = new FuzzyLogic(0.2);
            if (logic)
            {
                Console.WriteLine("It's true !");
            }
            else
            {
                Console.WriteLine("It's not true !");
            }
            Console.ReadLine();
        }
    }
}

听起来像一个属性:

public bool boolClass
{
    get { return false; } // or a calculated boolean value
}

你可以在同一个类中调用它:

if(boolClass) {}

为您的类添加一个转换操作符。示例(ideone):

using System;
public class A
{
    private int i;
    public int I { get { return i; } }
    public A(int i) { this.i = i; }
    public static implicit operator bool(A a) { return a.i != 0; }
}
public class Test
{
    public static void Main()
    {
        A a1 = new A(0);
        if (a1) 
          Console.WriteLine("a1 is true");
        else
          Console.WriteLine("a1 is false");
        A a2 = new A(42);
        if (a2) 
          Console.WriteLine("a2 is true");
        else
          Console.WriteLine("a2 is false");
    }
}
输出:

a1 is false
a2 is true