2011-11-08 12 views
0

静的クラスに関数呼び出しの終了時に自身をクリアしない静的データを持たせる方法はありますか? は、すなわち、与えられた:静的クラスでデータがクリーンアップされないようにする

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

なく2つの2Sを取得します。私はどうすればそれを実現できますか?

答えて

1
 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}配列を作成し、それを配列1として格納します。その後、FillArray()を呼び出すと、配列の新しいListを作成し、array1ではなくそのクラスの_arrayにそのメモリを設定するだけです。これは、クラス内のメモリへの参照ではなく、実際の元の配列への参照です。それで、ループバックすると、同じメモリブロックを探しています。

おそらく、代わりにこれを実行する必要があります。

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

    } 

呼び出しごとに配列の要素が出力されるためです。

+0

しかし、私は静的クラスのデータを変更したい...私は現在のクラスのデータを変更することができます知っている。 – soandos

+0

クラス内のデータを変更しています。 Class1._arrayはFillArray関数の後で変更されています。しかし、なぜあなたのコードが2回2回印刷されているのかは、array1ではなくClass1._arrayでループしているためです。 – Wizetux

1

使用静的コンストラクタ...

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

データを変更したいが、すべての変更を最初の100個の数字で埋めるような「保存」してから、最初の200個の数字に置き換えることができます。どうやってやるの? – soandos

+0

@soandos: 'readonly'を削除するだけで、' _array'を変更することができます。 –

+0

しかし、それはその後清掃されませんか? – soandos

0

あなたはこのコードで

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

しかし、私はその静的なデータを変更したいと言うことができます... – soandos

+0

readonlyキーワードを削除すると、あなたはそれを修正することができますし、あなたの静的なclqssが破壊されるとき、アプリケーションが閉じられる – Mike

+0

そうでない場合...他のプロジェクトの静的クラスです。それは私がアクセスするたびにクリーンアップされるようです... – soandos

関連する問題