случайный метод в методе сеттера в C # - PullRequest
1 голос
/ 03 октября 2019

Я новичок в C #. Я пытаюсь понять, как использовать случайный метод внутри сеттера. Вот как выглядит мой код прямо сейчас:

public class star_wars_figures
{
    private string charactor;
    private int bounty;

    public star_wars_figures(string charactor)
    {
        Charactor = charactor;            }

    public string Charactor
    {
        get
        {
            return charactor.ToUpper();
        }
        set
        {
            if (value == "Han Solo" || value == "Leia")
            {
                charactor = value;
            }
            else charactor = "INCORRECT CHARACTOR!!!!";
        }
    }

    public int Bounty
    {
        get
        {
            return bounty;
        }
        set
        {
            Random rnd = new Random();
            bounty = rnd.Next(1, 10);
            bounty = value;
        }
    }
}

В своей основной статье я настаиваю на следующем:

star_wars_figures sw1 = new star_wars_figures("Han Solo");
Console.WriteLine($"Character is: {sw1.Charactor}");
Console.WriteLine($"Money: {sw1.Bounty}"); 

Я пытаюсь сгенерировать случайное число типа int в методе setterБазовый атрибут. Он просто возвращает 0.

Что я здесь пропустил?

-спасибо

Ответы [ 3 ]

4 голосов
/ 03 октября 2019

«значение» (ваше последнее назначение) - это значение, полученное при вызове сеттера.

В настоящее время «bounty» устанавливается дважды: сначала, но ваш случайный результат генератора, и сразу же после «value». Поэтому первый набор значений теряется и нигде не используется.

Вы можете просто удалить "bounty = value;"чтобы это работало. Тем не менее, установщик свойств не является подходящим местом для того, чтобы делать то, что вы, кажется, хотите, я думаю, у вас есть фундаментальное недопонимание, как работать со свойствами и вспомогательными полями.

1 голос
/ 03 октября 2019

Потому что вы не устанавливаете награду в конструкторе объектов. Вы используете только добытчик для Баунти собственности. Попробуйте использовать:

public star_wars_figures(string charactor)
{
    Charactor = charactor;
    Random rnd = new Random();
    bounty = rnd.Next(1, 10);
}
1 голос
/ 03 октября 2019

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

Измените код на

public class StarWarsFigures
{
    // Define one instance of the random number generator
    static readonly Random rng = new Random();

    ...
}

Теперь, когда он используется внутри сеттера, это плохой дизайн, поскольку цельсеттер устанавливает свойство в указанное значение. Если вы хотите изначально установить для свойства случайное число, сделайте это в конструкторе.

    public StarWarsFigures(string character)
    {
        this.Character = character;
        this.Bounty = rng.Next(1, 10);
    }

    public int Bounty
    {
        get { return bounty; }
        set { bounty = value; }
    }

Наконец, есть некоторые проблемы со строкой символов. Я предполагаю, что вы хотите сохранить его только в верхнем регистре, так как геттер конвертирует его как таковой. Лучше сделать преобразование один раз в сеттере вместо этого. Кроме того, при сравнении строк всегда используйте .Equals() вместо ==, поскольку они означают разные значения для строк. Наконец, вам необходимо преобразовать заданное значение в верхний регистр также перед сравнением или использовать параметр StringComparison.OrdinalIgnoreCase.

    public string Character
    {
        get { return character; }
        set
        {
            if (value.Equals("Han Solo", StringComparison.OrdinalIgnoreCase) 
                || value.Equals("Leia", StringComparison.OrdinalIgnoreCase))
            {
                character = value.ToUpper();
            }
            else
            {
                character = "INCORRECT CHARACTER!!!!";
            }
        }
    }

PS. Вы можете исправить опечатки. Character является правильным написанием, а не Charactor.

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