Как получить доступ к переменным внутри объекта? - PullRequest
0 голосов
/ 16 марта 2020

Я создаю алгоритм для заполнения поезда животными в зависимости от их размера и типа.

Представьте себе объект животного в классе животных с type и size.

/* 0 = Carnivore, Carnivores will eat other animals which are smaller or the same size.
 * 1 = Herbivore
 * Animal sizes 1, 3, 5 are currently available.
 * A trainwagon can fit a maximum of 10 points. The wagon needs to filled optimally.
 * A new wagon is added if there are still animals which need to board the train. 
 */

public Animal(int type, int size)
{
    this.type = type;
    this.size = size;
}

Мне нужна ценность животного, чтобы отсортировать их. Итак, я создал метод переопределения ToString () для получения значения.

public override string ToString()
{
    string animalInformation = type.ToString() + size.ToString();
    return animalInformation.ToString();
}

В настоящее время я решил его, разделив символы строки и преобразовав их обратно в целые числа.

int animalType = Convert.ToString(animalInformation[0]); 
int animalSize = Convert.ToString(animalInformation[1]);

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

Ответы [ 2 ]

2 голосов
/ 16 марта 2020

Еще раз взглянем на ваш конструктор:

public Animal(int type, int size)
{
    this.type = type;
    this.size = size;
}

Это означает, что type и size являются элементами данных вашего Animal class, что означает, что любой экземпляр Animal имеет type или size. this.type не переменная, а скорее элемент данных объекта, который похож на переменную в силу своей изменчивости, но это неотъемлемый атрибут объекта. Если вы делаете что-то вроде

Animal animal = new Animal(1, 1);

, и тогда вы не можете достичь animal.type, это означает, что animal.type - это не public, а private или protected. Вы бы смогли добраться до него, если бы оно было public. Однако не меняйте его на public, это хорошо, если вы защищаете свои поля от некоторых проблемных c обращений, которые я сейчас не описываю. Вместо этого вы можете определить методы получения, например

public int getType() {
    return this.type;
}

public int getSize() {
    return this.size;
}

или некоторые свойства только для чтения и получить значения по ним.

1 голос
/ 16 марта 2020

Если нет каких-либо подробностей, неочевидных из вопроса, вам следует просто создать свойства для полей, т.е.

public readonly struct Animal
{
    public int Type { get; }
    public int Size { get; }

    public Animal(int type, int size)
    {
        Type = type;
        Size = size;
    }
}

Сортировка может быть выполнена с помощью linq. «ThenBy (...)» требуется только в том случае, если вам нужно отсортировать по обоим свойствам:

var sortedAnimals = animals.OrderBy(animal => animal.Type).ThenBy(animal => animal.Size);

Как упоминалось в комментариях, если вы хотите разрешить только некоторые значения для типа и размера, вам следует вероятно, используйте enums . Или, по крайней мере, проверьте аргументы и сгенерируйте исключение, если проверка не удалась.

...