Страницы

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

вторник, 7 мая 2019 г.

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

В приложенном коде (код упрощен) я, по замыслу, желал переназначить значение переменной с помощью буферной другой. В процессе я понял, что делаю это неверно, т.к. кличка питомца все же выдавалась изначальная. Как же мне, выполнить это преобразование?
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; } } }


Ответ

Присвоение нового значения переменной 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();

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

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