定义“custom"基于整数类型
本文关键字:整数 类型 于整数 custom quot 定义 | 更新日期: 2023-09-27 18:10:05
我有一个程序,它与一个外部库接口,除其他外,在一个更大的结构体中封装了一个无符号的12位值。
这曾经是8位,所以我们简单地将其封送为一个字节。
现在它是12位…我可以使用ushort,但这会带来(a)范围检查和(b)封送处理的问题。
是否有一种简单的方法来实现像这样的约束数字类型,在那里我不必覆盖每个赋值和比较方法?
试试这个(这个例子显示了一个自定义的Int64类型)
public class MyCustomInt64 : CustomValueType<MyCustomInt64, Int64>
{
private MyCustomInt64(long value) : base(value) {}
public static implicit operator MyCustomInt64(long value) { return new MyCustomInt64(value); }
public static implicit operator long(MyCustomInt64 custom) { return custom._value; }
}
在构造函数中实现你喜欢的约束。
使用MyCustomInt64 myInt = 27; //use as like any other value type
这里是可重用的基本自定义值类型(如果需要,可以添加更多操作符)
public class CustomValueType<TCustom, TValue>
{
protected readonly TValue _value;
public CustomValueType(TValue value)
{
_value = value;
}
public override string ToString()
{
return _value.ToString();
}
public static bool operator <(CustomValueType<TCustom, TValue> a, CustomValueType<TCustom, TValue> b)
{
return Comparer<TValue>.Default.Compare(a._value, b._value) < 0;
}
public static bool operator >(CustomValueType<TCustom, TValue> a, CustomValueType<TCustom, TValue> b)
{
return !(a < b);
}
public static bool operator <=(CustomValueType<TCustom, TValue> a, CustomValueType<TCustom, TValue> b)
{
return (a < b) || (a == b);
}
public static bool operator >=(CustomValueType<TCustom, TValue> a, CustomValueType<TCustom, TValue> b)
{
return (a > b) || (a == b);
}
public static bool operator ==(CustomValueType<TCustom, TValue> a, CustomValueType<TCustom, TValue> b)
{
return a.Equals((object)b);
}
public static bool operator !=(CustomValueType<TCustom, TValue> a, CustomValueType<TCustom, TValue> b)
{
return !(a == b);
}
public static TCustom operator +(CustomValueType<TCustom, TValue> a, CustomValueType<TCustom, TValue> b)
{
return (dynamic) a._value + b._value;
}
public static TCustom operator -(CustomValueType<TCustom, TValue> a, CustomValueType<TCustom, TValue> b)
{
return ((dynamic) a._value - b._value);
}
protected bool Equals(CustomValueType<TCustom, TValue> other)
{
return EqualityComparer<TValue>.Default.Equals(_value, other._value);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != this.GetType()) return false;
return Equals((CustomValueType<TCustom, TValue>)obj);
}
public override int GetHashCode()
{
return EqualityComparer<TValue>.Default.GetHashCode(_value);
}
}
您应该创建一个覆盖隐式转换操作符的结构体:
struct PackedValue {
private PackedValue(ushort val) {
if(val >= (1<<12)) throw new ArgumentOutOfRangeException("val");
this._value = val;
}
private ushort _value;
public static explicit operator PackedValue(ushort value) {
return new PackedValue(value);
}
public static implicit operator ushort(PackedValue me) {
return me._value;
}
}