字段vs{get;set}vs{get=>;字段;set=>;字段=value;}-C#Unity

字段vs{get;set}vs{get=>;字段;set=>;字段=value;}-C#Unity,c#,unity3d,properties,field,C#,Unity3d,Properties,Field,我有这段代码,我的目标是修改要在抽象类中的任何方法中使用的字段值。 我的理解是: 您可以创建一个字段(例如,private int speed) 创建属性以修改其值(public int Speed{get;set;}或public int Speed{get=>Speed;set=>Speed=value;} 但是编辑器(这里没有修改变量,这是硬代码)不会抛出预期结果,而是修改speed字段值。 请给出清晰简洁的解释。 在您的代码中,fireRate和fireRate以及speed和spe

我有这段代码,我的目标是修改要在抽象类中的任何方法中使用的字段值。 我的理解是:

  • 您可以创建一个字段(例如,
    private int speed
  • 创建属性以修改其值(
    public int Speed{get;set;}
    public int Speed{get=>Speed;set=>Speed=value;}
但是编辑器(这里没有修改变量,这是硬代码)不会抛出预期结果,而是修改
speed
字段值。 请给出清晰简洁的解释。
在您的代码中,
fireRate
fireRate
以及
speed
speed
是完全独立的字段/属性。修改
fireRate
不会影响
fireRate
,反之亦然

SerializeField
用于序列化字段而不是属性。在这两种情况下,仅序列化字段(
fireRate
speed

请尝试以下代码:

[SerializeField]公共INTA;
[SerializeField]公共int b{get;set;}
[SerializeField]公共int c=>a;

Unity默认情况下不会序列化属性,只有
a
将被序列化。

您混淆了术语和属性。属性可以在getter和setter中实现其他行为

首先:团结就是这样!

这将Unity中属性的用途限制为运行时

因此,大多数情况下,我们都会选择这样的模式

[SerializeField] private int a;
public int A => a;
例如,您可以通过编辑器分配一个值,通过类本身编辑它,但只允许其他人只读访问=>封装

当然,为了完整性,它可以执行额外的健全性检查,例如

private const int min = -3;
private const int max = 17;
private bool allowSet;

[SerializeField] private int a;
public int A 
{
    get => a;
    set 
    {
        if(allowSet) a = Mathf.Clamp(a, min, max);
    }
}
一个自动属性(在我看来)几乎不需要,除非你想直接限制访问,比如

public int b { get; private set;}
这只允许该类写入该值,但其他所有人都可以读取该值

因此,什么时候有用主要是主观的,取决于具体情况


现在看看你的代码,
Speed
-
Speed
FireRate
-
FireRate
!它们是完全独立的字段和属性

这里的混乱可能是由于检查器创建的显示名称造成的。它会自动将所有字段名称大写,以便

[SerializeField] private int _example;
将显示为
示例

你很可能会选择

[SerializeField] protected float Speed;
[SerializeField] protected float FireRate;

不是回答者,但如果它解决了您的问题,请确保接受upvote/downvote部分下方已回答的问题(小复选标记)。明白了。仍在等待关于“自动实现属性的用途”的答案@HernandoN属性的有用性是一个全新的讨论领域,所以我只留下链接:@HernandoN用简单的术语回答你的问题:Unity确实劫持了C#,一种不是为它而设计的语言,甚至没有被引擎正确使用。在你不使用Unity的情况下,自动属性是有意义的。