我注意到自定义结构和类中“ this ”关键字的语义完全不同。
例如,在结构中我们可以这样做:
struct MyStruct
{
int x,y;
void Reset()
{
this = new MyStruct(); // удаляем предыдущую структуру и создаем новую О_О
}
}
我想看看This关键字、结构和类之间的全部区别,并找出幕后发生的事情。
我注意到自定义结构和类中“ this ”关键字的语义完全不同。
例如,在结构中我们可以这样做:
struct MyStruct
{
int x,y;
void Reset()
{
this = new MyStruct(); // удаляем предыдущую структуру и создаем новую О_О
}
}
我想看看This关键字、结构和类之间的全部区别,并找出幕后发生的事情。
我认为没有人会比语言规范更好地回答您。(顺便说一句,该规范位于您的计算机上,<Visual studio dir>\VC#\Specifications\1033\CSharp Language Specification.docx。)
我将翻译第 7.6.7 节。
(我通过删除primary-expression的提及来简化文本。)
可以看出,对于类
this来说是一个值,对于结构来说是一个变量。因此,对于结构,您可以分配此变量。最重要的区别是
this结构类型的变量必须在结构的构造函数中显式分配。一个结构类型的变量,
this对于结构是一个结构类型的变量,如果它的每个字段都被显式赋值,则被认为是显式赋值的这对结构有何影响?
这会影响设计师的工作。考虑以下结构声明示例
对于这个结构声明,编译器会发出一条错误信息,
因为在方法调用点
make_eventhis还没有显式赋值,因为结构的数据成员y还没有被初始化。构造函数退出后,该变量
this被认为是显式赋值的。您可以通过先调用默认构造函数来使先前的结构构造函数有效。
在这种情况下,在带参数的构造函数体内,变量
this已经被显式赋值。如果把这个声明改成类声明,那么就不会有问题了
this,它this不再是一个变量,而是一个值,这个类就能编译成功。