关键字“this”是不是返回引用或值

Posted

技术标签:

【中文标题】关键字“this”是不是返回引用或值【英文标题】:Does the keyword 'this' return a reference or a value关键字“this”是否返回引用或值 【发布时间】:2019-02-13 22:48:59 【问题描述】:

每当在 C# 类中调用关键字 this 时,它是返回对它出现的实例的引用,还是返回实例的值(如副本)?

例如,以下代码会打印数字 23(意思是 this 返回 foo 的副本)还是数字 96(意思是 this 返回对 foo 的引用)?

class Program

    static void Main()
    
        Foo foo = new Foo  23 ;
        foo.Bar();
        Console.Write(foo.FooBar);
    


class Foo

    public int FooBar  get; set; 

    public void Bar()
    
        Foo newFoo = this;
        newFoo.FooBar = 96;
    

【问题讨论】:

运行这段代码时发生了什么? 【参考方案1】:

由于this 与引用类型(class)相关,它返回对实例的引用。使用this和在下面的代码sn-p中使用foo2没什么区别:

var foo1 = new Foo();
var foo2 = foo1;

foo2 一样,只引用(!)foo1 引用的对象,在类内部,this 只引用实例。

如果它不同,就不可能例如从方法内部为对象的属性赋值,因为使用this 总是会导致复制对象,这反过来意味着您永远不会设置原始实例字段的值,这将是相当糟糕的。

所以,长话短说:this 持有参考,而不是价值。

HTH?

【讨论】:

我可以使用this.MemberwiseClone()获得一份副本而不是参考资料吗? 你会得到一个“浅拷贝”。在这个人为的示例中,这已经足够了,但是如果原始 Foo 引用了另一个对象而不是简单的值类型,那么您的 foo 克隆虽然本身是一个唯一对象,但将引用相同的子对象实例。

以上是关于关键字“this”是不是返回引用或值的主要内容,如果未能解决你的问题,请参考以下文章

为啥移动赋值运算符应该返回对 *this 的引用 [重复]

Javascript 是不是通过引用或值将数组传递给函数?

检查给定对象(引用或值类型)是不是等于其默认值

为什么赋值操作符函数的参数为const引用,返回值为引用

查找和引用函数INDEX

使用 JNI(更具体地说是 Android NDK)时,Java 是不是通过引用或值传递给 C