Убедитесь, что данные не очищаются в статическом классе - PullRequest
0 голосов
/ 09 ноября 2011

Есть ли способ, чтобы статический класс имел статические данные, которые не очищаются в конце вызова функции? т.е. дано:

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 () возвращать что-то отличное от нуля?

РЕДАКТИРОВАТЬ: Я хочу позвонить по этому коду:

        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]);

и не получай две 2с. Как я могу это сделать?

Ответы [ 3 ]

1 голос
/ 09 ноября 2011
        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));
         }
      }

   }

Потому что он будет распечатывать элементы в массиве после каждого вызова.

1 голос
/ 09 ноября 2011

использовать статический конструктор ...

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;
    }
}
0 голосов
/ 09 ноября 2011

вы можете написать что-то вроде

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