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++ 部分已被删除。
我认为您不太熟悉取消引用指针是什么。
我们来看看这个方法:
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)