Страницы

Поиск по вопросам

понедельник, 24 февраля 2020 г.

Подмена значения переменной через ссылку с#

#c_sharp


В приложенном коде (код упрощен) я, по замыслу, желал переназначить значение переменной
с помощью буферной другой. В процессе я понял, что делаю это неверно, т.к. кличка питомца
все же выдавалась изначальная. Как же мне, выполнить  это преобразование?

namespace Project
{
    class Program
    {
        static void Main(string[] args)
        {

            Animal[,] Animals = new Animal[10, 10];
            for (int i = 0; i < 10; i++)
                for (int j = 0; j < 10; j++)
                    Animals[i,j] = new Animal(0,0,"Unknow");

            //FindCat(Animals) = new Cat(FindCat(Animals).X, FindCat(Animals).Y, "Jake");
            //Ошибка компиляции, "иду иным путем"

            Animal Buffer = FindCat(Animals);
            Buffer = new Cat(Buffer.X, Buffer.Y, "Jake");
            //Не работает и при 
            //Buffer = new Cat(FindCat(Animals).X, FindCat(Animals).Y, "Jake");
            Console.Write(Animals[5,5].Name);//Unknow!
            Console.Read();
        }

        static Animal FindCat(Animal[,] a)
        {
            //На деле выбор сложнее, но не думаю, что столь важно то,
            //как выбирается индекс здесь, но выбор обязателен
            return a[5, 5];
        }
    }

    class Animal
    {
        public string Name;
        public int Y;
        public int X;

        public Animal() { }
        public Animal(int x, int y, string name)
        {
            X = x;
            Y = y;
            Name = name;
        }
    }

    class Cat : Animal
    {
        public string Color;

        public Cat(int x, int y, string name)
        {
            X = x;
            Y = y;
            Name = name;
        }
    }
}

    


Ответы

Ответ 1



Присвоение нового значения переменной Buffer (Buffer = new Cat(...);) изменит куда указывает переменная (ссылка, reference) Buffer, а переменная (ссылка, reference) Animals[5, 5] будет продолжать указывать на старый объект. static Animal GetAtCatPosition(Animal[,] animals) { return animals[5, 5]; } static void PutAtCatPosition(Animal[,] animals, Animal a) { animals[5, 5] = a; } Animal Buffer = GetAtCatPosition(Animals); PutAtCatPosition(Animals, new Cat(Buffer.X, Buffer.Y, "Jake")); Вариант 2 (Омега) Fundamental theorem of software engineering: public class AnimalHolder { public Animal Animal { get; set; } } static AnimalHolder FindCat(AnimalHolder[,] a) { return a[5, 5]; } AnimalHolder[,] Animals = new AnimalHolder[10, 10]; for (int i = 0; i < 10; i++) for (int j = 0; j < 10; j++) Animals[i,j] = new AnimalHolder() { Animal = new Animal(0, 0, "Unknown") }; AnimalHolder Buffer = FindCat(Animals); Buffer.Animal = new Cat(Buffer.X, Buffer.Y, "Jake"); Console.Write(Animals[5,5].Animal.Name);//Jake! Console.Read();

Ответ 2



Исправил namespace Project { class Program { static void Main(string[] args) { AngryAnimal MyAnimal = new AngryAnimal("Jake"); ////////////////////// Animal Pet; Pet = MyAnimal; Pet.Name = "Jack"; Console.Write(MyAnimal.Name);//Jack Console.Read(); } } class Animal { public string Name; public Animal(string name, int a, int b, int c) {Name = name;} } class AngryAnimal : Animal { public AngryAnimal(string name) :base(name, 1, 2, 3) {} } }

Комментариев нет:

Отправить комментарий