我有时需要上网查找一些教程。我经常发现有些人这样写代码:
this.button1.Text = "Random Text";
然后我发现代码是这样的:
button1.Text = "Random Text";
是使用更好this.whatever
还是没关系?
这取决于。这是一个示例类:
class A
{
private int count;
public A(int count)
{
this.count = count;
}
}
在这种情况下,“这个”。是强制性的,因为它消除了赋值左侧的引用的歧义。如果没有它,您阅读代码并不清楚“count”是指参数还是字段。(编译器很清楚,它有规则要遵循。)但在大多数情况下,这纯粹是一个偏好问题。
编写所有代码以向读者强调要点。如果您认为让读者清楚地理解标识符指的是实例成员很重要,那么请使用this
. 如果您觉得这是一个不重要且分散注意力的实现细节,请不要这样做。使用良好的判断力使您的代码具有可读性。
没关系,风格问题。我倾向于省略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.
}
}
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
,但如果我想到了,我稍后会更新。
this
当您在范围内已经有类似的变量时,可以使用一个示例 来访问类变量。Otherwise it is mostly of choice
.
例子
public class Test
{
public string firstName { get; set; }
public void temp(string firstName)
{
firstName = this.firstName;
}
}
关于字段,唯一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;
}
}
通常没关系。您可能使用的这个原因this.
是明确表示您要引用属于当前类的属性/字段。
同样,您可能需要这个的情况并不多,但是例如,您可能有一个与类级别属性/字段同名的局部变量。然后你可以使用this.
.
例如:
class MyClass
{
string s = "1";
void MyFunction(string s)
{
//s = local value as passed in to function
//this.s = "1"
}
}
通常没关系。this 关键字“引用类的当前实例,也用作扩展方法的第一个参数的修饰符”。
看看这篇文章。
正如其他人已经指出的那样,将字段/属性与方法变量区分开来很有用,另一个需要的地方this
是在当前实例上调用扩展方法。例如this.ExtensionMethod();
会工作,但不仅仅是ExtensionMethod();
除此之外,这是个人选择的问题,有人称其为多余,有人喜欢使用它。这完全取决于您和您的团队。
就我个人而言,我喜欢this
与类成员一起使用,特别是在处理 winform 的代码隐藏时使用 Forms 方法,例如this.Close();
有关何时使用的更多讨论,this
请参阅:您何时使用“this”关键字?
通常没关系,但是如果你将一个名为 button1 的变量传递给一个已经有一个名为 button1 的成员的类方法,那么你需要消除你真正的意思。
这可能就是为什么人们现在使用this.
明确地说出你的意思是哪个变量,如果你一直使用这种做法,在少数重要的情况下你不会弄错。
当然,您可以确保所有成员变量都是唯一命名的,例如带有前缀m_
,但是现在已经过时了,人们更喜欢写出来this.
这真的取决于情况。
http://msdn.microsoft.com/en-us/library/dk1507sz(v=vs.80).aspx
- 限定被相似名称隐藏的成员
- 将对象作为参数传递给其他方法
- 声明索引器