C#-StyleCop-SA1121:UseBuiltyPealias-可读性规则

C#-StyleCop-SA1121:UseBuiltyPealias-可读性规则,c#,code-analysis,rules,stylecop,C#,Code Analysis,Rules,Stylecop,在StyleCop帮助手册中找不到它,在这里是SO和Google SO;) 在使用StyleCop期间,我有一个警告: SA1121-使用内置Pealias- 可读性规则 该代码使用一个基本的C语言# 类型,但不使用内置 类型的别名 而不是使用类型名或 完全限定类型名 这些类型的内置别名 应始终使用:bool,byte, 字符、十进制、双精度、短字符、整数、, long、object、sbyte、float、string、, 乌肖特,乌因特,乌龙 所以String.Empty是错误的(取决于上述

在StyleCop帮助手册中找不到它,在这里是SO和Google SO;)

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

SA1121-使用内置Pealias- 可读性规则

该代码使用一个基本的C语言# 类型,但不使用内置 类型的别名

而不是使用类型名或 完全限定类型名 这些类型的内置别名 应始终使用:bool,byte, 字符、十进制、双精度、短字符、整数、, long、object、sbyte、float、string、, 乌肖特,乌因特,乌龙

所以
String.Empty
是错误的(取决于上述规则),而
String.Empty
是好的


为什么使用内置别名更好?可以
字符串。Int32
Int64
(等)在特殊情况下会使代码复杂化?

如果您有自己的
字符串
Int32
等类型,这些类型最终可能会被用来代替
系统。*
-请不要这样做

归根结底,这是个人的偏好。我在任何地方都使用别名,但我知道有些人(如杰弗里·里克特)建议永远不要使用别名。保持一致可能是个好主意,仅此而已。如果您不喜欢StyleCop规则,请禁用它


请注意,方法等的名称应使用框架名称而不是别名,以便与语言无关。这对于私有/内部成员来说并不重要,但是对于私有方法,您可以使用与公共方法相同的规则

因为内置别名是用该语言表达概念的更自然的方式


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

这个StyleCop规则假设使用别名对所谓的“普通语言用户”带来的混淆更少。例如,它知道“long”类型,但不知怎么的,它害怕“System.Int64”类型,并且会感到困惑,然后看到它。就我个人而言,我认为保持代码风格的一致性很重要,不可能让所有人都满意。

只是想澄清一下:并非所有人都同意StyleCop的作者。Win32和.NET大师Jeffrey Richter在他的优秀著作中写道:

C#语言规范指出,“就风格而言,使用关键字比使用 使用完整的系统类型名称。”我不同意语言规范;我更喜欢 使用FCL类型名称并完全避免使用基元类型名称。事实上,我希望如此 编译器甚至没有提供原语类型名称,并迫使开发人员使用FCL 改为键入名称。以下是我的理由:

  • 我看到许多开发人员感到困惑,不知道是否要使用string字符串。因为在C#中,字符串(关键字)正好映射到 System.String(FCL类型),两者没有区别,都可以使用。同样地, 我听一些开发人员说,int表示应用程序运行时的32位整数 在32位操作系统上运行,并且当应用程序 正在64位操作系统上运行。这种说法是完全错误的:在C#中,int总是映射 到System.Int32,因此它表示一个32位整数,而与操作系统无关 代码正在上运行。如果程序员在他们的代码中使用Int32,那么 也消除了混淆

  • 在C#中,long映射到System.Int64,但在另一种编程语言中,long 可以映射到Int16Int32。事实上,C++/CLI确实将long视为Int32。 用一种语言阅读源代码的人很容易误解代码的含义 如果他或她习惯于使用不同的编程语言进行编程,则表示意图。 事实上,大多数语言甚至不会将long视为关键字,也不会编译代码 那就用它

  • FCL有许多方法,它们的方法名中包含类型名。对于 例如,BinaryReader类型提供了一些方法,如ReadBooleanReadInt32ReadSingle等,而System.Convert类型提供了以下方法 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#ISM逐渐进入了 类库代码。例如,微软的FCL几乎完全是用C#和 FCL团队的开发人员现在已经在库中引入了如下方法 数组的GetLongLength,该数组返回一个Int64值,该值在C#中是long,但不是 使用其他语言(如C++/CLI)。另一个例子是System.Linq.Enumerable LongCount方法


不那么混乱?对我来说,基本数据类型(传统上只是一个值)包含静态函数似乎非常合适。如果只是存储一个值,我理解使用与之等价的基本数据类型,但是为了访问类的成员,在基本类型名称后面加一个。(点)似乎非常合适。

一个类比可能会有所帮助:string对于System.string就像musket对于riff一样。字符串是旧语言的遗物,是为老程序员提供的。C#没有“内置”数据类型,这些别名是p