Unity封装,属性迫使我重写变量名称?

时间:2018-07-17 21:27:00

标签: c# unity3d encapsulation

我想了解一个简单的东西。

我正在阅读许多有关Unity和C#中封装的问题和答案。 所有人都在谈论get / set,而大多数答案都说 getset的最大好处是可以防止错误输入或我在任何其他脚本中写的东西来访问变量并为程序造成问题。

因此,如果我真的很专注并且没有犯错,就像get / set成为null一样!我的意思是,没有其他真正的好处。

此外,我看到该属性迫使我重写变量名称,

赞:

private int health 
public int health { get; private set; }

因此,结果是我编写了更复杂的代码。我在脚本中使用了更多相同的名称,这不危险吗?

2 个答案:

答案 0 :(得分:4)

您的示例无法正常工作,因为health是两次相同的变量。通用约定是将_healthhealth用作后备字段,并将Health用作属性(get / set/)。另外,没有什么可以阻止您的工作:

private int backingField;
public int OtherProperty { get { return backingField; } } 
public int Property => backingField; // Does same thing as above

这对您,您未来的自我和您的同事来说非常令人困惑。

但是,就您而言,您可以执行以下操作:

public int Health { get; private set; }
  

所以,如果我真的很专注并且没有犯错

这是一个真的不良的心态。如果继续保持这种思维方式,您将被打倒在脚上,因为您无法同时专注于所有事情。大脑一次只能加载这么多的信息。这个想法是不要让自己犯错误。

我的程序员教授曾经说过,这种心态就像将婴儿放在高速公路的一个车道上,如果有汽车驶入,您只需将其移至另一车道。您可以永远这样做,也可以只是在高速公路附近的某个地方没有孩子。

Visual Studio使重命名变得非常容易,您只需执行一次即可。 get / set的更好功能是确保数据有效。例如

private int _age = 0;
public int Age
{
    get => _age;
    set
    {
        if (value > 0)
            _age = value;
    }
}

此代码将阻止用户将Age设置为负数,因为这是不可能的。

属性很棒,您可以用它们做很多很酷的事情,例如:

public struct Rectangle
{
    public int X, Y;
    public int Area => X * Y;

    public Rectangle(int x, int y) => (X, Y) = (x, y);
}

public int Area => X * Y;是一个属性,尽管它看起来并不像它。等同于:

public int Area
{
    get
    {
        return X * Y;
    }
}

最酷的是Area仅具有吸气剂,因此其值不能更改。 Area = 3不起作用。这是理想的,因为那样会产生无效数据。

有效地,所有Area都是方法GetArea() => X * Y;的语法糖,但是我们不使用Get前缀或结尾的()

属性何时有用

总而言之,属性(获取/设置)可用于将变量的设置设为私有或受保护,以防止无效数据泄漏,在使用setter来确保新数据有效时会引起火灾,或者具有类似于只读变量的内容,但实际上执行快速计算以获取数据。

在这种意义上,它们非常适合封装。

编辑:正如Draco18所指出的那样,它们对于类(如类)的接口也很有用,但区别之一是它们不能具有字段。它们可以具有属性,因为在本质上,属性只是方法。

答案 1 :(得分:0)

通常,Property值名称将大写。该字段将是 小写。

通常field设置为私有,供课程使用。

Property将在编译代码时转换为Get()Set(value)方法。

private int _health 
public int Health { get; private set; }