为什么StyleCop推荐使用“this”的前缀方法或属性调用?

我一直在试图遵循St​​yleCop的一个项目的指导方针,看最后的代码是否更好。 大多数规则是合理的,或者是关于编码标准的一个意见问题,但有一条规则使我困惑,因为我没有看到其他人推荐它,而且我也没有看到明显的好处:

SA1101:对{方法或属性名称}的调用必须以“this”开头。 前缀以指示该项目是类的成员。

不利的一面是,代码显然更加冗长,那么遵循这个规则有什么好处呢? 这里有人遵守这个规则吗?

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

  • 告诉静态和实例成员分开。 (并将实例方法与代表区分开来。)
  • 区分实例成员与本地variables和参数(不使用命名约定)。

除非我在需要的情况下,否则我不会真正遵循这一指导:

  • 有一个实际的歧义 – 主要是影响要么构造函数( this.name = name; )或像Equalsreturn this.id == other.id;
  • 你想传递一个对当前实例的引用
  • 你想调用当前实例的扩展方法

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

我认为这篇文章解释了一点

http://blogs.msdn.microsoft.com/sourceanalysis/archive/2008/05/25/a-difference-of-style.aspx

…在微软,一个优秀的年轻开发人员(好吧,这是我)决定自己写一个小工具,它可以检测出在他的团队中使用的C#风格的差异。 StyleCop诞生了。 在接下来的几年中,我们收集了微软各个团队所能find的所有C#风格指南,并挑选出了这些风格所共有的所有最佳实践。 这些形成了第一套StyleCop规则。 这个工作最早出现的规则之一就是使用这个前缀来调出类成员,并从字段名称中删除任何下划线前缀。 C#风格已经从其旧的C ++部落正式成长起来。

请注意,编译器不关心是否使用this前缀引用(除非与本地variables和字段发生名称冲突,或者您想在当前实例上调用扩展方法)。

这取决于你的风格。 我个人删除this. 从代码我认为它降低了信噪比。

只是因为微软内部使用这种风格并不意味着你必须。 StyleCop似乎是一个MS内部公开的工具。 我都是遵守微软公约的惯例,比如:

  • types名称在PascalCase中
  • 参数名称在camelCase中
  • 接口应该以字母I作为前缀
  • 使用单数名称的枚举,除了当他们是[标志]

…但是在你的代码的私有领域里发生的事情是私有的。 做任何你的团队同意。

一致性也很重要。 阅读代码时,它会减less认知负担,特别是如果代码风格如您所愿。 但是,即使在处理国外的编码风格时,如果它是一致的,那么习惯它也不会花费很长时间。 使用ReSharper和StyleCop等工具来确保您认为重要的一致性。

使用.NET Reflector表明微软在BCL中坚持StyleCop编码标准并不是那么好。

使用this一些基本原因(和我巧合总是以它们所属的类的名字作为前缀类的值 – 甚至在类本身中)。

1)清晰。 你知道这个瞬间你在类定义中声明了哪些variables,以及你声明为本地variables,参数和什么。 在两年内,你将不会知道这一点,如果你事先明确说明了父母的话,你将会进行一次奇妙的重新发现的旅程。 其他人从事你的代码不知道从一开始,因此立即受益。

2)智能感知。 如果你input“这个”。 您可以获得帮助中所有特定于实例的成员和属性。 这使得查找事情变得容易很多,特别是如果你维护别人的代码或代码,这些代码或代码在几年之内就没有看过。 它还可以帮助您避免由于误解variables和方法在哪里以及如何声明而导致的错误。 它可以帮助你发现错误,否则直到编译器在你的代码中窒息才会显示错误。

3)通过使用前缀和其他技术,可以达到相同的效果,但是这引出了一个问题:为什么当有一种机制可以创build一种机制来处理问题时, IDE? 如果你触摸式,即使是部分触摸式,它也将最终降低你的错误率,也不会强迫你将手指从原来的位置移到下划线键。

我看到很多年轻的程序员在没有input一两个字符的情况下就会节省大笔的时间。 大部分时间将用于debugging,而不是编码。 别担心你的打字速度。 更多地了解您能够快速理解代码中发生了什么。 如果您总共节省了五分钟的编码时间,并且花费了十分钟的时间进行debugging,那么无论您的速度如何,您都会放慢速度。

 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。”的用法只不过是一个开发者真正不懂代码或者他们在做什么的开发工具。 99%的人希望编写易于阅读和维护的代码。

一旦你开始input,Intellisence会列出你正在input的范围内的可用内容,“这个”。 没有必要暴露类的成员,除非你完全不知道你正在编码什么,你应该能够很容易地find你需要的项目。

即使你完全无知,用“这个”。 提示什么是可用的,但不要把它放在代码中。 还有一些像Resharper这样的附加组件,可以帮助我们更清楚地了解范围并更有效地揭示对象的内容。 学习如何使用提供给你的工具来培养一个被大量同事所憎恨的坏习惯会更好。

任何本质上不了解静态,本地,类或全局内容的开发人员不应该依赖“提示”来指示范围。 “这个。” 匈牙利符号至less是匈牙利符号,因为至less匈牙利符号提供了一个关于variables所引用的types的概念,并且有一定的好处。 我宁愿用“_”或“m”来表示class级成员,然后看“这个”。 到处。

我从来没有遇到过问题,也没有看到一个与开发人员反复打斗的代码,或者是因为没有使用“this”而编写的代码总是很麻烦的问题。 明确。 “这”是一种无理的恐惧。 防止未来的代码错误,并经常在无知被重视的地方使用。

随着经验的增长,“这个”。 就像是要求某人把自己的自行车上的训练轮子当成人一样,因为这是他们第一次学习如何骑自行车。 成年人可能会跌落一千倍,但这并不是强迫他们使用训练车轮的理由。

“这个。” 应该被禁止从C#的语言定义,不幸的是只有一个原因使用它,这是解决歧义,这也可以通过更好的代码做法很容易解决。

我确实遵循这个原则,因为我觉得乍一看能够分辨出对静态和实例成员的访问是非常方便的。

当然,我必须在我的构造函数中使用它,因为我通常给它的构造函数参数赋予与赋值给它的值相同的名字。 所以我需要“这个”来访问这些字段。

另外,可以在一个函数中重复variables名,所以使用“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; } } 

我主要是为了intellisense的原因。 打字this.是很好的this. 并获得物业,方法等conslist名单