当您在C#中从结构返回"this"时会发生什么?

3

好的,以下是翻译结果:

好奇一下,当你从 C# 的结构中返回关键字 this 时会发生什么?

例如:

public struct MyStruct 
{
  // ... some constructors and properties 1-3

  public MyStruct Copy()
  {
     return MyStruct(Property1, Property2, Property3);
  }

  // vs

  public MyStruct This()
  {
     return this;
  }
}
5个回答

16
它返回一个独立的值副本。换句话说:
MyStruct x = new MyStruct();
y = x;

是像,类似于。
MyStruct x = new MyStruct();
y = x.This();

这实际上是相当无意义的。

请记住,“值”基本上是“结构体字段中涉及的所有位所组成的”。如果这些字段是引用,则会复制引用值(而不是它们所引用的对象)。如果它们是其他值类型,则只会复制这些值。


奇怪的事实:在结构体中,您可以重新分配this
this = new MyStruct();

请不要这样做,谢谢 :)

Jon:+1 - 这个小知识点真是太邪恶了。请不要让别人知道他们可以这样篡改代码!;) - Reed Copsey
5
@Reed:你想知道什么才是真正的邪恶吗?它甚至可以在你的字段是只读时起作用! - Jon Skeet
有点像通过调用析构函数和就地new在C++中重新创建一个对象。而且这甚至被建议作为一种惯用语在标准中!!! - David Rodríguez - dribeas

1

你将返回一个结构体的按值副本。这基本上与您的复制例程相同,前提是复制实际上复制了结构体中的每个字段。

然而,这是相当令人困惑的代码,所以我建议避免使用它。如果你返回“this”,人们会期望一个引用类型。


1
据我回忆(我自己没有尝试过),数据网格中的DataGridComboBox单元格无法使用SelectedItem绑定到底层属性;您必须使用SelectedValue。因此,如果您想将DataSource属性设置为对象集合并返回对所选对象的引用,则必须创建一个“This”属性,并使用其名称作为ValueMember属性。

0

我绝对不会在C#中使用单词This(尽管它是大写的)作为函数名,因为这与使用小写的this表示索引器属性的用法冲突...

而且,如果你已经有一个包含此结构体实例的变量,为什么要在该变量上调用一个有效地克隆副本的方法呢?你可以直接使用变量来完成同样的事情...

i.e.,

   MyStruct x = new Mystruct();
   MyStruct y = x.This(); 

等同于:

   MyStruct x = new Mystruct();
   MyStruct y = x; 

我没有在真正的代码中使用它,只是快速输入了一下,因为我很好奇 :) - Alex Baranosky

0
你会得到一个结构体的副本。将MyStruct.This赋值给另一个变量,然后对其进行更改,再查看原始变量,你会发现它并没有改变。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接