Are there any reasons not to use “this” (“Self”, “Me”, …)?
我阅读了此答案及其评论,但我很好奇:是否有不使用
顺便说一句:很抱歉,如果以前已经问过这个问题,看来不可能在SO上搜索单词
警告:以下纯主观回答。
我认为不使用此/自己/我的最佳"理由"是简洁。如果已经是成员变量/函数,那么为什么要多余地添加前缀?
我个人避免使用this / self / me,除非有必要为编译器消除特定表达式的歧义。许多人不同意这一点,但是我从来没有在任何一个工作团队中找到真正的症结所在。
我认为大多数常见的情况已经在已经引用的两个帖子中介绍过;主要是简洁性和冗余性与清晰度之间的差异-较小的补充:在C#中,为了访问当前类型的"扩展方法",需要使用" this"-即
1 | this.Foo(); |
其中
1 | public static void Foo(this SomeType obj) {...} |
在某些情况下,例如c#中的示例,它可以澄清:
1 2 3 4 5 6 7 8 9 | public class SomeClass { private string stringvar =""; public SomeClass(string stringvar) { this.stringvar = stringvar; } } |
如果在所有规则上都使用StyleCop,则可以放入
好吧,eclipse会以不同的颜色来显示颜色字段,参数和局部变量,因此至少在eclipse环境中运行时,无需语法上区分字段即可为自己和后代特别地将它们标记为"字段"。
我个人发现
此外,我认为使用
话虽如此,样式的选择仍然是个人喜好问题。很难说服曾经用某种方式读取代码的人对更改代码很有用。
我认为这不是问题,因为这只会增加代码的可读性,这是一件好事。
对于某些语言,例如PHP,如果需要使用类字段或方法,甚至必须在$ this->前面加上前缀。
我不喜欢这样的事实,如果PHP可以通过某种方式来引用类成员而不使用它,那么它会使某些行的长度不必要地更长。
'这个。'代码中的代码总是向我暗示,编码器已经使用了intellisense(或其他等效的IDE)来完成繁重的工作。
我当然对此感到内gui,但是出于纯粹虚荣的原因,我确实将其删除。
我使用它们的唯一其他原因是限定不明确的变量(不好的做法)或构建扩展方法
限定变量
1 2 3 4 5 6 | string name; //should use something like _name or m_name public void SetName(string name) { this.name = name; } |
听起来对我来说是胡说八道。使用" this"可以使代码更好,并且我看不到任何问题。这样的政策是愚蠢的(至少在您甚至没有告诉人们他们为什么实行的时候)。
确实在" java变量"上下文中有人问过:
您是否在Java中为实例变量加上" this"前缀?
经常性的主要原因似乎是:
"it increases the visual noise you need to sift through to find the meaning of the code."
可读性,换句话说...我不买,我发现
我不仅经常使用" this"。我有时会使用"那个"。
1 2 3 4 5 6 7 8 9 | class Foo { private string bar; public int Compare(Foo that) { if(this.bar == that.bar) { ... |
等等。我的代码中的" that"通常表示同一类的另一个实例。
在典型的二传手方法中(取自lagerdalek的答案):
1 2 3 4 5 6 | string name; public void SetName(string name) { this.name = name; } |
如果您不使用它,编译器将不会知道您在引用成员变量。
但是,如果仍然需要使用超类的方法,则在我看来,可以使用
就我而言,可读性甚至没有涉及,这全都涉及变量的可访问性。
在VB.NET中,我使用的一种常见做法是以下代码:
1 2 3 4 5 6 | Class Test Private IntVar AS Integer Public Function New(intVar As Integer) Me.Intvar = intvar End Function End Class |
并非一直如此,但大多数情况下,我/这个/自我非常有用。阐明您正在讨论的范围。
最后,这始终是个人选择的问题。我个人使用以下编码约定:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public class Foo { public string Bar { get { return this.bar; } /*set { this.bar = value; }*/ } private readonly string bar; public Foo(string bar) { this.bar = bar; } } |
因此,对我来说," this"实际上是使构造函数可读的必要条件。
编辑:我在编写上面的代码时," sinje"发布了完全相同的示例。
对我来说,我使用