这是Unity 5.5.0上的一个结构我对c#很新,并且不了解属性和结构.
这给出了在分配期间的错误this.X.
我假设您不能更改结构上的值,而关键字this指的是结构的属性
在将控制权返回给调用者之前,必须完全分配自动实现的属性"Point.X"的备份字段.考虑从构造函数初始化程序中调用默认构造函数.(CS0843)(Assembly-CSharp)[LN 15]
在将所有字段分配给(CS0188)之前不能使用'this'对象(Assembly-CSharp)[LN 16]
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public struct Point
{
// Don't undertstand why "public int X, Y" works fine but not this
public int X { get; set; }
public int Y { get; set; }
//public int X,Y;
public Point(int x, int y)
{
// LN 15
this.X=x;
this.Y=y;
}
}
Run Code Online (Sandbox Code Playgroud)
这是C#的某些版本的奇怪之处; 编译器有时无法正确检测到结构已通过构造函数在所有代码路径上完全初始化.
解决方法是说
public Point(int x, int y) : this() // default initialization
{
this.X = x;
this.Y = y;
}
Run Code Online (Sandbox Code Playgroud)
它告诉编译器"在构造函数中初始化字段之前,字段已初始化为默认值".
当我们做C#3时,这是语言设计的一个失败; 这绝不是你必须要做的事情.对于那个很抱歉.
既然我引起了你的注意,那就让我们谈谈你提出的另一点:
我假设您无法更改结构上的值
您可以更改结构上的值,但不应该.结构应该是:
所以我的建议是让私人设定者(与private set;)
你做了一个可变点结构,这是一个不好的做法.创建一个不可变的点结构,并将它们视为不可变的数学对象,而不是变量的集合.
也:
关键字this指的是结构的属性
关键字this是变量的别名,它保存结构实例的值.这很微妙; 让我给你举个例子.如果我们说:
Point a = new Point(1, 2);
Run Code Online (Sandbox Code Playgroud)
这意味着:
this为该临时存储变量创建别名,并将1和2复制到形式参数x和y中.a.现在,您可能会注意到它似乎更有效:
this为其创建别名a,依此类推.它会更有效率; 这被称为复制省略优化,当 C#知道用户无法注意到差异时就会这样做.(挑战:构建一个C#程序,用户可以确定是否使用了复制省略; C#不会在这样的程序中复制!)
同样,如果你这样做:
struct Point
{
... constructors, whatever ...
public double DistanceFromOrigin()
{
return Math.Sqrt(this.X * this.X + this.Y * this.Y);
}
Run Code Online (Sandbox Code Playgroud)
当你打电话时a.DistanceFromOrigin(),this成为别名a; 它们是两个不同名称的相同变量.
这不是引用类型的工作方式.在引用类型,this是一个拷贝的的参考.在值类型中,this是变量的别名.
这些都是微妙的观点.