.net 为什么StyleCop建议在方法或属性调用前加上“this”?

tjvv9vkg  于 2023-05-08  发布在  .NET
关注(0)|答案(9)|浏览(136)

我一直在尝试遵循StyleCop的项目指导方针,看看最终产生的代码是否更好。大多数规则都是合理的,或者是关于编码标准的意见问题,但有一条规则让我感到困惑,因为我没有看到其他人推荐它,因为我看不到它的明显好处:

SA 1101:对{method or property name}的调用必须以'this.'前缀开始,以表示该项是该类的成员。

缺点是,这样的代码显然更冗长,那么遵循该规则有什么好处呢?这里有人遵守这个规则吗?

vsnjm48y

vsnjm48y1#

我并不真正遵循这个指导,除非我在你需要的场景中:

  • 这里有一个 * 实际的 * 模糊性-主要这会影响构造函数(this.name = name;)或像Equalsreturn this.id == other.id;)这样的东西
  • 要传递对当前示例的引用
  • 要在当前示例上调用扩展方法

除此之外,我认为这是混乱。所以我把规则关掉。

chhqkbe1

chhqkbe12#

它可以使代码一目了然。当你使用this时,更容易:

  • 区分静态成员和示例成员。(并区分示例方法和委托。)
  • 将示例成员与局部变量和参数区分开(不使用命名约定)。
bogh5gae

bogh5gae3#

我想这篇文章稍微解释了一下
A Brief History Of C# Style
微软的一位才华横溢的年轻开发人员(好吧,是我)决定自己写一个小工具,可以检测他的团队中使用的C#风格的差异。StyleCop诞生了。在接下来的几年里,我们从微软的各个团队中收集了所有我们能找到的C#风格指南,并挑选出这些风格共同的所有最佳实践。这些构成了StyleCop的第一套规则。最早的规则之一是使用this前缀来调用类成员,并从字段名称中删除任何下划线前缀。C#风格正式脱离了它的旧C++部落。

ekqde3dh

ekqde3dh4#

this.This 
this.Does 
this.Not 
this.Add 
this.Clarity 
this.Nor 
this.Does 
this.This 
this.Add 
this.Maintainability 
this.To 
this.Code

如果过度使用“this.”,或者是强制性的风格要求,那么它只不过是一种伪装,伪装成只有不到1%的开发人员真正不理解代码或他们在做什么,并且让99%想要编写易于阅读和维护的代码的人感到痛苦。
只要你开始输入,Intellisence就会列出你输入的范围内可用的内容,“this.”对于公开类成员是不必要的,除非你完全不知道你在为什么编码,否则你应该能够很容易地找到你需要的项目。
即使您完全不知道,也可以使用“this.”来提示可用的内容,但不要将其留在代码中。还有大量的附加组件,如Resharper,有助于使范围更加清晰,并更有效地公开对象的内容。最好是学会如何使用提供给你的工具,然后养成一个坏习惯,这是你的同事讨厌的大量。
任何不了解静态、局部、类或全局内容的范围的开发人员都不应该依赖“提示”来指示范围。“this.”比匈牙利表示法更糟糕,因为至少匈牙利表示法提供了一个关于变量引用的类型的想法,并提供了一些好处。我宁愿看到“_”或“m”用于表示类字段成员,而不是到处都看到“this.”。
我从来没有遇到过这样的问题,也没有见过一个开发人员反复与代码范围作斗争,或者编写的代码总是有错误,因为没有明确使用“this”。这是一种毫无根据的恐惧,即“这”可以防止未来的代码错误,并且经常被用于重视无知的论点。
程序员随着经验的增长而成长,“这个”就像要求某人在成年后在自行车上安装训练轮,因为这是他们第一次学习如何骑自行车。成年人骑上自行车的1,000次中有1次可能会从车上摔下来,但这并不是强迫他们使用训练轮的理由。
“this.”应该从C#的语言定义中被禁止,不幸的是,使用它的原因只有一个,那就是解决歧义,这也可以通过更好的代码实践轻松解决。

nue99wik

nue99wik5#

使用this的几个基本原因(碰巧的是,我总是用它们所属的类的名称作为类值的前缀--甚至在类本身中也是如此)。
1)清晰。你现在就知道你在类定义中声明了哪些变量,哪些变量被声明为局部变量,参数等等。两年后,你不会知道这一点,你会开始一段奇妙的重新发现之旅,如果你事先明确说明父母,这是毫无意义的,也是不必要的。在你的代码上工作的其他人从一开始就不知道,因此立即受益。
2)智能感知如果键入“this.”,则会在帮助中获取所有示例特定的成员和属性。它使查找东西变得容易得多,特别是如果您正在维护其他人的代码或几年没有看过的代码。它还可以帮助您避免由于对在何处以及如何声明哪些变量和方法的误解而导致的错误。它可以帮助您发现错误,否则这些错误不会显示,直到编译器阻塞您的代码。
3)当然,您可以通过使用前缀和其他技术来实现相同的效果,但这就引出了一个问题:当IDE实际支持的语言中内置了一种处理问题的机制时,为什么要发明一种处理问题的机制呢?如果你使用触摸输入,即使只是部分触摸输入,它最终也会降低你的错误率,因为它不会强迫你把手指从原始位置移开,以到达下划线键。
我看到很多年轻的程序员,他们把不输入一两个字符所保存的时间看得很重。你的大部分时间将花在调试上,而不是编码上。不要太担心你的打字速度。更多地担心你能多快地理解代码中发生了什么。如果你总共保存了5分钟的编码时间,却多花了10分钟的调试时间,那么不管你看起来有多快,你都已经放慢了速度。

fae0ux8s

fae0ux8s6#

请注意,编译器并不关心您是否使用this作为引用的前缀(除非局部变量和字段发生名称冲突,或者您希望在当前示例上调用扩展方法)。
这取决于你的风格。就我个人而言,我从代码中删除了this.,因为我认为它会降低信噪比。
仅仅因为微软在内部使用这种风格并不意味着你必须这样做。StyleCop似乎是一个公开的微软内部工具。我完全赞成在公共事务方面遵守微软的惯例,例如:

  • 类型名称采用PascalCase
  • 参数名称采用驼峰大小写
  • 接口应使用字母I作为前缀
  • 枚举使用单数名称,除非它们是[Flags]

......但是在代码的私有领域中发生的事情是,好吧,私有的。做你的团队同意的事情。
一致性也很重要。它减少了阅读代码时的认知负荷,特别是如果代码风格与您所期望的一样。但即使是在处理一种外国的编码风格时,如果它是一致的,那么它不会花很长时间来适应它。使用ReSharper和StyleCop等工具来确保您认为重要的一致性。
使用.NET Reflector表明,微软在BCL中坚持StyleCop编码标准方面并不出色。

jhkqcmku

jhkqcmku7#

我确实遵循了它,因为我认为能够一眼区分对静态成员和示例成员的访问确实很方便。
当然,我必须在构造函数中使用它,因为我通常给予构造函数参数的名字与它们的值被赋值的字段的名字相同。所以我需要“这个”来访问字段。

j9per5c4

j9per5c48#

此外,函数中可以重复变量名,因此使用“this”可以使其更清晰。

class foo {
  private string aString;

  public void SetString(string aString){
    //this.aString refers to the class field
    //aString refers to the method parameter        
    this.aString = aString; 
  }
}
mbjcgjjk

mbjcgjjk9#

我主要是出于“智能”的原因。输入this.并获得属性、方法等的一致列表真是太好了。

相关问题