C# — назначить поле объекта ссылкой на поле другого объекта (например, указатель)C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 C# — назначить поле объекта ссылкой на поле другого объекта (например, указатель)

Сообщение Anonymous »

У меня есть два объекта одного типа класса. У них обоих есть свойство (и его частное поле).
Условно я хотел бы присвоить это свойство/поле как ссылку на то же свойство/поле другого экземпляра того же класса.
Важно отметить, что мне необходимо прочитать поле, на которое указывает ссылка. Написать ему было бы бонусом, а не проблемой и не обязательно.
Я хотел бы знать, можно ли будет использовать поле ref и сделать что-нибудь логика внутри метода получения свойств.
Кроме того, я знаю, что здесь, на StackOverflow, было несколько вопросов по этому поводу (здесь, здесь, здесь, здесь), но все они довольно старые (поэтому идея дублирования сюда не применима).

Сейчас мы работаем на C# 10.0, и было реализовано множество различных возможностей ref, например ref locals. Я пытался использовать некоторые из них, но мне это не удалось. Надеюсь, кто-нибудь, обладающий большими знаниями, поможет мне найти способ сделать это.
Итак, возможно ли без использования оболочки связать свойство одного экземпляра с другим?? (это мой нынешний подход, подробно описанный ниже)

Подробнее:
Это мой класс (на самом деле это его сильное упрощение):

Код: Выделить всё

public class Person
{
private string _fullName;
public string FullName { get => _fullName; set => _fullName = value; }
}
Допустим, у меня есть 3 экземпляра этого класса. Теперь, если я попытаюсь присвоить значение одного свойства другому, значение просто скопируется (как и ожидалось. Я уже прекрасно понимаю, почему):

Код: Выделить всё

var person01 = new Person() { FullName = "Steve" };
var person02 = new Person() { FullName = "Mr. S" };
var person03 = new Person() { FullName = "Mister Steve" };

person02.FullName = person01.FullName;
// person02.FullName is "Steve"
person01.FullName = "Mr. Steve Jobs";
// person01.FullName is "Mr. Steve Jobs"
// person02.FullName is "Steve" because the value was only copied.
Я ПОНИМАЮ, ПОЧЕМУ ЭТО. Но я хочу знать, есть ли какой-нибудь элегантный способ сделать это:

Код: Выделить всё

ref person02.FullName = ref person01.FullName;  // not allowed
ref person03.FullName = ref person02.FullName;  // not allowed

person01.FullName = "Mr. Steve Jobs";
// person01.FullName is "Mr. Steve Jobs"
// person02.FullName is "Mr. Steve Jobs"
// person03.FullName is "Mr. Steve Jobs"
Итак, идея состоит в том, чтобы назначить поле как ссылку на другое поле другого объекта. Я считаю, что через свойство это невозможно, поскольку на самом деле это «метод» для получения и установки частного поля.
Итак, я сделал это, это работает, но это некрасиво:< /p>

Код: Выделить всё

public class Person
{
private string _fullName;
public string FullName
{
get => (FullName_Reference == null ? _fullName : FullName_Reference.FullName);
set => _fullName = value;
}
public Person FullName_Reference { get; set; }

public Person()
{
_fullName = "";
FullName_Reference = null;
}
}

var person01 = new Person() { FullName = "Steve" };
var person02 = new Person() { FullName = "Mr. S" };
var person03 = new Person() { FullName = "Mister Steve" };

person02.FullName_Reference = person01;
person03.FullName_Reference = person02;

person01.FullName = "Mr. Steve Jobs";
// person01.FullName is "Mr. Steve Jobs"
// person02.FullName is "Mr. Steve Jobs"
// person03.FullName is "Mr. Steve Jobs"
В поисках более элегантного способа сделать это я даже попытался раскрыть частное поле _fullName (с помощью метода, возвращающего ref< /code>), но мне не удалось установить частное поле (также с помощью метода) другого объекта как ссылку на ссылочный объект, возвращенный ранее. Он всегда просто копирует свое значение.

Подробнее здесь: https://stackoverflow.com/questions/713 ... field-like
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»