我见过一些指南或博客说使用this
访问班级自己的成员是不好的。但是,我也看到了一些专业人士使用this
访问的地方。我倾向于明确地使用this
,因为它似乎清楚地表明我正在访问的东西是该类的一部分。
this.MyProperty = this.GetSomeValue();
使用this
有什么优点或缺点?这只是一种风格偏好吗?
答案 0 :(得分:13)
如果它增加了代码的清晰度,请使用它,如果它没有。有一些地方确实增加了清晰度 - 例如在C ++中:
struct Point {
int x, y;
Point & operator=( const Point & p ) {
this->x = p.x;
this->y = p.y;
return *this;
}
};
在这种情况下,当你有两个相同类型的对象要引用时,我发现使用this
可以澄清事情(尽管注意在C ++中不需要上面的赋值运算符实现)。
答案 1 :(得分:6)
我总是使用this.
因为它在我看来使代码更具可读性。它立即清楚
base.
)或覆盖成员(this.
)this.Monster.Legs.Run();
vs Monster.Legs.Run();
)成员的调用。答案 2 :(得分:3)
有时需要,例如在构造函数(在C#或Java中)中,如果要从同名参数中指定字段。
答案 3 :(得分:3)
从使用this
多年来,到找不到很多人(至少根据我的经验)使用它,我最终改变了。我可以看到有这么少的代码的好处:
_myVar
,因为它们总是成员变量,所以不需要this
。e.g。
someclass.Method(1);
SomeClass.StaticMethod(1);
我可以看到,如果你不使用下划线命名约定,并且拥有一个体重较大的大方法,可能会导致一些混乱。
静态方法或属性偶尔会混淆事物,但很少。
传递引用时,显然总是需要this
关键字,例如:
someclass.Method(this);
var someclass = new SomeClass(this);
(我写C#,但我的答案与Java 相关)
答案 4 :(得分:3)
我使用 this ,因为它对我来说似乎更具可读性。和...
StyleCop规则 SA1101:PrefixLocalCallsWithThis 说:
<强>原因强>
在C#代码文件中,对本地类的实例成员或基类的调用不带有“this。”前缀。
规则说明
只要代码包含对本地类的实例成员的调用或没有以“this”为前缀的基类,就会发生违反此规则的情况。当存在基类成员的本地覆盖时,会发生此规则的例外,并且代码打算直接调用基类成员,绕过本地覆盖。在这种情况下,调用可以以'base。'为前缀,而不是'this。'。
默认情况下,StyleCop不允许使用下划线或m_来标记本地类字段,而使用'this。'前缀。使用'this。'的优点是它同样适用于所有元素类型,包括方法,属性等,而不仅仅是字段,使得对类成员的所有调用都可以立即识别,无论使用哪个编辑器查看代码。另一个优点是它可以在实例成员和静态成员之间创建一个快速,可识别的区别,这些区分不是前缀。
使用'this。'前缀的最后一个好处就是输入这个。将导致Visual Studio显示IntelliSense弹出窗口,使开发人员可以快速轻松地选择要调用的类成员。
如何修复违规行为
要修复违反此规则的行为,请在调用类成员之前插入“this。”前缀。
答案 5 :(得分:2)
关于C ++,当使用模板时,有时必要使用this
来帮助编译器进行名称解析:
template <typename T>
class Base {
public:
void exit();
};
template <typename T>
class Derived : Base<T> {
public:
void foo() {
exit(); // calls external exit() or error
// so you should use this->exit() if that was your intent
}
};
答案 6 :(得分:2)
一般规则应该是:使用“this”来避免含糊不清,如果你所提到的内容很明显,请不要使用它。
例如,在Java中编程时,不需要this.getSomeValue()
,因为所有函数调用都是对“this”的方法调用。另一方面,如果您的方法中存在大量局部变量,或者存在静态成员变量,并且您希望明确访问实例变量,则this.myProperty
可能很有用。
当然,有时“这个”是不可避免的,如
void setX(int x){ this.x = x; }
答案 7 :(得分:1)
它很不受欢迎,几乎所有的时间都在普遍使用。我从不像那样使用“这个”。
人们这样做是因为他们在编辑器中通过输入“this”然后输入“dot”来获得Intellisense。当自动代码生成器进行编码时,您也会在很多地方看到它。
现在关于为什么在整个代码中使用“this”的问题是一个坏主意。首先,它可以作为一个拐杖来掩盖缺乏良好的命名惯例。例如,我认为这段代码是“编码恐怖”:
class Fudge {
public decimal PoundsOfChocolate {get; set;}
Fudge (decimal PoundsOfChocoloate) {
this.PoundsOfChocolate = PoundsOfChocolate;
}
}
呸。最好使用商定的命名约定:
class Fudge {
public decimal PoundsOfChocolate {get; set;}
Fudge (decimal poundsOfChocoloate) {
PoundsOfChocolate = poundsOfChocolate;
}
}
为什么这样更好?好吧,在像上面这个例子这样简单的案例中,这并不重要。当函数变长时,事情会变得更糟,并且在复杂函数中有私有变量可能会与您的成员发生冲突。
另外,如果你用“this”关键词加密你的代码,由于有更多的重复文本,它会变得更难阅读。而且在没有添加语义的情况下它更加冗长。没有添加语义的IMO更加冗长是不好的。我的两分钱。向下打动你想要的一切。
这并不是说“this”没有有效用途。离得很远。如果您使用它来解决调用基本成员和当前对象中的成员之间的区别,那么它就有它的位置。它在代码生成器中也占有一席之地。但是,威士忌告诉我,过度使用任何东西都会导致痛苦。
答案 8 :(得分:1)
在objective-c
...
prop = value; // just an assignment
...
和
...
self.prop = value; // !!! equivalent to method call [self setProp:value]
...
差别很大 - 你必须知道你正在做什么和为什么。
答案 9 :(得分:0)
我同意戴夫的观点。它更长。
这只是风格问题,没有其他影响。
答案 10 :(得分:0)
它主要用于构造函数和初始化函数(我更喜欢这种样式的各种下划线):
MyClass(hisValue) { this->hisValue = hisValue; }
在任何地方使用这种风格只是一种让人想起匈牙利符号的语法膨胀。如果保持函数合理地缩短,则代码的读者可以立即识别局部变量和函数参数。如果声明不在屏幕内,那么可以假设它是一个类成员 - 所以'this'表示法不会添加任何有用的信息。
答案 11 :(得分:0)
我总是使用 this ,原因很简单:
(C#中的示例但不会有所作为)
举个例如这样的课:
class Foo {
private int count = 0;
public List<Int32> foos = new List<Int32>();
public int DoCounting() {
foreach (Int32 foo in foos) {
if (foo > 50) ++count;
}
return count;
}
}
现在你公司的另一个编码器必须快速添加一个功能,即计算另一个循环。他没有查看你的代码,只是因为时间关键要求而添加了他自己的代码(或者因为它是上午11:59并且他想要休息一下):
class Foo {
private int count = 0;
public List<Int32> foos = new List<Int32>();
public List<Int32> bars = new List<Int32>();
public int DoCounting() {
int count = bars.Count;
for (int i = 0; i < count; ++i) {
bars[i]++;
}
foreach (Int32 foo in foos) {
if (foo > 50) ++count;
}
return count;
}
}
现在会发生什么?通过总是使用它可以轻松地防止这种情况吗?
Ofc这个例子是不现实的,但它很容易在更复杂的类和方法中发生,并且很难跟踪错误。
答案 12 :(得分:0)
使用此功能可使代码更清晰,更易读。您也别无选择,只能在参数名称与成员变量相同的情况下使用。你如何区分这两者?
class Test {
int a;
void doA(int a) {
this.a = a; //if you do a=a its gonna be a bug really hard to catch
}
}
答案 13 :(得分:0)
我建议始终使用this
,除非代码的行为方式不同,如果不这样做的话。它至少可以作为程序员/读者的语法糖,表明RHS来自当前的类。
此外,在某些语言中(Perl为1),如果不使用对象引用,则在解析RHS时不使用继承层次结构。例如如果在父项中定义了methodName,那么$this->methodName()
将起作用,但methodName()
将失败,因为只搜索当前包。
答案 14 :(得分:0)
在像{/ 1>这样的代码中constructor
非常有用
this.field = field;
变得更具可读性。我也会提出方法! this
的着色也没有伤害。