主要问题是允许修改 this 关键字在有用性和内存方面的含义是什么?为什么在 C# 语言规范中允许这样做?
如果选择这样做,可以回答或不回答其他问题/子部分。我认为对他们的回答将有助于澄清主要问题的答案。
我在回答你在 C# 或 .NET 中看到的最奇怪的极端情况是什么?
public struct Teaser
{
public void Foo()
{
this = new Teaser();
}
}
我一直试图弄清楚为什么 C# 语言规范甚至允许这样做。 第 1 部分。有什么可以证明这是可修改的吗?都是有用的吗?
对该答案的评论之一是
从 CLR 通过 C#:他们这样做的原因是因为您可以在另一个构造函数中调用结构的无参数构造函数。如果您只想初始化结构的一个值而希望其他值为零/空(默认),您可以编写 public Foo(int bar){this = new Foo(); 特殊变量 = 酒吧;}。这效率不高,也不是很合理(specialVar 分配了两次),但仅供参考。(这就是书中给出的原因,我不知道为什么我们不应该只做 public Foo(int bar) : this())
第 2 部分。 我不确定我是否遵循该推理。有人可以澄清他的意思吗?也许是如何使用它的具体例子?
编辑(忽略堆栈或堆的要点是关于内存释放或垃圾收集。您可以用 262144 个公共 int 字段代替 int[]这个结构将有一个 1 Mb 字节数组字段初始化为
public int[] Mb = new int[262144];
子部分 3.当调用 Foo 时,这是否会从堆栈中删除?在我看来,由于结构从未超出范围,因此不会从堆栈中删除。今晚没有时间创建一个测试用例,但也许我明天会做这个。
在下面的代码中
Teaser t1 = new Teaser();
Teaser tPlaceHolder = t1;
t1.Foo();
第 4 部分。t1 和 tPlaceHolder 占用相同还是不同的地址空间?
很抱歉提出一个 3 年前的帖子,但这个帖子真的让我头疼。
仅供参考关于stackoverflow的第一个问题,所以如果我的问题有问题,请发表评论,我会编辑。
2 天后,即使我已经在脑海中选择了获胜者,我也会在这个问题上悬赏 50,因为我认为答案需要合理的工作量来解释这些问题。