确保数据不会在静态类中被清理

本文关键字:静态类 数据 确保 | 更新日期: 2023-09-27 18:13:57

是否有一种方法可以让静态类具有在函数调用结束时不清除自身的静态数据?即给定:

static class Class1
{
    static int[] _array;
    static Class1()
    {
         _array = new[] {2};
    }
    public static void FillArray()
    {
        List<int> temp = new List<int>();
        for(int i=0;i<100;i++)
            temp.Add(i);
        _array = temp.ToArray();
    }
    public static int[] GetArray()
    {
        return _array;
    }
}

我怎么能得到GetArray()返回的东西不是null?

EDIT:我想调用这段代码:

        int[] array1 = Class1.GetArray();
        for (int i = 0; i < array1.Length;i++ )
            Console.WriteLine(array1[i]);
        Class1.FillArray();
        for (int i = 0; i < array1.Length; i++)
            Console.WriteLine(array1[i]);
而不是得到两个2s。我怎样才能做到呢?

确保数据不会在静态类中被清理

        int[] array1 = Class1.GetArray();
        for (int i = 0; i < array1.Length;i++ )
            Console.WriteLine(array1[i]);
        Class1.FillArray();
        for (int i = 0; i < array1.Length; i++)
            Console.WriteLine(array1[i]);

在这段代码中,您将获得第一个int[]{2}数组的内存地址,并将其存储为array1。然后,当您调用FillArray()时,您正在创建新的数组列表,并且仅将其内存设置回类中的_array,而不是array1。这不是对类中的内存的引用,而是对实际的原始数组的引用。所以,当你循环回去的时候,你仍然在看同一个内存块。

你可能应该这样做:

    int[] array1 = Class1.GetArray();
    for (int i = 0; i < array1.Length;i++ )
        Console.WriteLine(array1[i]);
    Class1.FillArray();
    array1 = Class1.GetArray();
    for (int i = 0; i < array1.Length; i++)
        Console.WriteLine(array1[i]);

如果您将Class1更改为如下所示,您将看到您正在更改类中的数据。

   static class Class1
   {
      static int[] _array;
      static Class1()
      {
         _array = new[] { 2 };
      }
      public static void FillArray()
      {
         List<int> temp = new List<int>();
         for (int i = 0; i < 100; i++)
         {
            temp.Add(i);
         }
         _array = temp.ToArray();
         PrintArray();
      }
      public static int[] GetArray()
      {
         PrintArray();
         return _array;
      }
      private static void PrintArray()
      {
         foreach (int i in _array)
         {
            System.Console.Write(String.Format("{0},", i));
         }
      }
   }

因为它会在每次调用后打印出数组中的元素

使用静态构造函数…

static class Class1
{
    private static readonly  int[] _array;
    static Class1()
    {
        List<int> temp = new List<int>();
        for(int i=0;i<100;i++)
            temp.Add(i);
        _array = temp.ToArray();
    }
    public static int[] GetArray()
    {
        return _array;
    }
}

你可以这样写

private static readonly int[] array = FillArray();