【问题标题】:Is it possible to define a private variable outside of the range in c#/unity?是否可以在 c#/unity 的范围之外定义一个私有变量?
【发布时间】:2022-08-19 06:19:11
【问题描述】:

所以我试图强制一个变量在一定范围内。该变量被定义为具有范围的私有浮点数,下面是我正在尝试的简化:

[Range(0.0001f,1f)] private float myFloat;

我想使用这样的初始化函数来初始化这个变量:

private void Initialise(float myFloat){
    this.myFloat = myFloat;
}

我的问题是,如果我使用 Initialise 函数,如果值超出范围会引发异常,还是应该只在初始化函数中定义范围?

  • 属性不强制将值输入字段。
  • 在您的 Initialise-function 中,您可以检查该值是否在范围内。如果没有,你不会改变你的财产。
  • 你为什么不试试看呢?

标签: c# unity3d


【解决方案1】:

正如其他人已经回答了它对进入该领域的价值观缺乏强制执行一样,我想推荐一些解决方案。

您总是可以尝试将其设为属性并像这样检查 setter:

private float _myFloat;
private float myFloat {
    get {
        return _myFloat;            
    }
    set {
        if (value > max || value < min) throw new Exception("");
        _myFloat = value;
    }
}

或者在您的初始化中,如果您的目标是限制在可以使用钳位功能的范围内

this.myFloat = Mathf.Clamp(myFloat, min, max);

最后,如果您希望它抛出异常,您可以编写自己的 Clamp 或 Exception 样式的方法。

编辑:我还添加了一个使用 Range 属性的示例。这个例子编译时很好,运行时可能(?)。 Conceptually you should be able to do something like this 具有 Range 属性或您自己的 Custom Attribute

[Range(0f, 0f)]
public float myCustomValue;

public void GetAttribute()
{
    RangeAttribute attribute = (RangeAttribute)Attribute.GetCustomAttribute(myCustomValue.GetType(), typeof(RangeAttribute));
    float minValue = attribute.Minimum;
    float maxValue = attribute.Maximum;
}

public class RangeAttribute : Attribute
{
    public float Minimum { get; init; }
    public float Maximum { get; init; }
    
    public RangeAttribute(float minimum, float maximum)
    {
        this.Minimum = minimum;
        this.Maximum = maximum;
    }
}

【讨论】:

  • 如果您能展示如何从属性中获取maxmin 值,那就太好了。
  • @Enigmativity 我添加了一个使用属性的示例。
  • 谢谢你。我为你充实了一点。
猜你喜欢
  • 2020-06-18
  • 1970-01-01
  • 2013-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
  • 2014-01-02
  • 1970-01-01
相关资源
最近更新 更多