为了账号安全,请及时绑定邮箱和手机立即绑定

静态列表显示为空

静态列表显示为空

C#
慕尼黑的夜晚无繁华 2022-10-23 15:07:55
我有一个名为常量的静态类。public static class Constants{    public static string sampleString= "";    public static List<int> sampleList= new List<int> {1,2,3};}如果我在外面调用我的静态列表: Constants.sampleList它会给我一个空异常,但Constants.sampleString可以毫无问题地调用。我在这里错过了什么吗?
查看完整描述

5 回答

?
慕沐林林

TA贡献2016条经验 获得超9个赞

不确定这是否与我们的情况相同,但我们有一个类可以从配置中访问密钥

string sampleString = WebConfigurationManager.AppSettings["SampleString"]

由于一些合并问题,示例字符串已从我们的 web.config 中删除。当您访问变量下面的类中的任何变量时,会发生空指针错误。

在配置中添加密钥解决了这个问题。


查看完整回答
反对 回复 2022-10-23
?
湖上湖

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控制台。您需要提供演示您所面临问题的代码。


查看完整回答
反对 回复 2022-10-23
?
largeQ

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


查看完整回答
反对 回复 2022-10-23
?
白衣非少年

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)


查看完整回答
反对 回复 2022-10-23
?
跃然一笑

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"},

    };


}

这里的解决方案是双重的:

  1. 不调用结构上的任何构造函数并在不访问_predefinedValues列表的情况下显式设置每个字段。

  2. 或者,将列表向上移动到 MinValue 字段声明之上实际上也可以修复它(奇怪吧?)

我怀疑在尝试分配它时堆栈上发生了一些奇怪的事情,这可能是一件奇怪的事情。



查看完整回答
反对 回复 2022-10-23
  • 5 回答
  • 0 关注
  • 112 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信