如何创建自己的数据类型?

时间:2014-10-17 20:52:51

标签: c#

我想创建一个名为DataType的自己的positiveInteger

我知道你在想什么?

您认为我应该在这里使用uint。 但uint包含0,我只想要正数。

现在你可以告诉我创建一个名为positiveInteger的类。 是的,我可以创建一个名为Class的{​​{1}},但我不知道如何实现该类,以便这个新的DataType只接受正整数值?

3 个答案:

答案 0 :(得分:5)

如果您希望能够“接受”(mostly)编译为常量int值的值,那么您需要实现implicit转换为{来自positiveInteger

的{1}}
int

这将允许您像这样分配一个positiveInteger

public class positiveInteger
{
    public static implicit operator positiveInteger(int source)
    {
        if(source <= 0) throw new ArgumentOutOfRangeException();
    }
}

但是,它也可以分配positiveInteger number = 5;

int

答案 1 :(得分:4)

示例实现可以是:

public struct PositiveInteger : IEquatable<PositiveInteger>, IComparable<PositiveInteger>
{
    public PositiveInteger(uint value)
    {
        if (value <= 0) throw new ArgumentOutOfRangeException();
        _value = value;
    }

    public uint Value { get { return _value == 0 ? 1 : _value; } }
    private readonly uint _value;

    public static implicit operator PositiveInteger(uint value)
    {
        return new PositiveInteger(value);
    }

    public static implicit operator uint(PositiveInteger value)
    {
        return value.Value;
    }

    public static PositiveInteger operator +(PositiveInteger value1, PositiveInteger value2)
    {
        var result = value1.Value + value2.Value;
        if (result < value1.Value || result < value2.Value)
        {
            throw new ArgumentOutOfRangeException();    //overflow
        }
        return result;
    }

    public static PositiveInteger operator -(PositiveInteger value1, PositiveInteger value2)
    {
        if (value1.Value < value2.Value) throw new ArgumentOutOfRangeException();
        return value1.Value - value2.Value;
    }

    public override bool Equals(object obj)
    {
        if (obj is PositiveInteger == false) return false;
        return Equals((PositiveInteger)obj);
    }

    public bool Equals(PositiveInteger other)
    {
        return Value == other.Value;
    }

    public override int GetHashCode()
    {
        return (int)Value;
    }

    public int CompareTo(PositiveInteger other)
    {
        if (Value == other.Value) return 0;
        return Value < other.Value ? -1 : 1;
    }

    public override string ToString()
    {
        return Value.ToString(CultureInfo.InvariantCulture);
    }
}

还有一个小测试:

void Test()
{
    var list = new List<PositiveInteger> {5, 1, 3};
    list.Sort();  // 1,3,5

    var a = new PositiveInteger(1);
    var b = new PositiveInteger(2);

    var c = a + b;    // = 3
    var d = c - b;    // = 1
    var e = d - a;    // throws ArgumentOutOfRangeException
}

答案 2 :(得分:1)

尝试使用此构造函数。但它仍然不是一个好主意,因为您在使用之前仍应验证所有数据。就像在盲目分割之前检查分母不为零一样。

public class PositiveInteger {
    private uint _value;

    public PositiveInteger(int x) {
        if (x < 1) {
            throw new Exception("Invalid value.  Value is not positive.");
        }
        _value = x;
    }
}