В моем проекте у меня есть несколько полей с плавающей запятой, которые должны оставаться в диапазоне от 0 до 1. Если возможно, я хотел бы иметь собственный тип данных, назовите его float01, который просто фиксирует значение всякий раз, когда оно записывается, чтобы мне не приходилось помнить об этом каждый раз. Так я могу просто написать:

float01 clampedFloat = .9f;

Я мог бы создать для этого новый класс с единственным свойством, у которого есть настраиваемый сеттер, который позаботится о зажиме, но тогда мне всегда нужно ссылаться на него с помощью его метода доступа:

clampedFloat.Value += .2f;

Есть ли способ определить пользовательский тип данных, в котором я могу просто написать следующее?

clampedFloat += .2f;

Я знаю, что здесь это похоже на мелочь, но если мне нужно добавлять аксессуар каждый раз, я мог бы просто зажимать его каждый раз вместо этого. Более того, мне кажется, что я чего-то упускаю, например, добавление простого типа данных без лишних хлопот, которые есть в свойствах класса, должно быть легко.

0
OsthatoAlfakyn 21 Май 2021 в 02:42

1 ответ

Лучший ответ

должно быть легко добавить простой тип данных без требуемой ерунды, которую имеют свойства класса.

Чтобы определить свой собственный тип или структуру, вы можете использовать пользовательские операторы преобразования и даже более сложные вещи, такие как перегрузка оператора.

Пользовательское преобразование
Чтобы преобразовать ваш новый классный класс в другой класс или из другого, вам нужно использовать операторы преобразования.

Для этого вы следуете простому формату

Преобразовать из вида

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 };
    }
}
0
DekuDesu 20 Май 2021 в 23:58