Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

372
Views
¿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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!