你需要什么“这个”。在c#中

时间:2017-10-24 07:41:22

标签: c# oop this

我公司的老学徒使用“这个”。很多。 两个星期前,我开始编写面向对象的代码,但仍然没有得到它正在使用的内容。

3 个答案:

答案 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;
    }
}