5 回答
TA贡献2016条经验 获得超9个赞
不确定这是否与我们的情况相同,但我们有一个类可以从配置中访问密钥
string sampleString = WebConfigurationManager.AppSettings["SampleString"]
由于一些合并问题,示例字符串已从我们的 web.config 中删除。当您访问变量下面的类中的任何变量时,会发生空指针错误。
在配置中添加密钥解决了这个问题。
TA贡献2003条经验 获得超2个赞
当我运行此代码时:
void Main()
{
Console.WriteLine(Constants.sampleList.Contains(1));
}
public static class Constants
{
public static string sampleString= "";
public static List<int> sampleList= new List<int> {1,2,3};
}
我进入True控制台。您需要提供演示您所面临问题的代码。
TA贡献2039条经验 获得超7个赞
如果您readonly
在方法中添加关键字。该方法只能在构造函数内部或在属性声明阶段进行实例化。
public static readonly List<int> sampleList= new List<int> {1,2,3};
如果您尝试重新初始化或对 进行新分配sampleList
,C# 编译器会给您编译器错误。
更好地使用属性
public static readonly List<int> SampleList {get; set;} = new List<int> {1,2,3};
TA贡献1155条经验 获得超0个赞
没有奇迹,如果sampleList是null(并且您抛出了异常),那么您null在某处分配给它。尽量不要暴露 易受攻击的public 字段:Constants
public static class Constants
{
public static string sampleString = "";
public static List<int> sampleList = new List<int> {1,2,3};
}
...
Constants.sampleList = null; // We can easly assign null
...
Constants.sampleList.Add(123); // <- And have an unxpected exception
但是要么把它们变成属性:
public static class Constants
{
private static string s_SampleString = "";
private static List<int> s_SampleList = new List<int> {1,2,3};
public static string sampleString {
get {return s_SampleString;}
set {s_SampleString = value ?? "";}
}
public static List<int> sampleList {
get {return s_SampleList;}
// I doubt you actually want set here
set {s_SampleList = value ?? new List<int>();}
}
}
或者,至少,将字段标记为readonly(您只能分配一次):
public static class Constants
{
private static string s_SampleString = "";
public static string sampleString {
get {return s_SampleString;}
set {s_SampleString = value ?? "";}
}
// Manipulate with me, but not reassign
public static readonly List<int> sampleList = new List<int> {1,2,3};
}
无论哪种情况,您仍然可以使用列表进行操作:
Constants.sampleList.Add(4);
Constants.sampleList.RemoveAt(0);
但是您可以避免分配null给列表:将分配空列表(带有属性的代码),或者您将遇到编译时错误(带有 的代码readonly)
TA贡献1826条经验 获得超6个赞
在我的例子中,我private static readonly Dictionary<byte, string>在一个结构内部定义了一个来保存预定义的常量。这通常可以正常工作,但是我还在我的结构中定义了一个 MinValue 来表示一条数据的最小值。以这种方式完成时,静态字典未初始化,除非在静态 MinValue 属性上方定义。我可能对编译器的要求太多了,应该对其进行重构。
在大型结构中很难诊断,因为我没想到 C# 会出现这种行为。重现示例:
public struct MyStruct
{
public string Str;
public static readonly MyStruct MinValue = new MyStruct(0);
public MyStruct(byte val)
{
Str = _predefinedValues[val]; // null reference exception
}
private static readonly Dictionary<byte, string> _predefinedValues = new Dictionary<byte, string>()
{
{0x00, "test 1"},
{0x01, "test 2"},
{0x02, "test 3"},
};
}
这里的解决方案是双重的:
不调用结构上的任何构造函数并在不访问
_predefinedValues
列表的情况下显式设置每个字段。或者,将列表向上移动到 MinValue 字段声明之上实际上也可以修复它(奇怪吧?)
我怀疑在尝试分配它时堆栈上发生了一些奇怪的事情,这可能是一件奇怪的事情。
- 5 回答
- 0 关注
- 112 浏览
添加回答
举报