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

368
Vistas
¿Debería ser posible establecer una propiedad de solo inicio de C# en tiempo de ejecución?

Intenté escribir código C# para crear una propiedad de solo inicio. Me sorprendió descubrir que la propiedad se podía cambiar en tiempo de ejecución. ¿He entendido mal la idea de inmutabilidad? Estoy usando Visual Studio Community 16.9.3.

Código de muestra.

 namespace TonyStachnicki.Windows { using System.Management.Automation; [Cmdlet(VerbsCommon.New, "Person")] public class NewPerson : Cmdlet { protected override void ProcessRecord() { var _Person = new Person { Name = "Jane Dough" }; WriteObject(_Person); } } public class Person { public string Name { get; init; } } }

Ejemplo de tiempo de ejecución.

 PS D:\Users\Tony> ($Person = New-Person) Name ---- Jane Dough PS D:\Users\Tony> $Person.Name = "John Smith" PS D:\Users\Tony> $Person Name ---- John Smith PS D:\Users\Tony> $Person.Name = "Jane Jones" PS D:\Users\Tony> $Person Name ---- Jane Jones PS D:\Users\Tony>

El programa se comporta igual con esta clase de Persona.

 public class Person { public string Name { get { return m_Name; } init { m_Name = value; } } private readonly string m_Name; }

En este caso, el modificador de solo lectura también se ignora.
Creo que la mayoría de la gente se sorprendería del efecto de la función de solo inicio.

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

0

Su código C# no reasigna el valor, por lo que aquí no se violaron las reglas de C#. Si powershell resecta las reglas depende completamente de powershell. Nota:

  • la API de reflexión deliberadamente no impide el acceso: esto fue para que los serializadores, ORM, etc. funcionaran sin cambios (y también para que la API de reflexión no necesitara cambios, lo que significa que continúa funcionando igual en tiempos de ejecución más antiguos)
  • la verificación de acceso de IL más general depende de un "modreq", pero eso depende de las herramientas de IL relevantes (generalmente un compilador de lenguaje) para tomar decisiones; si una herramienta en particular ignora "modreq", entonces: lo ignora
over 4 years ago · Santiago Trujillo Denunciar

0

De esta fuente : "Cuando se usa la palabra clave init, restringe una propiedad para que solo la establezca un constructor o durante la creación de objetos anidados". Eso significa que

 var _Person = new Person { Name = "Jane Dough" };

es legal (ya que utiliza la creación de objetos anidados). Esto es diferente al caso anterior a C# 9.0, donde podía definir la propiedad sin un setter. Esto permite la inicialización solo en el constructor, pero no en la creación de un objeto anidado.

Por lo tanto, si define su clase Person como:

 public class Person { public string Name { get; } }

su código no se compilaría (y necesitaría proporcionar un constructor no predeterminado a su clase de Persona para establecer el Nombre en algo)

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