静态只读变量初始化 - c#

我有一些字典对象,它们在应用程序生命周期内不会发生变化。我打算使用静态只读变量,任何人都可以在以下几点上提供输入。

直接初始化为静态只读属性和使用带有私有只读静态变量备份的GET运算符的静态属性之间的区别。
我在网上阅读过不要使用公共静态变量,因此使用它们有任何风险吗?这是否适用于这种情况。

参考方案

我有一些字典对象,它们在应用程序生命周期内不会发生变化。

当标记“字典”类型为readonly的变量时,可以防止将您分配的字典替换为另一个字典。您不会将该字典设为只读,因为从某种意义上来说,只要调用者将手放在该字典上,他就可以按照自己想要的任何方式进行自由更改,将其清除或设置错误的值(错误地,毫无疑问)。如果需要将Dictionary设置为只读,请考虑借用只读包装器from this answer的实现。

通常,与{get;private set;}相比,在变量顶部添加属性或具有readonly static自动属性的唯一好处是,您可以在setter中执行其他检查,或者在getter中添加一些代码(例如,以收集访问统计信息或进行日志记录)。通过反射进入该领域也具有意义。看起来您没有执行任何操作,因此公开一个只读变量听起来很适当,并且不会带来其他风险。

编辑:(在使用反射时)通过反射访问对象数据时,必须指定是否要访问属性Xyz或字段Xyz。相反,当您编写C#程序时,您编写的是SomeClass.Xyz,编译器会确定它是适合您的属性还是字段。如果创建一个暴露字段Xyz的类,然后决定用属性Xyz替换它,则只需重新编译直接引用Xyz的代码即可。但是,如果编写了一些通过反射API访问Xyz的代码,则该代码将需要重写,因为编译器将无法为您捕获更改。

关于静态成员变量的问题 - java

在下面的代码中,我假设成员变量mBar仅在Foo对象的首次构造时实例化...并且此mBar实例化将与所有将来的Foo对象共享,但不会再次调用Bar()构造函数。这个准确吗?public class Foo { private static Bar mBar = new Bar(); public Foo() { } 参考方案 该对象实际上可能是在创建第一个F…

PHP:扩展静态成员数组 - php

我有以下情况:class A { public static $arr=array(1,2); } class B extends A { public static $arr=array(3,4); } 有没有办法组合这两个数组,所以B::$arr是1,2,3,4?我不需要更改这些数组,但是我无法将它们声明为als const,因为PHP不允许使用cons…

LeetCode题解计算机为什么是基于二进制的?

可以是三进制么?二进制有什么好处?题解:为什么叫电子计算机?算盘应该没有二进制

LeetCode题解统计城市的所有灯泡

这个是我刚毕业的时候,一个真实的面试题,这是一个开放题。题目描述:想办法,将一个城市的所有灯泡数量统计出来。题解:费米估算法1、如果某个城市常驻人口有1000万2、假设每5人居住在一套房里,每套房有灯泡5只,那么住宅灯泡共有1000万只3、假设公众场所每10人共享一只灯泡,那么共有100万只4、主要的这两者相加就得出了1100万只当然实际上这是估算的,具体应…

LeetCode题解黑白圆盘

一个圆盘被涂上了黑白二色,两种颜色各占一个半圆。圆盘以一个未知的速度、按一个未知的方向旋转。你有一种特殊的相机可以让你即时观察到圆上的一个点的颜色。你需要多少个相机才能确定圆盘旋转的方向?题解:可以用一个相机即可