Доступ к члену напрямую по имени класса - PullRequest
0 голосов
/ 28 декабря 2018

Я пытаюсь создать класс / структуру ufloat в c #.Для меня это более сложная задача, но она поможет мне контролировать некоторые значения в коде.После того, как я попробовал пару подходов, у меня, наконец, есть один, который, кажется, работает:

public struct ufloat
{
    public float Value
    {
        get{ return value; }
        set
        {
            if(value < 0)
            {
                this.value = 0;
            }
            else
            {
                this.value = Math.Abs(value);
            }
        }
    }
}

Проблема в том, что я хочу, чтобы он вел себя как типичный базовый тип:

ufloat n = 5;
n += 1;

ПослеЯ подумал, что я пытался перегрузить оператор '=', но это невозможно.Теперь у меня нет идей.Вот почему я спрашиваю, как вы можете изменить это:

ufloat x; x.value = 1;

на это:

ufloat x = 0; x = 1;

?

(Извините, если я что-то теряю очень легко,но я "программист" самоучка, и я довольно плохо знаком с c #. Сначала я выучил c ++, и переход от низшего к более высокому уровню мне не прост.)

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Вы не можете перегрузить оператор =, но вы можете написать неявное приведение, например, это для приведения типа int:

public class ufloat
{
    public float value { get; }
    public ufloat(int val) {  value = Math.Abs(val); }
    public static implicit operator ufloat(int input) 
    {
         return new ufloat(input);
    }
}

Теперь, если вы присвоите ему значение типа int, оно будет неявнобыть преобразовано в ufloat:

ufloat x = -5;
0 голосов
/ 28 декабря 2018

Вы не можете перегрузить оператор =, но вы можете перегрузить оператор +, и тогда оператор += (который, я полагаю, вы имели в виду вместо =+) будет работать достаточно очевидным образом,Вам также необходимо добавить неявное преобразование из float в вашу структуру.

Я бы настоятельно рекомендовал не сделать структуру изменяемой, хотя - вместо этого, позвольте оператору +вернуть новое значение.Это заставит его вести себя как любой другой примитивный тип и как большинство других структур.Я бы также переименовал его в USingle, чтобы следовать обычным соглашениям об именах .NET (где Single - это имя CLR для float).Вы не можете добавить свой собственный псевдоним C # для имени, например float для Single.

Я подозреваю, что ваш тип захочет:

  • Конструктор, принимающий float
  • Преобразования в и из float (обратите внимание, что обычно неявные преобразования не должны вызывать исключения - вы можете хотеть игнорировать это, но я не уверен ...)
  • Перегрузки для арифметических операторов (+, -, * и /)
  • Переопределения ToString, Equals и GetHashCode
  • Реализация IComparable<USingle> и IEquatable<USingle>

Вы должны подумать о том, что вы хотите, если вы добавите два значения, которые являются «большими положительными числами» вместе - это намерение, что ваш новыйtype может поддерживать большие положительные значения, чем float, или это просто "float, но всегда неотрицательный"?

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