可能重复:
Why does StyleCop recommend prefixing method or property calls with “this”?
When do you use the “this” keyword?何时使用this.method()?
嗨SO,快乐星期五 我有关于使用this.method的()问题;.我的代码似乎没有使用这个工作,但我包括它,因为它似乎是正确的事情。什么时候应该这样使用,而且因为它的存在并不总是有所作为,所以.this的最佳实践是什么?
可能重复:
Why does StyleCop recommend prefixing method or property calls with “this”?
When do you use the “this” keyword?何时使用this.method()?
嗨SO,快乐星期五 我有关于使用this.method的()问题;.我的代码似乎没有使用这个工作,但我包括它,因为它似乎是正确的事情。什么时候应该这样使用,而且因为它的存在并不总是有所作为,所以.this的最佳实践是什么?
我的意见:使用this
作为消歧的目的,例如,当参数名称与类属性相冲突时,否则将它放在较小的噪音范围内。
为了可读性和易理解性,每当调用实例成员时,都应该使用this.
。它被认为是最好的实践和StyleCop suggests it too:
(有了这个前缀)类的所有调用 成员(是)立即识别, 这无论编辑被 用来查看代码。另一个优点是它创建了一个快速, 实例成员和静态成员 之间的可识别区分,它们不加前缀。
使用'this。' 前缀的最后一个优点是键入此。会导致 Visual Studio显示IntelliSense 弹出式窗口,使 开发人员可以快速轻松地选择类别 成员进行调用。
换句话说,如果你省略了这个。前缀你不能很快理解,因此soemthing是一个静态成员,一个局部变量,一个代表... 随着前缀,你会看到它的第一次。
但最重要的是:无论您选择什么,您都应该在整个文件中以及所有其他文件中保持一致,并且也可以在整个团队中保持一致!
有效,如果你在使用相同名称的范围有一个以上的项目(例如一个实例变量和一个同名的局部变量)
在你所描述的情况下使用的this
关键字作为消歧最有用
一个方式,你真正需要的是,当传递一个命名为成员参数
在构造
MYCLASS(INT ID){ this.id = ID; }
当引用一个变量时,this.
可以区分局部变量或参数和成员变量。但是当提到一种方法时,它并没有提供任何有用的区别,因此,对我的思考方式,codejunk。丢开。
它将实例方法与静态方法(和委托)区分开来,当您的代码库同时包含这两个方法时,这非常有用。 – 2010-05-28 13:49:18
感谢您的更正,@Jeff;我不知道在C#中可以有同名的静态和实例方法;我会认为这是一个糟糕的做法 - 但我是一个爪哇人。我会更新答案。 – 2010-05-28 14:34:48
对不起,我不清楚!我并不是说你可以在C#中使用相同名称的静态和实例方法(你不能),只需知道*在调用站点*是否有价值*你所调用的是静态还是实例成员(或委托人)。 – 2010-05-28 14:37:47
到目前为止,您已经得到了两个不同意见的答案,所以我会将我的观点作为前Java,前C#以及现在最主要的Python程序员加入。在Python中,我们有self
,几乎完成相同的工作,只是它不是可选的。
我会说尽可能经常使用this
。它不会改变任何东西,因为当你从一个对象中调用它时它是隐含的,但它确实有助于区分,所以你知道你正在调用一个类成员(相对于全局函数)。
当你在一年的时间里阅读代码时,你会感激你的。
我通常不会离开'这个'。在代码中。但是,当我不记得这是什么时,我确实将它用于智能感知目的。包含的内容。然后我删除它。
但是你必须保留它的一个例子是限定类似名称隐藏的成员。例如:
public Employee(string name, string alias)
{
this.name = name;
this.alias = alias;
}
如果调用不是模糊不清的,您不需要它,但我更喜欢使用它。在我看来,Bar仅仅通过foo.Property和foo.Method()来访问Foo的属性和方法,并且以this.Property和this.Method()访问它自己的成员。你仍然在处理对象的属性和方法,除了在this
的情况下,你正在处理同一类中的成员。但为什么这件事在编码风格上呢?我们一直使用this
。它很干净,很清楚,并且一致。
有几个人提到了使用this
关于成员变量。我建议......
或者:
this.
或者:
_leadingUnderscore
Stylecop规则可以设置为执行您的团队喜欢的这些规则中的任何一个。
这指向当前对象,它基本上用于移除的用于例如
方法/变量名的模糊性
public class Test
{
private string name;
public Test(string name)
{
this.name = name;//using this coz the parameter name and variable names are same
}
}
你不需要总是使用它。
我希望它能帮助你。
当你修改代码时(你通常会这样做),你将不得不更新所有现在变成ambiguos或者不再有模糊的地方。现实告诉我们,你很可能不会这样做,让你的代码处于不稳定的状态 - 可读性明智。 – bitbonk 2010-05-28 13:58:26