【发布时间】:2011-04-16 22:08:21
【问题描述】:
背景
我正在编写一个托管的 x64 汇编器(它也是一个库),因此它有多个类,这些类定义了一个无符号 64 位整数属性,用作地址和偏移量。有些是文件偏移,有些是绝对地址(相对于主内存),还有一些是相对虚拟地址。
问题
我对上述场景中的属性使用ulong 数据类型,这很好用。但是,此类属性不符合 CLS。我可以将它们标记为[ClsCompliant(false)],但我需要为图书馆的用户提供符合 CLS 的替代方案。
选项和问题
一些suggest 提供具有更大数据类型的替代属性,但这不是一个选项,因为没有更大的有符号整数原语可以保存从0 到UInt64.MaxValue 的所有值。
我宁愿不将我的整个程序集标记为不符合 CLS,因为在大多数使用场景中,并非所有可能的值都被使用到 UInt64.MaxValue。所以,例如Address 我可以提供一个替代的long 属性AddressAlternative,它只接受正值。但是,当Address 以某种方式包含高于Int64.MaxValue 的值时会发生什么。 AddressAlternative 应该抛出一些异常吗?
AddressAlternative 的合适名称是什么?
为ulong 的每次使用提供替代方案将导致许多“双重”属性。有一个更好的方法吗?请注意,并非所有 ulong 属性的用法都具有相同的语义,因此单个 struct 不会削减它。
最后,我在构造函数参数中遇到了同样的 CLS 合规性问题。那么我应该为这样的参数提供一个接受long 的替代重载吗?
我不介意在仅用于 CLS 的上下文中限制库的(某些功能)的使用,只要它可以在大多数情况下使用。
【问题讨论】:
-
您是否预计该库中有很多用户使用需要严格遵守 CLS 的语言?您有多少客户将使用不支持 ulong 的语言的库?
-
您的评论“并非所有 ulong 属性的用法都具有相同的语义,因此单个结构不会削减它”似乎是一个可能的解决方案。比如说,如果偏移量和地址具有不同的语义,那么为什么不制作一个围绕 ulong 的 Offset 和 Address 结构,它可以强制执行您想要的任何语义?你甚至可以有重载的操作符,这样地址 + 地址是非法的,但地址 + 偏移量会生成一个新地址。
-
它将是开源的,因此这取决于严格的 CLS 语言的可用性。编写库时,CLS 合规性非常高advised。
-
确实,它回答了我的一些问题。但这不会导致大量代码重复吗?我知道使用 ulong 的至少三种不同的语义类型。然后我将问题转移到新的 Address 类型:它将包含一些可以返回当前地址值的属性,但是当它表示 Int64.MaxValue 以上的无符号地址时,替代属性应该返回什么?
-
@Virtlink:我认为正如 Eric 所建议的那样,使用“语义结构”是这里的方法。也就是说,我认为您根本不应该对它们有任何属性-只需提供转换运算符:从
ulong和decimal的显式转换,以及到ulong和decimal的隐式转换。为什么decimal?它是唯一覆盖ulong整个范围且不损失精度的其他标准类型,您可以轻松地检查没有小数部分。
标签: c# cls-compliant uint64