Байтовое свойство, которое должно быть 0, если значение будет отрицательным? - PullRequest
0 голосов
/ 13 января 2012

У меня проблема с байтовым свойством.Я хочу, чтобы атрибут был равен 0, если вычесть сумму, которая установит число ниже 0.

Моя проблема заключается в том, что в свойстве я получаю только поле значения, в котором вычисление уже завершено, а значение неотрицательно, но сумма, которая была бы отрицательной, вычиталась из максимального значения байта.

Изменение типа атрибута на sbyte не является опцией.

Есть ли способ убедиться, что 4 минус 50, а не 255 без написания явного метода установки и только с использованием свойства получения?

Ответы [ 2 ]

2 голосов
/ 13 января 2012

Во-первых, избегайте byte для общего интегрального использования. Работа на int быстрее, дает вам больше гибкости, а байт сэкономит место, только если вы их упакуете, и даже тогда экономия не будет значительной, пока у вас не появятся миллионы таких объектов.

Теперь вам не ясно, где находится "вычитаемое число".

Если правило «не может быть отрицательным» зависит от состояния (а не «оно действительно отрицательное, но отображается как ноль, и, например, -3 плюс 2 все равно будет показывать ноль, потому что внутренне оно равно нулю»), тогда принудительно применять это правило в точке, где происходит отсасывание.

private void Subtract(int subtrahend)
{
  value = Math.Max(value - subtrahend, 0);
}

Если он должен быть внутренне отрицательным, но отображаться как ноль, просто сделайте это в геттере

public byte ByteForSomeReason
{
  get { return Math.Max(value, 0); }
}

Или действительно, делать это в сеттере. Что вы имеете против сеттеров, устанавливающих значения, я бы предпочел, чтобы они были хороши в этом.

1 голос
/ 13 января 2012

Как на счет этого, когда свойство backing имеет тип int:

    private int m_TestValue;
    public byte TestValue
    {
        get
        {
            if (m_TestValue < 0)
            {
                return 0;
            }
            else
            {
                return (byte)m_TestValue;
            }
        }
        set {
            m_TestValue = value;
        }
    }

Обновление

Благодаря 32bitkid я теперь понимаю, что вышеуказанное решениене работает, потому что любое отрицательное значение будет преобразовано в положительное значение до достижения установщика.

Единственный способ решить эту проблему, кроме проверки значения перед присвоением, состоит в изменении типа данных свойствав int, но затем предоставьте свойство байта, которое обеспечивает желаемую функциональность.

Например:

    public int TestValue {get; set; }

    public byte TestValueAsByte
    {
        get
        {
            if (this.TestValue < 0)
            {
                return 0;
            }
            else
            {
                return (byte)this.TestValue;
            }
        }
        set
        {
            this.TestValue = value;
        }
    }
...