具有new和get integer的C#构造函数

时间:2018-09-05 16:22:14

标签: c#

这是Unity 5.5.0上的结构,我对c#还是很陌生,对属性和结构的了解也不深。

这在this.X期间分配时出错。

我假设您不能更改结构的值,而关键字这指的是结构的属性

  

在将控制权返回给调用方之前,必须完全分配自动实现的属性'Point.X'的后备字段。考虑从构造函数初始化程序调用默认构造函数。 (CS0843)(装配体-锋利的)[LN 15]

     

在将此对象的所有字段都分配给(CS0188)(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;
    }
}

1 个答案:

答案 0 :(得分:8)

这是某些C#版本的奇怪之处;编译器有时无法正确检测到通过构造函数在所有代码路径上都已完全初始化该结构。

解决方法是说

public Point(int x, int y) : this()  // default initialization
{ 
  this.X = x;
  this.Y = y;
}

告诉编译器“在构造函数中初始化字段之前,将字段初始化为默认值”。

当我们进行C#3时,这在语言设计上有点失败。绝对不清楚这是您必须要做的。抱歉。

由于我引起了您的注意,让我们解决您提出的其他问题:

  

我假设您不能更改结构上的值

可以更改结构上的值,但您不应。结构应为:

  • 逻辑价值
  • 不可变

所以我的建议是将设置者设为私有(使用private set;

您已经建立了可变的点结构,这是一种不好的做法。建立一个不变的点结构,并将其视为不变的数学对象,而不是变量的集合。

也:

  

这是指结构属性的关键字

关键字this是变量的别名,用于保存结构实例的值。这很微妙。让我给你举个例子。如果我们说:

Point a = new Point(1, 2);

这意味着:

  • 为新的临时存储变量设置一个点的大小。
  • 调用两个参数的构造函数,将this用作该临时存储变量的别名,然后将1和2复制到形式参数x和y。
  • 构造函数返回后,将临时变量中的值复制到变量a中。

现在,您可能会注意到,这样做似乎更有效:

  • 调用两个参数的构造函数,使thisa的别名,依此类推。

这样会更有效率;这称为复制删除优化,当C#知道用户无法注意到差异时,C#会执行 。 (挑战:构建一个C#程序,用户可以在其中确定是否使用了复制省略功能; C#在这种程序中会复制删除)!

类似地,如果您这样做:

struct Point
{
   ... constructors, whatever ...
   public double DistanceFromOrigin()
   {
     return Math.Sqrt(this.X * this.X + this.Y * this.Y);
   }

当您呼叫a.DistanceFromOrigin()时,this成为a的别名;它们是同一个变量,只是两个不同的名称。

这不是引用类型的工作原理。在引用类型中,this引用副本。在值类型中,this是变量的别名

这些都是细微之处。