gpt4 book ai didi

c# - 是否可以在运行时设置 C# init-only 属性?

转载 作者:行者123 更新时间:2023-12-03 16:31:10 25 4
gpt4 key购买 nike

我尝试编写一些 C# 代码来创建一个 init-only 属性。
我惊讶地发现该属性可以在运行时更改。
我是否误解了不变性的概念?
我正在使用 Visual Studio 社区 16.9.3。
示例代码。

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; }
}

}
运行时示例。
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>
该程序的行为与此 Person 类相同。
    public class Person {
public string Name {
get { return m_Name; }
init { m_Name = value; }
}
private readonly string m_Name;
}
在这种情况下,只读修饰符也被忽略。
我想大多数人都会对 init-only 特性的效果感到惊讶。

最佳答案

您的 C# 代码不会重新分配值,因此这里没有违反 C# 规则。 powershell 是否取消规则完全取决于 powershell。笔记:

  • 反射 API 故意不阻止访问 - 这是为了使序列化程序、ORM 等无需更改即可工作(并且反射 API 不需要更改,这意味着它在旧运行时继续工作)
  • 更一般的 IL 访问检查取决于“modreq”——但这取决于相关的 IL 工具(通常是语言编译器)来做出决定;如果特定工具忽略“modreq”,则:它忽略它
  • 关于c# - 是否可以在运行时设置 C# init-only 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66917225/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com