Во-первых, избегайте byte
для общего интегрального использования. Работа на int
быстрее, дает вам больше гибкости, а байт сэкономит место, только если вы их упакуете, и даже тогда экономия не будет значительной, пока у вас не появятся миллионы таких объектов.
Теперь вам не ясно, где находится "вычитаемое число".
Если правило «не может быть отрицательным» зависит от состояния (а не «оно действительно отрицательное, но отображается как ноль, и, например, -3 плюс 2 все равно будет показывать ноль, потому что внутренне оно равно нулю»), тогда принудительно применять это правило в точке, где происходит отсасывание.
private void Subtract(int subtrahend)
{
value = Math.Max(value - subtrahend, 0);
}
Если он должен быть внутренне отрицательным, но отображаться как ноль, просто сделайте это в геттере
public byte ByteForSomeReason
{
get { return Math.Max(value, 0); }
}
Или действительно, делать это в сеттере. Что вы имеете против сеттеров, устанавливающих значения, я бы предпочел, чтобы они были хороши в этом.