C# – StyleCop – SA1121:UseBuiltInTypeAlias – 可读性规则

在StyleCop帮助手册中没有find它,在SO和谷歌,所以在这里;)

在使用StyleCop时,我有一个警告:

SA1121 – UseBuiltInTypeAlias – 可读性规则

该代码使用基本的C#types之一,但不使用该types的内置别名。

bool,byte,char,decimal,double,short,int,long,object,sbyte,float,string应该始终使用这些types的内置别名,而不是使用types名称或完全限定types名称。 ,ushort,uint,ulong。

所以String.Empty是错误的(取决于上面的规则)和string.Empty是好的。

为什么使用内置的别名更好? 可以String. Int32 String. Int32Int64 (等)复杂的东西在特殊情况下的代码?

只是为了澄清:并不是所有人都同意StyleCop的作者。 Win32和.NET大师杰弗里·里希特(Jeffrey Richter) 通过C#在他的优秀书CLR中写道:

C#语言规范指出:“就风格而言,使用关键字比使用完整的系统types名称更受欢迎。”我不同意语言规范。 我更喜欢使用FCLtypes名称,并完全避免原始types名称。 事实上,我希望编译器甚至不提供原始types名称,并强迫开发人员使用FCLtypes名称。 这是我的原因:

  • 我看到一些开发人员感到困惑,不知道是否在代码中使用stringstring 。 因为在C#中, string (一个关键字)完全映射到System.String (一个FCLtypes),所以没有区别,可以使用。 同样,我听说一些开发人员说,当应用程序在32位操作系统上运行时, int代表32位整数,而当应用程序在64位操作系统上运行时,代表64位整数。 这个语句是绝对错误的:在C#中,一个int总是映射到System.Int32 ,因此它表示一个32位整数,无论​​代码运行在哪个操作系统上。 如果程序员在他们的代码中使用Int32 ,那么这个潜在的混淆也被消除了。

  • 在C#中, long映射到System.Int64 ,但是使用不同的编程语言, long可以映射到Int16Int32 。 实际上,C ++ / CLI确实把它当作一个Int32 。 有人用一种语言阅读源代码,如果他们习惯用不同的编程语言编程,就很容易误解代码的意图。 实际上,大多数语言甚至不会将长时间视为关键字,也不会编译使用它的代码。

  • FCL有许多方法名称都是types名称的一部分。 例如, BinaryReadertypes提供诸如ReadBooleanReadInt32ReadSingle等方法,而System.Converttypes则提供ToBooleanToInt32ToSingle等方法。 虽然写下面的代码是合法的,但是带有float的行对我来说感觉非常不自然,而且行不正确:

     BinaryReader br = new BinaryReader(...); float val = br.ReadSingle(); // OK, but feels unnatural Single val = br.ReadSingle(); // OK and feels good 
  • 许多使用C#的程序员倾向于忘记其他编程语言可以用于CLR,正因为如此,C#主题蔓延到类库代码中。 例如,Microsoft的FCL几乎全部是用C#编写的,而FCL团队的开发人员现在已经在库中引入了方法,例如ArrayGetLongLength ,它返回一个Int64值,这个值在C#中很长 ,但是在其他语言中却不是(比如C ++ / CLI)。 另一个例子是System.Linq.EnumerableLongCount方法。

如果你有自己的StringInt32等types的代码,那么这个代码只会让代码变得复杂,而不是System.* ,请不要这样做!

最终这是个人喜好。 我到处都使用别名,但我知道有些人(例如Jeffrey Richter)build议不要使用它们。 保持一致可能是一个好主意,就是这样。 如果您不喜欢StyleCop规则,请将其禁用。

请注意,方法等名称应使用框架名称而不是别名,以便与语言无关。 这对于私人/内部成员来说不是那么重要,但是你也可以像私人方法一样对私人方法有相同的规则。

因为内置别名是用这种语言expression概念的更自然的方式。

有些文化说足球,有些则说足球。 哪一个更合适取决于上下文。

这个StyleCop规则假定使用别名对所谓相信的“普通语言用户”引入较less混淆。 哪个知道,例如,“长”types,但不知何故可怕的“System.Int64”types,并感到困惑,然后看到它。 就个人而言,我认为这只是为了保持代码风格的一致性不可能满足每个人

较less混淆? 对于我来说,对于一个基本的数据types(传统上只是一个值)来说,包含静态函数似乎非常尴尬。 我理解使用等价的基本数据types,如果你只是存储一个值,但为了访问类的成员,似乎非常尴尬地把。(点)后面的基本types名称。

类比可能会有所帮助: stringSystem.String作为步枪是步枪。 string是旧语言的遗迹,是为旧程序员提供的。 C#没有“内置”数据types,这些别名是为那些对这个概念有困难的“C”程序员提供的。