我已经开发了一个自定义整数类型。这是它在C#中的定义。
public struct PitchClass
{
private readonly int value;
private PitchClass(int value)
{
this.value = CanonicalModulus.Calculate(value, 12);
}
public static implicit operator PitchClass(int value)
{
return new PitchClass(value);
}
public static implicit operator PitchClass(double value)
{
return new PitchClass((int)Math.Round(value));
}
public static implicit operator int(PitchClass pitchClass)
{
return pitchClass.value;
}
}
PitchClass
是一个int
,其值在[0,11]范围内。
您可以从C#代码中读取,int
和double
的值都可以使用规范模运算符隐式转换为PitchClass
:
PitchClass pitchClass = -3;
Console.WriteLine(pitchClass); // 9
在隐式转换过程中,double
的值也会四舍五入:
PitchClass pitchClass = -3.4d;
Console.WriteLine(pitchClass); // 9
我找不到其他自定义数据类型的示例,这些示例对要转换的数据类型做了很多事情。
为什么?这是不好的做法吗?如果是这样,还有另一种方法可以避免对每种方法中的每个PitchClass变量进行参数验证吗?
谢谢
答案 0 :(得分:2)
创建基本类型并将其转换为其他基本数据类型是不错的做法。也不能定义隐式和显式转换。
看一下Int32 in the .Net Framework的实现。该结构实现了许多接口,以使其可转换为其他结构类型,从而很好地对其进行格式化以及其他一些东西。
如果您打算大量使用此结构,则实现IConvertible,IComparable,IEquatable(以及GetHashCode()和Equals()方法)是一个好主意,因为几乎所有本机数据类型都这样做。
复杂类型在the explanation for IConvertible interface中作为“自定义”数据类型的示例给出,它们在与其他类型之间进行了许多不同的转换。
此外,从double到int的显式转换也和您所做的一样,使转换变窄(可能导致数据丢失)。