C# 自定义数据类型![复制]
-
26-09-2019 - |
题
可能的重复:
.Net 中的 Int128?
当我决定在 C# 中实现 Int128 后,我认为让它看起来像其他 dotNet 数据类型会很好。但我无法实现以下功能:
- 后缀初始化:如13L和0.2D
我可以在 C# 中创建自己的后缀吗?
如果我不能..我怎样才能初始化它?
IE
Int128 a= ??
解决方案
您无法创建自己的后缀初始值设定项 - 这是语言的一部分并嵌入到编译器中。另一方面,如果您编写自己的 C# 编译器,则可以做任何您想做的事情并以您希望的方式扩展它。
至于如何初始化它——这取决于你如何编写它。如果它是一个类,则需要使用以下命令对其进行初始化 new
关键字,或者编写一些到精度较低的数字类型的隐式转换。
正如乔恩指出的,您将无法实际将其设置为大于 ulong.MaxValue
没有一些字符串操作。您还必须以某种形式在内部表示(字符串?一些 ulongs
?)并确保所有转换和操作正常工作(溢出怎么办?)。
其他提示
不,您无法在 C# 中创建自己的文字形式。
你 可以 有一个隐式转换 int
, long
, uint
和 ulong
, ,允许:
Int128 a = 100;
但你不能指定大于 ulong.MaxValue
那样。
有一个隐式转换 decimal
将允许更大的范围,但这将是一个坏主意,因为您将丢失任何不仅仅是整数的值的数据。
基本上没有什么可以允许文字保证为整数的值大于 ulong.MaxValue
- 你可以解析一个字符串,但这并不是很理想。或者你可以创建一个构造函数 二 ulongs,一种用于底部 64 位,一种用于顶部 64 位。
不,您不能进行后缀初始化。即将推出的 C++ 标准将提供这种可爱之处……但我离题了。
最明显的选择是 Int128(long hi, ulong lo)
和 Int128(string)
.
您可以查看 4.0 中新的 BigInteger 结构以获取有关初始化的提示。 http://msdn.microsoft.com/en-us/library/system.numerics.biginteger.aspx