繁体   English   中英

在Unity中使用Getters和Setter

[英]Using Getters and Setters in Unity

我对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创建函数所以我实际上可以自己使用它们?

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

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

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中放置断点来跟踪何时设置或读取属性。

我没有看到这一点,因为只是将变量设为公开会有什么不同,因为无论如何得到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的情况下执行此操作。

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 

} 

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM