Tag: 只读

设置只读字段(这个错误吗?)

只是玩c#,实现了一件奇怪的事情。 这是代码: class Program { static void Main(string[] args) { System.Diagnostics.Debug.Write(string.Empty); typeof(string) .GetField(“Empty”, BindingFlags.Static | BindingFlags.Public) .SetValue(null, “Tolgahan”); Console.WriteLine(string.Empty); // output : Tolgahan } } 为什么反思让我们改变只读字段? 问题是“为什么允许通过reflection设置”,而不是“如何做”,所以它不是重复我可以使用reflection更改C#中的私有只读字段吗? 。

readonly是否有任何运行时开销?

出于某种原因,我一直认为readonly字段有与它们相关的开销,我认为这是CLR跟踪是否已初始化readonly字段。 这里的开销是一些额外的内存使用量来跟踪状态并在分配值时进行检查。 也许我假设这是因为我不知道readonly字段只能在构造函数内或字段声明本身内初始化,并且没有运行时检查,你将无法保证它不被多次分配各种方法。 但是现在我知道了,它可以很容易地被C#编译器静态检查,对吧? 那是这样的吗? 另一个原因是我读过readonly的使用对性能有轻微的影响,但他们从未涉及过这个主张,因此无法找到有关此主题的信息,因此我提出了问题。 我不知道运行时检查可能会对其他性能产生什么影响。 第三个原因是我看到readonly在编译的IL中保存为initonly ,所以如果readonly仅仅是C#编译器保证该字段永远不会分配给IL,那么这个信息在IL中的原因是什么?在构造函数或声明之外? 另一方面,我发现你可以通过reflection设置readonly int的值,而CLR不会抛出exception,如果readonly是运行时检查,这是不可能的。 所以我的猜测是:’readonlyness’只是一个编译时function,任何人都可以确认/否认这个吗? 如果是,那么这些信息被包含在IL中的原因是什么?

如何使引用类型属性“readonly”

我有一个类Bar ,其中包含一个包含引用类型Foo的私有字段。 我想在公共财产中暴露Foo ,但我不希望财产的消费者能够改变Foo ……但是它应该由Bar内部改变,即我不能使该字段readonly 。 所以我想要的是: private _Foo; public Foo { get { return readonly _Foo; } } ……当然无效。 我可以返回一个Foo的克隆(假设它是IClonable ),但这对消费者来说并不明显。 我应该将属性的名称更改为FooCopy吗? 它应该是GetCopyOfFoo方法吗? 你认为最佳做法是什么? 谢谢!

如何解决IReadOnlyDictionary缺乏协方差?

我正在尝试公开一个只读字典,该字典包含具有只读接口的对象。 在内部,字典是可写的,其中的对象也是可写的(参见下面的示例代码)。 我的问题是IReadOnlyDictionary不支持协变转换,因为这里的问题概述了原因。 这意味着我不能将我的内部字典公开为只读字典。 所以我的问题是,有没有一种有效的方法将我的内部字典转换为IReadOnlyDictionary,或者其他一些方法来处理它? 我能想到的选择是: 保留两个内部词典并使它们保持同步。 访问属性并在其中转换所有对象时创建新字典。 在内部使用它时,将IReadOnly转回NotReadOnly。 1看起来像是一种痛苦,2似乎非常低效。 3听起来像目前最有希望,但仍然是丑陋的。 我还有其他选择吗? public class ExposesReadOnly { private Dictionary InternalDict { get; set; } public IReadOnlyDictionary PublicList { get { // This doesn’t work… return this.InternalDict; } } // This class can be modified internally, but I don’t want // to expose this functionality. private class […]