在Unity中使用getter和setter

本文关键字:getter setter Unity | 更新日期: 2023-09-27 18:03:11

关于getter和setter,我还有一个问题。现在我开始使用我所理解的c# getter和setter。我看到的问题是,为什么我要让公共变量看起来像这样:

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

我不明白这样做的意义因为如果把变量设为公共变量又有什么不同呢毕竟get和set都在同一个括号里?

但是如果我这样做:

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

然后,当我尝试使用我的SetiRandomNumber本身Unity编译器抱怨,我不能使用我的SetProperty,因为我没有一个GET属性在我的SET。我真的应该让它像我写的第一个例子一样吗因为我写的时候c#中的getter和setter有什么意义?

或者我应该远离它们,就像我从一开始就要求的那样,为每个Get和Set创建函数,就像在c++中一样,这样我就可以自己使用它们了?

很抱歉提出这个新问题,但是不可能在我之前的问题中添加这个评论,因为它太长了。

在Unity中使用getter和setter

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

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和set都在同一个括号里?

区别在于你将实现细节(一个字段)与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 
} 

但是如果你对你的变量没有这样的要求,你还不如只使用一个公共变量