在Unity中使用Getters和Setter

时间:2014-05-14 08:48:04

标签: c# unity3d

我对getter和setter有另外一个问题。现在我开始使用c#getters和setter,因为我理解它们。我看到的问题是为什么我应该创建如下所示的公共变量:

// Variable
private int _iRandomNumber
// Getter and setter
public int iRandomNumber
{
     get { return _iRandomNumber; }
     set { _iRandomNumber = value; }

}

我没有看到这一点,因为只要将变量公开,因为它无论如何得到get并设置在同一个括号中会有什么不同?

但如果我喜欢这样:

// Variable
private int _iRandomNumber
// Getter and setter
public int GetiRandomNumber { get { return _iRandomNumber; } }
public int SetiRandomNumber { set { _iRandomNumber = value; } }

然后,当我尝试单独使用我的SetiRandomNumber时,Unity编译器会抱怨我无法使用我的SetProperty,因为我的SET中没有GET属性。我是否真的必须像我写的第一个例子一样,因为在我写的时候,c#中的Getters和Setters有什么意义?

或者我应该转而离开它们,就像我从头开始询问并为c ++中的每个Get和Set创建函数所以我实际上可以自己使用它们?

很抱歉让这个问题成为一个新问题,但由于很长时间以来无法将此作为评论添加到我之前的问题中。

3 个答案:

答案 0 :(得分:8)

属性允许您在设置值时触发事件,例如:

public string Name {
    get { return name; }
    set {
        name = value;
        var eh = NameChanged;   // avoid race condition.
        if (eh != null)
            eh(this, EventArgs.Empty);
    }
}
private string name;
public event EventHandler NameChanged;

额外的好处是,您可以通过调试器或诊断打印语句在getter / setter中添加断点来跟踪属性设置或读取的时间。

答案 1 :(得分:3)

  

我没有看到这一点,因为只要将变量公开,因为它无论如何得到get并设置在同一个括号中会有什么不同?

区别在于您将实施细节(字段)与 API (属性)分开。您可以稍后更改实施,例如使用一个long变量来投放两个int字段。 (这只是一个随机的例子。)或者你可以在setter中提供验证和更改通知。或者您可以在getter中执行延迟计算。或者您可以从外部将属性设置为只读,但可以私下写入。名单还在继续。

您的第二个代码声明了两个不同的属性 - 一个是只读的,一个是只写的,都由同一个变量支持。至少可以说这是非惯用的C#,没有任何好处。这两个属性之间没有联系,而在第一个版本中,getter和setter之间存在明确的联系,因为它们是同一属性的一部分。

需要注意的一点是,使用自动实现的属性可以更简洁地表达您的第一个示例:

// Removed unconventional "i" prefix; this follows .NET naming conventions.
public int RandomNumber { get; set; }

在幕后创建一个私有变量,以及一个getter和setter只使用私有变量的公共属性。稍后如果要更改实现,可以在不影响API的情况下执行此操作。

答案 2 :(得分:0)

getter和setter的优势在于它们主要用作函数,因此你可以做这样的事情

private int _iRandomNumber;

public int iRandomNumber
{
     get { return _iRandomNumber%10;} //you can do something like this mod function 
     set { _iRandomNumber = value+1000;} //you can manipulate the value being set 

} 

但如果你对你的变量没有这种要求,你也可以只使用一个公共变量。