在StyleCop帮助手册中没有找到它,在SO和Google上,所以这里是;)
在StyleCop使用期间,我有一个警告:
SA1121 - UseBuiltInTypeAlias - 可读性规则
代码使用了一个基本的C# 类型,但不使用内置 该类型的别名。
而不是使用类型名称或 完全限定的类型名称, 这些类型的内置别名 应始终使用:bool,byte, char,decimal,double,short,int, long,object,sbyte,float,string, ushort,uint,ulong。
所以String.Empty
是错误的(取决于上述规则)并且string.Empty
是好的。
为什么使用内置别名更好?可以String. Int32
,Int64
(等)在特殊情况下的代码中复杂化吗?
答案 0 :(得分:54)
只是澄清一下:并非所有人都同意StyleCop的作者。 Win32和.NET大师Jeffrey Richter在他出色的书CLR via C#中写道:
C#语言规范指出,“作为一种风格,关键字的使用受到青睐 使用完整的系统类型名称。“我不同意语言规范;我更喜欢 使用FCL类型名称并完全避免基本类型名称。事实上,我希望如此 编译器甚至没有提供原始类型名称,并迫使开发人员使用FCL 改为输入名称。以下是我的理由:
我看到很多开发人员感到困惑,不知道是否使用字符串 或者代码中的字符串。因为在C#字符串(一个关键字)中完全映射到 System.String (一种FCL类型),没有区别,任何一种都可以使用。同样的, 我听说有些开发人员说应用程序时 int 表示32位整数 在32位操作系统上运行,并且它在应用程序时表示64位整数 正在64位操作系统上运行。这句话绝对是错误的:在C#中, int 总是映射 到 System.Int32 ,因此无论操作系统如何,它都代表一个32位整数 代码正在运行。如果程序员在他们的代码中使用 Int32 ,那么这个潜力 混乱也被消除了。
在C#中,长映射到 System.Int64 ,但使用其他编程语言长 可以映射到 Int16 或 Int32 。实际上,C ++ / CLI确实将 long 视为 Int32 。 有人用一种语言阅读源代码很容易误解代码 如果他或她习惯于使用不同的编程语言进行编程。 事实上,大多数语言甚至不会将 long 视为关键字,也不会编译代码 使用它。
FCL有许多方法,它们将类型名称作为其方法名称的一部分。对于 例如, BinaryReader 类型提供了诸如 ReadBoolean , ReadInt32 等方法, ReadSingle 等等, System.Convert 类型提供了诸如 ToBoolean , ToInt32 , ToSingle ,依此类推。尽管编写以下内容是合法的 代码, float 的行对我来说感觉非常不自然,而且这条线是不明显的 正确的:
BinaryReader br = new BinaryReader(...); float val = br.ReadSingle(); // OK, but feels unnatural Single val = br.ReadSingle(); // OK and feels good
许多使用C#的程序员都倾向于忘记其他编程 语言可以用来对付CLR,正因为如此,C#-isms进入了 类库代码。例如,微软的FCL几乎全部用C#编写 FCL团队的开发人员现在已经将方法引入了库中 数组的 GetLongLength ,在C#中返回 Int64 值 long ,但不是 在其他语言中(如C ++ / CLI)。另一个例子是 System.Linq.Enumerable LongCount 方法。
答案 1 :(得分:20)
如果你有自己的String
,Int32
等类型可能最终被用来代替System.*
,那么代码真的会变得复杂 - 请不要这样做!
最终,这是个人偏好。我到处都使用别名,但我知道有些人(例如Jeffrey Richter)建议从不使用它们。保持一致可能是一个好主意,就是这样。如果您不喜欢StyleCop规则,请将其禁用。
请注意,方法等的名称应使用框架名称而不是别名,以便与语言无关。这对私人/内部成员来说并不那么重要,但您可能对私有方法的规则与公共方法的规则相同。
答案 2 :(得分:1)
因为内置别名是用这种语言表达概念的更自然的方式。
有些文化说足球,有些人说足球。哪一个更合适取决于具体情况。
答案 3 :(得分:0)
这个StyleCop规则假设使用别名可以减少对所谓的“普通语言用户”的混淆。例如,它知道'long'类型,但在某种程度上可怕的'System.Int64'类型并且混淆然后看到它。就个人而言,我认为只是在你的代码风格中一致是重要的,它不可能满足每个人。
答案 4 :(得分:0)
不那么混乱?对于我来说,基本数据类型(传统上只是一个值)对于包含静态函数似乎非常不方便。我理解使用等价的基本数据类型,如果你只是存储一个值,但是为了访问类的成员,在基类型名称之后添加。(点)似乎非常不合适。
答案 5 :(得分:0)
类比可能会有所帮助: string 是 System.String ,因为步枪是步枪。 string 是旧语言的遗留物,为旧程序员提供。 C#没有“内置”数据类型,这些别名是为那些在这个概念上遇到问题的“C”程序员提供的。