我阅读了这个答案及其评论,我很好奇:有什么理由不使用this
/ Self
/Me
吗?
BTW:很抱歉,如果之前有人问过这个问题,似乎无法this
在 SO 上搜索这个词。
我阅读了这个答案及其评论,我很好奇:有什么理由不使用this
/ Self
/Me
吗?
BTW:很抱歉,如果之前有人问过这个问题,似乎无法this
在 SO 上搜索这个词。
警告:以下纯属主观答案。
我认为不使用 this/self/me 的最佳“理由”是简洁。如果它已经是成员变量/函数,那么为什么要冗余添加前缀?
我个人避免使用 this/self/me 除非有必要为编译器消除特定表达式的歧义。很多人不同意这一点,但在我工作过的任何团队中,我从来没有认为它是一个真正的症结所在。
我认为已经引用的两篇文章已经涵盖了大多数常见场景;主要是简洁和冗余与清晰 - 一个小补充:在 C# 中,需要使用“this”才能访问当前类型的“扩展方法” - 即
this.Foo();
where 在Foo()
外部声明为:
public static void Foo(this SomeType obj) {...}
它在某些情况下进行了澄清,例如 c# 中的这个示例:
public class SomeClass
{
private string stringvar = "";
public SomeClass(string stringvar)
{
this.stringvar = stringvar;
}
}
如果您使用带有所有规则的 StyleCop,它会让您this.
加入。自从我开始使用它以来,我发现我的代码更具可读性,但这是个人喜好。
我认为这不是问题,因为它只会增加代码的可读性,这是一件好事。
对于某些语言,例如 PHP,如果您需要使用类字段或方法,甚至必须使用 $this-> 作为前缀。
我不喜欢这样一个事实,即如果 PHP 有某种方法可以在没有它的情况下引用类成员,它会使某些行不必要地长于它们可能的长度。
我个人觉得这this.whatever
不太可读。您可能不会注意到 2 行方法的区别,但请等到您在课堂上的任何地方this.variable
。this.othervariable
此外,我认为使用 ofthis.
可以替代部分令人讨厌的匈牙利符号。有些人发现,读者更清楚地看到变量是类成员,并且this.
成功了。但是,如果我们需要额外的清晰度,为什么要自欺欺人而不使用普通的旧的"m_"
或简单的呢?"_"
这是 5 个字符对 2 个(甚至 1 个)。更少的打字,相同的结果。
话虽如此,风格的选择仍然是个人喜好的问题。很难说服曾经以某种对更改代码有用的方式阅读代码的人。
好吧,eclipse用不同的颜色为字段、参数和局部变量着色,所以至少在eclipse环境中工作,不需要在语法上区分字段,以便专门将它们标记为你自己和后代的“字段”。
在“java中的变量”上下文中确实有人问过:
主要原因似乎是:
“它增加了你需要筛选以找到代码含义的视觉噪音。”
可读性,换句话说......我不买,我觉得this.
非常有用。
这对我来说听起来像是胡说八道。使用“this”可以使代码更好,我看不出有什么问题。像这样的政策是愚蠢的(至少当你甚至不告诉人们为什么要实施这些政策时)。
至于我,我this
用来调用实例化对象的方法,而self
用于静态方法
归根结底,这始终是个人选择的问题。就个人而言,我使用这种编码约定:
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”发布了完全相同的示例。
'这。' in code 总是向我暗示编码器使用了智能感知(或其他 IDE 等效项)来完成繁重的工作。
我当然对此感到内疚,但是出于纯粹的虚荣原因,我会在之后删除它们。
我使用它们的唯一其他原因是限定不明确的变量(不好的做法)或构建扩展方法
限定变量
string name; //should use something like _name or m_name
public void SetName(string name)
{
this.name = name;
}
在 VB.NET 中,我使用的一种常见做法是以下代码:
Class Test
Private IntVar AS Integer
Public Function New(intVar As Integer)
Me.Intvar = intvar
End Function
End Class
并非一直如此,但主要是 Me / this / self 非常有用。阐明您正在谈论的范围。
在典型的 setter 方法中(取自 lagerdalek 的回答):
string name;
public void SetName(string name)
{
this.name = name;
}
如果你不使用它,编译器就不会知道你指的是成员变量。
的用途this.
是告诉编译器您需要访问一个成员变量——它超出了方法的直接范围。在方法中创建与成员变量同名的变量是完全合法的,就像在扩展了另一个类的类中重写方法是完全合法的一样。
但是,如果您仍然需要使用超类的方法,请使用super.
在我看来使用 this。并不比使用超级差。并允许程序员在其代码中具有更大的灵活性。
就我而言,可读性甚至不涉及它,这完全与变量的可访问性有关。
我不仅经常使用“this”。我有时用“那个”。
class Foo
{
private string bar;
public int Compare(Foo that)
{
if(this.bar == that.bar)
{
...
等等。我的代码中的“那个”通常意味着同一类的另一个实例。