【问题标题】:Defining a data-type (single-property class) that does not require an accessor定义不需要访问器的数据类型(单一属性类)
【发布时间】:2021-05-20 23:42:42
【问题描述】:

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

float01 clampedFloat = .9f;

我可以为此创建一个新类,使用具有自定义设置器的单个属性来处理钳制,但是我总是需要通过它的访问器来引用它:

clampedFloat.Value += .2f;

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

clampedFloat += .2f;

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

【问题讨论】:

标签: c# types properties accessor


【解决方案1】:

应该很容易添加一个简单的数据类型,而不需要类属性所需要的绒毛。

要定义自己的类型或结构,您可以使用custom conversion operators 甚至更高级的东西,例如operator overloading

Custom conversion
要将新的酷类转换为另一个类或从另一个类转换,您需要使用转换运算符。

为此,您遵循简单的格式

从类型转换

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 };
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-10
    • 2014-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    相关资源
    最近更新 更多