gpt4 book ai didi

c# - C# 中的字段和属性对缩短

转载 作者:太空宇宙 更新时间:2023-11-03 10:24:22 24 4
gpt4 key购买 nike

我的代码中散布着一些这样的属性:

private Animator _anim;
public Animator anim
{
get
{
if (_anim == null)
{
_anim = GetComponent<Animator> ();
}
return _anim;
}
set
{
_anim = value;
}
}

我想知道是否可以通过这样的自定义字段声明在语义上缩短它:

public autogetprop Animator anim;

或者通过这样的属性:

[AutoGetProp]
public Animator anim;

最佳答案

基本上,没有 - 没有什么可以让您通过“一点点”自定义代码使用自动实现的属性。您可以缩短代码,但要:

public Animator Animator
{
get { return _anim ?? (_anim = GetComponent<Animator>()); }
set { _anim = value; }
}

或者您可以编写带有 ref 参数的 GetComponent 方法,并像这样使用它:

public Animator Animator
{
get { return GetComponent(ref _anim)); }
set { _anim = value; }
}

GetComponent 应该是这样的:

public T GetComponent(ref T existingValue)
{
return existingValue ?? (existingValue = GetComponent<T>());
}

如果您不喜欢使用具有这种副作用的空合并运算符,您可以将其重写为:

public T GetComponent(ref T existingValue)
{
if (existingValue == null)
{
existingValue = GetComponent<T>();
}
return existingValue;
}

请注意,这些解决方案都不是线程安全的 - 就像您的原始代码一样,如果第二个线程将属性设置为 null 第一个线程通过“它是否为空”检查之后,该属性可以返回 null,这可能不是本意。 (这甚至没有考虑所涉及的内存模型问题。)根据您希望的语义,有多种方法可以解决这个问题。

关于c# - C# 中的字段和属性对缩短,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32170393/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com