字段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的情况下,自动属性是有意义的。