Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

178
Vistas
C#: asigne el campo de un objeto como referencia al campo de otro objeto (como un puntero)

Tengo dos objetos, del mismo tipo de clase. Ambos tienen una propiedad (y su terreno privado). Condicionalmente, me gustaría asignar esta propiedad/campo como referencia a la misma propiedad/campo de otra instancia de la misma clase.

Es importante tener en cuenta que mi requisito es leer el campo al que se hace referencia. Escribirle sería una ventaja, no un problema y no es necesario.

Me gustaría saber si sería posible usar un campo de ref y hacer algo de lógica dentro del captador de propiedades.

Además, sé que ha habido algunas preguntas sobre esto aquí en StackOverflow ( aquí , aquí , aquí , aquí ), pero todas son bastante antiguas (por lo que la idea de duplicado no parece aplicarse aquí).
Ahora estamos en C# 10.0 y se han implementado muchas capacidades de ref diferentes, como referencias locales . Intenté usar algunos de ellos, pero fallé. Espero que alguien con más conocimiento pueda ayudarme a ver una manera de hacerlo.

Entonces, ¿es posible, sin usar un contenedor, vincular la propiedad de una instancia a otra? (que es mi enfoque actual, detallado a continuación)


Más detalles:

Esa es mi clase (en realidad es una gran simplificación de la misma):

 public class Person { private string _fullName; public string FullName { get => _fullName; set => _fullName = value; } }

Y, digamos que tengo 3 instancias de esta clase. Ahora, si trato de asignar el valor de una propiedad a otra, el valor simplemente se copia (como se esperaba. Ya sé por qué):

 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.

ENTIENDO POR QUÉ ES. Pero quiero saber si hay alguna manera elegante de hacer esto:

 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"

Entonces la idea es asignar un campo como referencia a otro campo de otro objeto. Creo que a través de una propiedad no es posible, ya que en realidad es un "método" para obtener y configurar el campo privado.

Así que hice esto, funciona, pero no es bonito:

 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"

Buscando una forma más elegante de hacerlo, incluso traté de exponer el campo privado _fullName (a través de un método que devolvía una ref ), pero no pude establecer el campo privado (también a través de un método) del otro objeto como referencia. al objeto de referencia devuelto previamente. Siempre copia su valor.

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

No estoy familiarizado con todas las características nuevas de C# 10.0, pero puede lograr el comportamiento deseado si trata el nombre como un objeto por derecho propio y hace referencia al objeto Nombre en cada una de sus instancias de Persona. es decir, simplemente trátelo como una composición

 public class Name { public string FullName { get; set; } public Name(string fullName) { FullName = fullName; } } public class Person { public Name Name { get; set; } public string FullName => Name.FullName; public Person(Name name) { Name = name; } } var person01 = new Person(new Name("Steve")); var person02 = new Person(new Name("Mr. S")); var person03 = new Person(new Name("Mister Steve")); person02.Name = person01.Name; person03.Name = person02.Name; person01.Name.FullName = "Mr. Steve Jobs"; // person01.FullName is "Mr. Steve Jobs" // person02.FullName is "Mr. Steve Jobs" // person03.FullName is "Mr. Steve Jobs"

EDITAR: para manejar el requisito explicado en los comentarios

 public class Name { public string FullName { get; set; } private readonly List<Person> _people = new List<Person>(); public Name(string fullName) { FullName = fullName; } public void Add(Person person) { _people.Add(person); } public void UpdateNames(Name name) { foreach (Person person in _people) { person.SetName(name); } _people.Clear(); } } public class Person { private Name _name; public Name Name { get => _name; set { _name.UpdateNames(value); _name = value; } } public string FullName => Name.FullName; public Person(Name name) { _name = name; _name.Add(this); } public void SetName(Name name) { _name = name; _name.Add(this); } }
over 4 years ago · Santiago Trujillo Denunciar

0

En mi opinión, la forma más fácil de lograr lo que desea es usar Func<string> para recuperar valores de referencia:

 class Person { private Func<string> _fullName; public string FullName { get => _fullName(); set => _fullName = () => value; } public void SetFullNameRef(Func<string> value) { _fullName = value; } } static void Main(string[] args) { var person01 = new Person() { FullName = "Steve" }; var person02 = new Person() { FullName = "Mr. S" }; var person03 = new Person() { FullName = "Mister Steve" }; person02.SetFullNameRef(() => person01.FullName); person03.SetFullNameRef(() => person02.FullName); person01.FullName = "Mr. Steve Jobs"; Console.WriteLine(person01.FullName); // Mr. Steve Jobs Console.WriteLine(person02.FullName); // Mr. Steve Jobs Console.WriteLine(person03.FullName); // Mr. Steve Jobs }

O escríbelo así:

 class Person { private Func<string> _fullName; public string FullName { get => _fullName(); set => _fullName = () => value; } public Func<string> RefFullName { get => () => _fullName(); set => _fullName = () => value(); } } static void Main(string[] args) { var person01 = new Person() { FullName = "Steve" }; var person02 = new Person() { FullName = "Mr. S" }; var person03 = new Person() { FullName = "Mister Steve" }; person02.RefFullName = person01.RefFullName; person03.RefFullName = person02.RefFullName; person01.FullName = "Mr. Steve Jobs"; Console.WriteLine(person01.FullName); // Mr. Steve Jobs Console.WriteLine(person02.FullName); // Mr. Steve Jobs Console.WriteLine(person03.FullName); // Mr. Steve Jobs }
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda