我们的编码标准“规则”之一是:
- 使用通用类型系统。例如,使用
Int32
代替int
。
我之前没有看过类似的规则,尽管我们的其他指南大致基于微软的Design Guidelines Digest。它似乎不像Common Type System那样。
我觉得不方便,因为我最终不得不重写默认的Visual Studio和ReSharper重构来将string
转换为String
,float
转换为Single
,{{1} } long
等
它的应用也相当不一致(例如,不适用于Int64
到object
),可能是因为它带来的不便,并且没有StyleCop规则来检查它是否已应用。
因此,我想知道为什么要制定这条规则。可能有充分的理由吗?是否有任何情况(可能是历史性的)必须使用Object
代替Int32
?
更新:
我阅读了推荐的框架设计指南(2006,Cwalina& Adams)第3.2.3节避免语言特定名称,并指出“避免使用这些特定于语言的类型名称 in identifier “(我的重点)。同意。
然而,杰弗里里希特继续发表评论“我更进一步,从不使用该语言的别名[因为它]没有增加任何价值,并引入了巨大的混乱”。 也许这就是这条规则的来源?
答案 0 :(得分:3)
我怀疑这条规则来自对框架指南的错误解释。
指南在General Naming Conventions部分说明:
在标识符没有超出其类型的语义含义的极少数情况下,请使用通用公共语言运行时(CLR)类型名称而不是特定于语言的名称。
例如,将数据转换为
Int16
的方法应命名为ToInt16
,而不是ToShort
,因为Short
是Int16
的特定于语言的类型名称}。
如果您创建包含类型作为其名称一部分的标识符,例如一组SomeType ReadSomeType()
方法,那么您应该使用SomeType
的实际类型名称而不是C#别名。< / p>
以不同语言工作的程序员可能会将不同的含义与类型联系起来。例如,如果你有一个ReadFloat()
方法,那么C#程序员会假设它返回System.Single
,而一个F#程序员会认为它返回System.Double
。因此,您应将其命名为ReadSingle
或ReadDouble
。
此规则不适用于您在代码中引用类型的简单类型名称。一个使用你的库的程序员永远不会看到你使用的那个。
答案 1 :(得分:2)
建议Class Library Developers参考公开的名称:
在标识符没有超出其类型的语义含义的极少数情况下,请使用通用公共语言运行时(CLR)类型名称而不是特定于语言的名称。
但是,据我所知,从来没有人提出建议。内部变量。
答案 2 :(得分:0)
我无法想到这一点,但我必须通过说我只使用3.5+版本的框架并且可能有一些我不知道的历史原因来警告这一点。基本上,简单类型(int
)只是预定义struct
类型(System.Int32
)的别名。有些观点可能会帮助您确定这样做的原因是不必要的,直接来自C#laungage指南......
&#34; 简单类型通过保留字(sbyte
,byte
,...,int
,long
标识, ...,float
,double
),但这些保留字只是struct
命名空间中预定义System
类型的别名(System.SByte
,{{1 },...,System.Byte
等)。因为简单类型别名为System.Int32
类型,所以每个简单类型都有成员。例如,struct
的成员在int
中声明,成员从System.Int32
继承,声明如
System.Object
是允许的。&#34;
这继续下去,普通的第一句话是,简单的类型只是别名 - 就是它。没有理由做你所描述的事情。
我希望这会有所帮助。
答案 3 :(得分:0)
如果您在多语言环境中工作,或者您正在开发框架或共享库,则此规则是有意义的。
Firts,它保证CLS支持所有使用的类型(参见1)。其次,它避免了由不同.Net语言中具有不同名称的相同类型引起的混淆。
本主题在“框架设计指南:可重用.Net库的约定,惯用法和模式”一书中讨论,我强烈推荐。