如何创建一个自定义数据类型,像其他通用数据类型一样支持算术运算。

问题描述 投票:0回答:1

我正试图创建一个新的UInt24类型。为此,我使用了一个结构(欢迎提出更好的建议)。虽然我现在能够将一个变量投向这个新定义的类型,但我无法支持通用算术。我已经用显式和隐式运算符尝试了一堆东西,但我并没有真正理解它是如何工作的。这就是我的情况。

namespace MySytem
{    
    public struct UInt24
    {
        internal uint m_value;

        public static explicit operator UInt24(uint v) => new UInt24(v);

        public const uint MaxValue = (uint)0xFFFFFF;
        public const short MinValue = unchecked((short)0x000000);

        public UInt24(uint v)
        {
            if (v > MaxValue)
            {
                throw new ArgumentOutOfRangeException(nameof(v), $"Value too big - Max is {MaxValue}.");
            }
            if (v < MinValue)
            {
                throw new ArgumentOutOfRangeException(nameof(v), $"Value too small - Min is {MinValue}.");
            }

            this.m_value = v;
        }
    }
}

现在,这让我可以做这样的事情。

UInt24 a = (UInt24)0x123456;

但我想做的是能够做到这一点。

UInt24 a = (UInt24)0x123456;
a++;       // Not working
a--;       // Not working
a = a + 1  // Not working

还有,有没有一种方法可以让我在声明一个UInt24变量的时候 不需要投掷数字,而不是:

UInt24 a = (UInt24)0x123456;

我们能不能直接这样做?

UInt24 a = 0x123456;    // No casting needed
c# struct casting arithmetic-expressions
1个回答
1
投票

你可以隐式定义你的操作符。

public static implicit operator UInt24(uint v) { return new UInt24(v); }

你需要实现+, -, ++, 和 -- 运算符。

public static UInt24 operator +(UInt24 u1, UInt24 u2) { return u1.m_value + u2.m_value; }
public static UInt24 operator -(UInt24 u1, UInt24 u2) { return u1.m_value - u2.m_value; }
public static UInt24 operator ++(UInt24 u1) { return u1.m_value + 1; }
public static UInt24 operator --(UInt24 u1) { return u1.m_value - 1; }

然后就可以执行算术运算了

UInt24 u24_1 = 0x000001;
UInt24 u24_2 = u24_1 + 0x000001;
u24_1++;
u24_2--;
Console.WriteLine("{0}", u24_1);
Console.WriteLine("{0}", u24_2);

同时建议覆盖ToString():

public override string ToString()
{
    return m_value.ToString();
}

结果是:

2
1
© www.soinside.com 2019 - 2024. All rights reserved.