如何指定动态默认值

时间:2016-06-12 23:38:01

标签: c# unity3d

C#的新功能...试图找出下面new GameObject[20, 20]如何实际引用私有属性值而不是硬编码值。

private int xRadius = 20;
private int yRadius = 20;

private GameObject [,] grid = new GameObject[20, 20];

我尝试了this.xRadiusself.xRadius的变体而没有运气。我怎么能这样做?

2 个答案:

答案 0 :(得分:5)

您不能在类的变量声明范围中使用this,因为在那个时刻没有理由在xRadius之前定义grid

你可以通过将xRadiusyRadius声明为常量来实现你想要的(常量是在运行时不会改变的不可变变量);

private const xRadius = 20;
private const yRadius = 20;

private GameObject[,] grid = new GameObject[xRadius, yRadius];

或者将它们标记为静态变量(静态变量存在于任何类实例之外,并且在任何类实例消失后都可用);

class Example {
    private static xRadius = 20;
    private static yRadius = 20;

    private GameObject[,] grid = new GameObject[Example.xRadius, Example.yRadius];

或者您可以在类构造函数中定义网格并使用普通的类变量引用;

class Example {
    public Example() {
        this.grid = new GameObject[this.xRadius, this.yRadius];
    }
}

最快的解决方案(在运行时资源使用量较少)使用constants,因为值将在编译时复制,并且它们不会占用任何额外资源,最动态的解决方案是在构造函数或在访问网格对象之前,这将允许您在运行时更改xRadiusyRadius,并使用相同的半径变量重新初始化grid变量。

答案 1 :(得分:3)

字段初始值设定项无法访问实例成员,因为它们在静态上下文中运行。因此,它们(如静态方法)无法引用实例方法。

假设包含类为Foo,您可以在构造函数中初始化grid

class Foo
{
    private int xRadius = 20;
    private int yRadius = 20;

    private GameObject[,] grid;

    public Foo()
    {
        grid = new GameObject[xRadius, yRadius];
    }
}