最好的方法是查看现有整数数据类型之一的来源。例如Int16
.
如果您查看该类型,您会发现它实现了一些接口:
[Serializable]
public struct Int16 : IComparable, IFormattable, IConvertible, IComparable<short>, IEquatable<short> { /* ... */ }
该类型的实现不是很复杂。它有一个MaxValue
a MinValue
,几个CompareTo
重载,几个Equals
重载,System.Object
覆盖(GetHashCode
,,GetType
(ToString
加上一些重载)),一些Parse
和ToParse
重载以及一系列IConvertible
实现。
在其他地方,您可以找到算术、比较和转换运算符之类的东西。
但是:
你System.Int16
不能拥有的是:
internal short m_value;
这是保存该值的本机类型(16 位整数)成员。没有 4 位本机类型。您将能够做的最好的事情是在您的实现中拥有一个本机字节来保存该值。您可以编写将其限制为低 4 位的访问器,但除此之外您无能为力。如果有人创建了一个Nibble
数组,它将被实现为这些值的数组。据我所知,没有办法将您的实现注入该数组。类似地,如果有人创建了一些其他集合(例如List<Nibble>
),那么该集合将是您类型的实例,每个实例将占用 8 位。
然而
您可以创建专门的集合类、NibbleArray
、NibbleList
等。C# 的语法允许您为集合提供自己的集合初始化实现、您自己的索引方法等。
所以,如果有人这样做:
var nyblArray = new NibbleArray(32);
nyblArray[4] = 0xd;
然后,您的代码可以在幕后创建一个 16 元素字节数组,将第三个字节的低半字节设置为 0xd。
同样,您可以实现代码以允许:
var newArray = new NibbleArray { 0x1, 0x3, 0x5, 0x7, 0x9, 0xa};
或者
var nyblList = new NibbleList { 0x0, 0x2, 0xe};
一个普通的数组会浪费空间,但是你的专门的集合类会做你所说的(以一些位扭曲为代价)。