为什么不能在 C# 中设置“this”

Jim*_*yHu -3 c# memory-management

我已经检查了链接“为什么我不能在 C# 中将“this”设置为一个值?我知道这this是只读的。换句话说,它(内容)不能分配给另一个新对象。我只是想知道 C# 中这种约束的哲学或考虑。如果是为了内存管理的安全性,C#使用垃圾收集器来确定一个对象以后的使用情况。

    public class TestClass
    {
        private int Number;
        public TestClass()
        {
            this.Number = 0;
        }
        public TestClass(TestClass NewTestClass)
        {
            this = NewTestClass;        //  CS1604  Cannot assign to 'this' because it is read-only
        }

    }
Run Code Online (Sandbox Code Playgroud)

这样一来,看来成员需要一一更新了。

    public class TestClass
    {
        private int Number;
        public TestClass()
        {
            this.Number = 0;
        }
        public TestClass(TestClass NewTestClass)
        {
            this = NewTestClass;        //  CS1604  Cannot assign to 'this' because it is read-only
        }

    }
Run Code Online (Sandbox Code Playgroud)

欢迎提出任何意见。

注意:为了澄清起见,C++ 部分已被删除。

And*_*ndy 5

我认为您不太熟悉取消引用指针是什么。

我们来看看这个方法:

void TestClass::SetThisTest() {
    *this = TestClass(this->IncreaseNumber().GetNumber());      //  Assign new object to *this
}
Run Code Online (Sandbox Code Playgroud)

你相信你正在替换this,但你不是。您正在替换 指向的内容this。巨大的差异。*this!= this.

尝试这个:

void TestClass::SetThisTest() {
    std::cout << "this' address is " << std::to_address(this) << std::endl;
    *this = TestClass(this->IncreaseNumber().GetNumber()); // shallow copy!
    std::cout << "Now this' address is " << std::to_address(this) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

地址不会改变,但值this点会改变。您正在调用(在这种情况下)默认的浅拷贝

你可以很容易地在 C# 中做到这一点,你只是不被允许那么直接

这是您的 C++ 类的 C# 等效项:

public sealed class ThisTest
{
    private int _myNumber;

    public ThisTest() { }

    public ThisTest(int number) { _myNumber = number; }

    public static void ShallowCopy(ThisTest to, ThisTest from)
    {
        to._myNumber = from._myNumber;
    }

    public int GetNumber() => _myNumber;

    public ThisTest IncreaseNumber()
    {
        _myNumber += 1;
        return this;
    }

    public void SetThisTest()
    {
        ShallowCopy(this, new ThisTest(this.IncreaseNumber().GetNumber()));
    }
}
Run Code Online (Sandbox Code Playgroud)