定义不需要访问器的数据类型 (single-属性 class)

Defining a data-type (single-property class) that does not require an accessor

在我的项目中,我有一些应保持在 0-1 范围内的浮点字段。如果可能的话,我想要一个自定义数据类型,称之为 float01,只要它被写入,它就会简单地限制值,这样我就不必记住每次都这样做。这样我就可以简单地写:

float01 clampedFloat = .9f;

我可以为此制作一个新的 class,使用一个具有自定义 setter 的单个 属性 来处理夹紧,但我总是需要参考它由其访问者:

clampedFloat.Value += .2f;

有什么方法可以定义自定义数据类型,我可以简单地编写以下内容吗?

clampedFloat += .2f;

我知道这看起来像个小东西,但如果我每次都必须添加访问器,我还不如每次都夹住它。更重要的是,感觉好像我遗漏了一些东西,就像添加一个简单的数据类型应该很容易,而不需要 class 属性所具有的必需的绒毛。

should be easy to add a simple data-type without the required fluff that class properties have.

要定义您自己的类型或结构,您可以使用 custom conversion operators and even more advanced stuff like operator overloading

Custom conversion
要将你的新酷 class 与另一个 class 相互转换,你需要使用转换运算符。

为此,您遵循一个简单的格式

从类型转换

public static implicit operator <YOUR_TYPE>(<OTHER_TYPE> obj)

转换为类型

public static implicit operator <OTHER_TYPE>(<YOUR_TYPE>obj)

这是一个可能对您有所帮助的快速简单示例。

public class ClampedFloat
{
    public float Min { get; set; } = -1f;
    public float Max { get; set; } = 1f;

    public float Value
    {
        get => _Value;
        set
        {
            _Value = Math.Clamp(value, Min, Max);
        }
    }

    private float _Value = 0f;

    public static implicit operator float(ClampedFloat obj)
    {
        return obj.Value;
    }

    public static implicit operator ClampedFloat(float obj)
    {
        return new ClampedFloat() { Value = obj };
    }
}