繁体   English   中英

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

[英]How do you create your own DataType?

我想创建自己的数据DataType称为positiveInteger

我知道你在想什么

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

现在您可能会告诉我,创建一个名为positiveInteger的类。 是的,我可以创建一个名为positiveIntegerClass但是我不知道如何实现该类,以便此新DataType仅接受正整数值?

如果您希望能够“接受”( 大多数情况下 )编译为常量int值的值,则需要实现从intpositiveIntegerimplicit转换

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

这样您就可以像这样分配一个positiveInteger

positiveInteger number = 5;

但是,它也可以分配一个int

int i = 5;
positiveInteger number = i;    // This will throw an exception when i <= 0

一个示例实现可以是:

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
}

为您的构造函数尝试一下。 但这并不是一个好主意,因为您仍应在使用前验证所有数据。 就像在盲目除法之前检查分母是否为零一样。

public class PositiveInteger {
    private uint _value;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM