我的代码中散布了几个这样的属性:
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;
答案 0 :(得分:2)
基本上,没有 - 没有什么可以让你使用“只是一点点”的自定义代码自动实现属性。您可以缩短代码,但是:
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>());
}
如果您不喜欢使用带有这样的副作用的null-coalescing运算符,可以将其重写为:
public T GetComponent(ref T existingValue)
{
if (existingValue == null)
{
existingValue = GetComponent<T>();
}
return existingValue;
}
请注意,这些解决方案都不是线程安全的 - 就像您的原始代码一样,如果第二个线程将属性设置为null ,则第一个线程超过“is it null”检查,该属性可以返回null,这可能不是意图。 (这甚至不考虑涉及的内存模型问题。)根据你想要的语义,有各种解决方法。