GetSet в C # не анализируется - PullRequest
0 голосов
/ 03 октября 2018

Относительно второстепенный вопрос о том, чего мне здесь не хватает,

Я пытаюсь выполнить простой GetSet в C#, чтобы получить представление о синтаксисе, но, похоже, что-то пропустил, как и все этопечатается GetSet.Role, а не фактические назначаемые атрибуты.

Я только что сформулировал что-то не так?Извиняюсь за второстепенный вопрос, но любая помощь приветствуется.

namespace GetSet
{
    class Program
    {
        static void Main(string[] args)
        {
            Role Mage = new Role("Staff", "Robes", "Magic affinity");
            Role Warrior = new Role("Sword", "Platebody", "Strength");
            Role Rogue = new Role("Needle", "Leather", "Cunning");

            Console.WriteLine(Mage);
            Console.WriteLine(Warrior);
            Console.WriteLine(Rogue);
            //stop the program from closing
            Console.ReadLine();
        }
    }
}

и мой класс:

namespace GetSet
{
    class Role
    {
        //private variables
        private string weapon;
        private string armour;
        private string passive;

        //public structs
        public Role(string aWeapon, string aArmour, string aPassive)
        {
            weapon = aWeapon;
            armour = aArmour;
            passive = aPassive;
        }

        //Getters and Setters for above private variables
        public string Weapon
        {
            get { return weapon; }
            set { weapon = value;}
        }
        public string Armour
        {
            get { return armour; }
            set { armour = value;}
        }
        public string Passive
        {
            get { return passive; }
            set { passive = value;}
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 03 октября 2018

Добавьте ToString() к вашему ролевому классу и установите для него возврат того, что вы хотите:

    public override string ToString()
    {
        return $"Weapon: {weapon}, Armor: {armor}, Passive: {passive}";
    } 
0 голосов
/ 03 октября 2018

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

namespace GetSet
{
    public class Role
    {
        // private backing field
        private string _weapon;

        // properties can have getters and setters, that contains some logic
        public string Weapon
        {
            get { return _weapon; }
            set { if (_weapon != vale) _weapon = value; }
        }

        // there is an auto-getters/setters
        // in this case, backing field is handled by .Net CLR
        public string Armour { get; set; }

        // getters and setters may have different access level
        // also, note property initializer '= "John";' - this will set property value
        // to "John" right before constructor invocation
        public string Name { get; private set; } = "John";

        // properties also can be readonly, so they can be setted only in constructors
        public string Passive { get; }

        // public constructor
        public Role(string passive)
        {
            Passive = passive;
        }

        public void ChangeName(string newName)
        {
            Name = newName; // setting property through private setter
        }

        // I believe, that this method shouldn't be used to represent object as string
        // At least, I think, you should never relay on it's return value, BUT it ups to you
        public overide string ToString() => Name;
    }
}

Кроме того, как вы можете видеть, я не устанавливаю общедоступные свойства (свойства с открытыми установщиками, Weapon и Armour) в consturctors, потому что я могу инициализировать их вместе с созданием объекта Role, например:

var mage = new Role("Magic affinity") { Weapon = "Staff", Armor = "Robes" };
mage.ChangeName("John, Doe");

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

// this will call .ToString() method
Console.WriteLine(mage);
// output: John, Doe

Я предлагаю это:

// represent object as you need
Console.WriteLine($"{mage.Name} - walks in {mage.Armour}, beats with {mage.Weapon}");
// output: John, Doe - walks in Robes, beats with Staff
0 голосов
/ 03 октября 2018

Вам необходимо переопределить метод ToString в классе GetSet.

Что-то вроде:

public override string ToString() 
{
     return $"{weapon}/{armour}/{passive}";
}

Обновление

Вы можете просто написать Role class.

internal class Role
{
    public Role(string weapon, string armour, string passive)
    {
        Weapon = weapon;
        Armour = armour;
        Passive = passive;
    }

    public string Weapon { get; }

    public string Armour { get; }

    public string Passive { get; }

    public override string ToString()
    {
        return $"{Weapon}/{Armour}/{Passive}";
    }
}

Re: комментарий vasily.sib.

Если вам нужно изменить свойства после создания объекта, просто измените

public string Passive { get; }

до

public string Passive { get; set; }
...