我公司的老学徒使用“这个”。很多。 两个星期前,我开始编写面向对象的代码,但仍然没有得到它正在使用的内容。
答案 0 :(得分:2)
您需要了解首先是什么实例。假设你有一个对象:
public class House
{
public decimal Height { get; set; }
}
您可以拥有多个实例:
var smallHouse = new House { Height = 100M };
var bigHouse = new House { Height = 300M };
每个实例都有自己的Height
值。如果您希望在Height
方法中使用House
,则需要参考当前实例方法正在运行(一个消费者调用)。
这可以通过使用this
作为引用此当前实例的特殊变量来显式完成:
public class House
{
public decimal Height { get; set; }
public bool IsItTooBig()
{
return this.Height > 200;
}
}
或者你可以省略this
并让C#猜测你的意思是实例值:
public class House
{
public decimal Height { get; set; }
public bool IsItTooBig()
{
return Height > 200;
}
}
程序员不同意见是否在那里明确是好还是坏。如果遵循大小写约定,则可以通过它区分实例状态和方法范围状态(正常变量)。
有些情况下您绝对需要它,例如当您有命名冲突时,或者您想要从方法返回当前实例时:
public class House
{
public decimal Height { get; set; }
public House AddFloor()
{
Height += 100;
return this;
}
}
您应该考虑在其中许多情况下应用不变性。
答案 1 :(得分:0)
关键字' this'表示用于显式调用该实例的方法,字段或属性的对象的实例。
通常在私有字段与给定方法中的参数同名时使用:
private string name;
public void SetName(string name) {
this.name = name;
}
答案 2 :(得分:0)
如果要引用该类中的实例字段,请使用this
,可以省略它,但有些情况下不能省略。
public class InstanceClass
{
int field = 10;
public void Method()
{
int field = 0;
Console.WriteLine(field); // outputs 0
Console.WriteLine(this.field); // outputs 10 because "this" refers to field.
}
}
如果没有声明的局部变量与字段名称冲突,则可以省略“this”。
public class InstanceClass
{
int _field = 10;
public void Method()
{
int field = 0;
Console.WriteLine(field);
Console.WriteLine(_field); // prefixed with _.
// no conflicts
// so "this" can be omitted.
}
}
另一种情况,你不能忽略它,就是当你使用索引器时。
public class InstanceClass
{
private List<int> _source;
private int offset;
public int this[int index] // you use "this"
{
get => _source[index + offset]
set => _source[index + offset] = value;
}
public void Method()
{
var first = this[0]; // must use "this" to refer to indexer for this class.
}
}
“this”也用于调用构造函数重载。
public class Foo
{
public Foo() : this(0)
{
Console.WriteLine("world");
}
public Foo(int param1)
{
Console.WriteLine("Hello");
}
}
//...
var foo = new Foo(); // outputs "Hello world"
“this”也指类本身的实例。因此,如果你想要返回自我的实例,你可以使用它。
public class Foo
{
public Foo ReturnMe() // weird example.
{
return this;
}
}