C#hack:assignment to";这";

C#hack:assignment to";这";,c#,class,struct,this,C#,Class,Struct,This,所有C#初学者都知道,class是一种参考类型,struct是一种值类型。 建议将结构用作简单存储。 它们也可以实现接口,但不能从类派生,也不能扮演基类的角色,因为它们具有“值”性质 假设我们揭示了一些主要的差异,但有一个困扰着我。请查看以下代码: public class SampleClass { public void AssignThis(SampleClass data) { this = data; //Will not work as "this"

所有C#初学者都知道,
class
是一种参考类型,
struct
是一种值类型。 建议将结构用作简单存储。 它们也可以实现接口,但不能从类派生,也不能扮演基类的角色,因为它们具有“值”性质

假设我们揭示了一些主要的差异,但有一个困扰着我。请查看以下代码:

public class SampleClass
{
    public void AssignThis(SampleClass data)
    {
        this = data; //Will not work as "this" is read-only
    }
}

这是很明显的,当然,我们不允许改变<强>对象自己的指针>,尽管C++中做的是一个简单的实践。但是:

public struct SampleStruct
{
    public void AssignThis(SampleStruct data)
    {
        this = data; //Works fine
    }
}
它为什么有效?它看起来确实像
struct
这个
不是指针。如果是真的,那么上面的作业是如何进行的?有自动克隆的机制吗?如果结构中有
,会发生什么

结构
的主要区别是什么?为什么它会以这种方式运行?

本节的C规范与此相关()

类别:

在类的实例构造函数或实例函数成员中,
被分类为值。因此,虽然这可用于引用调用函数成员的实例,但不可能在类的函数成员中分配给
this

结构类型:

在结构的实例构造函数中,
this
对应于结构类型的
out
参数,在结构的实例函数成员中,
this
对应于结构类型的
ref
参数。在这两种情况下,这都被归类为一个变量,可以通过分配给
this
或将
this
作为
ref
out
参数传递来修改调用函数成员的整个结构


“它看起来确实像struct,这不是指针。”宾果。结构是约定的值类型。结构“大部分”生活在stack@TMcKeown不,他们没有。无论如何,并不总是如此。@TMcKeown值类型在定义它们的地方存在,引用类型总是在堆上存在。@ElliotTereschuk我不是说它不容易混淆(在本文中),这就是为什么使用它可能不是一个很好的主意。这是针对VS.NET 2003的。2013年有点不同,但仍然意味着相同。现在是11.3.6:)@MarcinJuraszek注意到并更新了-最新的文档实际上是一个更友好的定义。嗯,似乎链接仍然指向2003年的文档,最新版本仅作为下载链接提供-原理大概是一样的。是的,看起来11.3.6从那时起就没有改变过。