【发布时间】:2012-04-19 18:47:38
【问题描述】:
主要问题是允许修改 this 关键字在有用性和内存方面的含义是什么?为什么在 C# 语言规范中允许这样做?
如果选择这样做,可以回答或不回答其他问题/子部分。我认为对他们的回答将有助于澄清主要问题的答案。
我在回答What's the strangest corner case you've seen in C# or .NET? 时遇到了这个问题
public struct Teaser
{
public void Foo()
{
this = new Teaser();
}
}
我一直试图弄清楚为什么 C# 语言规范甚至允许这样做。 第 1 部分。有什么可以证明 this 是可修改的吗?有用吗?
其中一个答案是
从 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];
Sub-part 3. 调用 Foo 时,它是否会从堆栈中删除?在我看来,由于结构从未超出范围,因此不会从堆栈中删除。今晚没有时间创建一个测试用例,但也许我明天会做这个。
在下面的代码中
Teaser t1 = new Teaser();
Teaser tPlaceHolder = t1;
t1.Foo();
第 4 小节。 t1 和 tPlaceHolder 占用相同还是不同的地址空间?
很抱歉提出一个 3 年前的帖子,但这个帖子真的让我头疼。
仅供参考关于stackoverflow的第一个问题,所以如果我的问题有问题,请发表评论,我会编辑。
2 天后,即使我已经在脑海中选择了获胜者,我也会在这个问题上悬赏 50,因为我认为答案需要合理的工作量来解释这些问题。
【问题讨论】:
-
1 中的 4 个问题不适合 Stack Overflow。一个问题应该是一个问题。
-
@AnthonyPegram - 在这种情况下,我认为这是可以接受的,因为这些问题是对结构真正如何工作的主要问题的子问题
-
我很抱歉不知道如何将其全部改写为一个。我想的主要问题可以概括为允许修改 this 关键字的副作用是什么?问题 3-4 是我认为可能的副作用。如果除了我之外还有其他人有权编辑问题并认为他们可以更好地提出问题,请随时这样做。或者留下评论提出更好的问题,我将从头开始。
-
天哪,我看到警察再次出警的问题。这是一个完全合法且真实的问题,它有具体和客观的答案,即使它包括四个问题。
-
4.作业在 C# 中创建副本。因此
tPlaceHolder和t1是不同的存储位置。
标签: c# .net memory specifications