ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CodeGo.net>处理与自定义布尔类型的比较?

2019-11-08 01:08:44  阅读:161  来源: 互联网

标签:comparison c


我有一个自定义对象,该对象将布尔值从旧版数据库映射到C#bool(然后再返回).

我的自定义bool对象如下所示:

public class S2kBool : IUserDefinedType {
    public bool Value { get; set; }

    public Type SupportedType { get { return typeof(string); } }

    // These are the values used to represent booleans in the database
    public const string TrueValue = "Y";
    public const string FalseValue = "N";

    public static S2kBool True {
        get { return new S2kBool(true); }
    }

    public static S2kBool False {
        get { return new S2kBool(false); }
    }

    public S2kBool() : this(false) { }

    public S2kBool(bool value) {
        this.Value = value;
    }

    // Called when a property of this type is populated from the database
    public void FromSimpleDataType(object value) {
        this.Value = value.ToString() == TrueValue;
    }

    // Called when a property of this type is inserted into the database
    public object ToSimpleDataType() {
        return this.Value ? TrueValue : FalseValue;
    }
}

我希望能够做这样的事情:

public class TestObject {
    public S2kBool IsActive = S2kBool.True;
}

TestObject tObj = new TestObject();
if (tObj.IsActive == S2kBool.True) {
    // the above would evaluate to true
}

我已经看到了几种不同的对象间比较方法,但是我不确定要使用哪种方法.

编辑:更好的是,是否有可能做类似以下的事情,并让C#在比较期间将S2kBool对象视为实际的布尔值?它还应该允许与其他S2kBool对象进行比较.

if (tObj.IsActive == true) { ... }

解决方法:

有两件事要看;布尔值的隐式转换运算符(在S2kBool中),或true / false运算符本身…

true / false运算符(请注意,我自己更喜欢隐式布尔转换):

public static bool operator true(S2kBool x) {
    return x.Value;
}
public static bool operator false(S2kBool x) {
    return !x.Value;
}

那么你可以使用if(tObj.IsActive)

转换运算符:

public static implicit operator bool(S2kBool x) {
    return x.Value;
}

同样地工作

您也可以向另一个方向添加转化:

public static implicit operator S2kBool(bool x)
{
    return new S2kBool(x);
}

然后可以分配IsActive = false;等等

最后,我想知道这是否应该是一个不变的结构?如果您希望它的行为像一个值,可能会造成混淆.例如,在这里查看最后一行:

TestObject obj1 = new TestObject(),
           obj2 = new TestObject();
obj1.IsActive = obj2.IsActive = S2kBool.True;

Console.WriteLine(obj1.IsActive);
Console.WriteLine(obj2.IsActive);

obj1.IsActive.Value = false;

Console.WriteLine(obj1.IsActive);
Console.WriteLine(obj2.IsActive); // what does this print?

因为两个IsActive字段都指向S2kBool的相同实例,所以此打印为false.如果那是目的,那就很好.但是,如果是我,我将使其变得不可变(无论是类还是结构).但是,由于除了布尔值之外,它实际上没有其他任何状态,因此我认为这很适合结构.

老实说,当所有功能都可以通过静态方法/ etc完成时,我不确定完全为什么需要它.

标签:comparison,c
来源: https://codeday.me/bug/20191108/2004339.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有