4

我们的编码标准“规则”之一是:

  • 使用通用类型系统。例如,使用Int32代替int.

我以前没有见过类似的规则,尽管我们的其他指南大致基于 Microsoft 的设计指南文摘。看起来也不是通用类型系统

我发现这很不方便,因为我最终不得不重写默认的 Visual Studio 和 ReSharper 重构以转换stringStringfloatto SinglelongtoInt64等。它的应用也相当不一致(例如,不是objectto Object),可能是由于它的不便,并且没有 StyleCop 规则存在以检查它是否已应用。

因此,我想知道为什么会制定此规则。有什么好的理由吗?是否有任何情况(可能是历史性的)Int32必须使用而不是int例如?

更新

我通读了推荐的框架设计指南(2006 年,Cwalina 和 Adams)第 3.2.3 节避免使用特定语言的名称,它们指出“避免在标识符中使用这些特定于语言的类型名称很重要”(我的重点)。同意。

然而,Jeffrey Richter 继续评论“我更进一步,从不使用该语言的别名 [因为它] 没有增加任何价值并引入了巨大的混乱”。也许这就是这条规则的来源?

4

4 回答 4

3

我怀疑这条规则来自对框架指南的误解。

该指南在通用命名约定部分中说:

在标识符在其类型之外没有语义含义的极少数情况下,请使用通用公共语言运行时 (CLR) 类型名称,而不是特定于语言的名称。

例如,将数据转换为的方法Int16应该命名为ToInt16,而不是ToShort因为Short是特定于语言的类型名称Int16

如果您创建的标识符包含一个类型作为其名称的一部分,例如一组SomeType ReadSomeType()方法,那么您应该使用实际的类型名称SomeType而不是 C# 别名。

使用不同语言工作的程序员可能会将不同的含义与类型相关联。例如,如果您有一个ReadFloat()方法,C# 程序员会假设它返回System.Single,而 F# 程序员会假设它返回System.Double。所以你应该命名它ReadSingleReadDouble.

此规则不适用于在代码中用于引用类型的简单类型名称。使用您的库的程序员永远不会看到您使用了哪个。

于 2012-06-29T11:12:43.177 回答
2

对于Class Library Developers有一个建议,参考公开的名称:

在标识符在其类型之外没有语义含义的极少数情况下,请使用通用公共语言运行时 (CLR) 类型名称,而不是特定于语言的名称。

然而,据我所知,它从来都不是关于内部变量的推荐。

于 2012-06-29T10:57:42.537 回答
0

我想不出任何原因,但我必须警告说我只使用了框架的 3.5+ 版本,并且可能有一些我不知道的历史原因。基本上简单类型 ( int) 只是预定义struct类型 ( System.Int32) 的别名。一些可能会帮助您确定这样做的原因是不必要的点,直接来自 C# laungage 指南......

"简单类型通过保留字(sbyte, byte, ... , int, long, ... , float, double)标识,但这些保留字只是命名空间中预定义struct类型的别名SystemSystem.SByte, System.Byte, ... System.Int32, 等)。因为一个简单类型给一个类型起别名struct, 每个简单类型都有成员. 例如int有声明System.Int32的成员和继承自的成员System.Object和语句

int i = int.MaxValue;    // System.int32.MaxValue constant.
string s = i.ToString(); // System.Int32.ToString() instance method.

被允许。”

这继续下去,但一般的要点是简单类型只是别名 - 就是这样。没有理由做你所描述的事情。

我希望这有帮助。

于 2012-06-29T10:31:56.523 回答
0

如果您在多语言环境中工作,或者您正在开发框架或共享库,则此规则是有意义的。

首先,它保证 CLS 支持所有使用的类型(参见1)。其次,它避免了由于相同类型在不同.Net 语言中具有不同名称而可能造成的混淆。

我强烈推荐这本书“框架设计指南:可重用 .Net 库的约定、惯用语和模式”一书中讨论了这个主题。

通用语言规范

于 2012-06-29T10:44:09.373 回答