我有时需要上网查找教程。我经常发现有些人会这样写代码:
this.button1.Text = "Random Text";
然后我找到像这样的代码:
button1.Text = "Random Text";
使用this.whatever
是否更好或者无关紧要?
答案 0 :(得分:10)
这取决于。这是一个示例类:
class A
{
private int count;
public A(int count)
{
this.count = count;
}
}
在这种情况下,“这个”。是强制性的,因为它消除了赋值左侧的引用的歧义。没有它,您不清楚读取代码“count”是指参数还是字段。 ( 对编译器来说是明确的,它有遵循的规则。)但在大多数情况下,这纯粹是一个偏好问题。
答案 1 :(得分:7)
编写所有代码以强调读者的重点。如果您认为读者清楚地了解标识符是指实例成员,那么请使用this
。如果您认为它是一个不重要且分散注意力的实现细节,请不要这样做。使用良好的判断力使您的代码可读。
答案 2 :(得分:3)
没关系,这是一种风格问题。我倾向于省略this
,因为它只是精神上解析的额外代码。
唯一重要的是当本地变量和实例变量之间存在命名冲突时,this
可用于消除字段和局部变量之间的歧义。
以下是 重要的情况类型示例:
public class Foo
{
private string x;
public Foo(string x)
{
// x = x; Assigns local parameter x to x, not what we want
this.x = x; // Assigns instance variable x to local parameter x: this disambiguates between the two.
}
}
答案 3 :(得分:3)
this
只是为了说清楚,在某些情况下我们必须使用this
:
区分parameter
和local member
:
//local member
object item;
private void SomeMethod(object item){
this.item = item;//must use this
}
将当前的类实例传递给另一个方法:
public class SomeClass {
private void SomeMethod(SomeClass obj){
//....
}
private void AnotherMethod(){
SomeMethod(this);//pass the current instance into SomeMethod
//.....
}
}
在扩展方法中使用:
public static class SomeClassExtension {
public static void SomeClassMethod(this SomeClass obj){
//use obj as a reference to the object calling this method...
}
}
从另一个构造函数(具有不同签名)调用构造函数:
public Form1(string s) : this() {//Call the Form1() before executing other code in Form1(string s)
//......
}
用于声明索引器:
public class SomeClass {
//declare an index returning a string
public string this[int index] {
get {return ...}
set { ... }
}
}
在struct
中使用自动属性:
public struct SomeStruct {
public object AutoProp1 {get;set;}
public object AutoProp2 {get;set;}
public SomeStruct() : this() //must use this
{
AutoProp1 = someObject;
AutoProp2 = someObject;
}
}
将当前实例强制转换为基类/类型:
public class ClassB : ClassC {
//...
}
public class ClassA : ClassB {
public ClassA(){
((ClassC)this).MemberOfClassC ... ;//There might be some member in ClassC
//which is overridden in ClassA or ClassB, casting to ClassC can help we invoke the original member instead of the overridden one.
}
}
this
可能还有其他用途,但如果我想出来,我会稍后更新。
答案 4 :(得分:2)
使用this
的示例可以是在范围内已有类似变量时访问类变量。 Otherwise it is mostly of choice
。
实施例
public class Test
{
public string firstName { get; set; }
public void temp(string firstName)
{
firstName = this.firstName;
}
}
答案 5 :(得分:2)
关于字段,明确需要this
的唯一情况是存在命名冲突时:
public class Foo
{
private string bar;
public Foo(string bar)
{
this.bar = bar;
}
}
所以有些人会在前面加下划线:
public class Foo
{
private string _bar;
public Foo(string bar)
{
_bar = bar;
}
}
答案 6 :(得分:2)
通常没关系。您可以使用this.
的原因是明确表示您要引用属于当前类的属性/字段。
同样,在您可能需要这种情况的情况下并不多,但是例如,您可能有一个与类级别属性/字段同名的局部变量。然后你可以使用this.
。
例如:
class MyClass
{
string s = "1";
void MyFunction(string s)
{
//s = local value as passed in to function
//this.s = "1"
}
}
答案 7 :(得分:1)
通常并不重要。 this关键字“引用类的当前实例,并且还用作扩展方法的第一个参数的修饰符。”
查看这篇文章。
答案 8 :(得分:1)
正如其他人已经指出的那样,它有助于区分字段/属性和方法变量,需要this
的另一个地方是调用当前实例上的扩展方法。例如,this.ExtensionMethod();
可以使用,但不仅仅是ExtensionMethod();
除此之外,它是个人选择的问题,有些人称之为冗余,有些人喜欢使用它。这完全取决于你和你的团队。
我个人喜欢将this
与类成员一起使用,特别是对于Forms方法,如果使用winform的代码隐藏,如this.Close();
有关何时使用this
的详细信息,请参阅:When do you use the "this" keyword?
答案 9 :(得分:1)
通常没关系,但是如果你把一个名为button1的变量传递给一个已经有一个名为button1的成员的类方法,那么你需要消除你真正想要的那个。
这可能就是为什么人们现在使用this.
来明确说明你的意思,如果你一直使用这种做法,那么在少数重要的情况下你就不会错。
当然,您可以确保所有成员变量都具有唯一名称,例如使用m_
这样的前缀,但现在已经过时了,人们更愿意写出this.
答案 10 :(得分:1)
这实际上取决于具体情况。
http://msdn.microsoft.com/en-us/library/dk1507sz(v=vs.80).aspx
- 限定以类似名称隐藏的成员
- 将对象作为参数传递给其他方法
- 申报指数