2016-08-17 10 views
0

私は自分のスタッククラスを設計する必要があるオンラインC#コースでコーディング演習を受けました。 このコードで遭遇し続ける問題は、何らかの理由でSystem.TypeInitializationExceptionを与え続けることです。私は修飾子を変更しようとしましたが、何も働いていません。どんな解決策ですか?ここ は、次のコードです:私は私のスタッククラスを使用するたびにSystem.TypeInitializationExceptionを取得することを止める方法

LastElementを初期化しようと
public class Stack 
{ 
    public static List<object> StackStorage = new List<object>(); 
    public static object LastElement = StackStorage[StackStorage.Count - 1]; 
    public static object FirstElement = StackStorage[0]; 


    public void Push(object obj) 
    { 
     if (StackStorage.Count - 1 >= 8) 
     { 
      StackStorage.Remove(LastElement); 
      StackStorage.Insert(0, obj); 
     } 
     else 
     { 
      StackStorage.Add(obj); 

     } 

      //Add Logic in here to check whether or not the List count 
      //Is Longer than 8. Remember that .Count gives you a value NOT 
      //Zero based. If you want the index of a value you would have 
      //To do ExampleList.Count - 1. 


    } 
    public object Pop() 
    { 
     StackStorage.Remove(LastElement); 
     return LastElement; 

    } 

    public void Clear() 
    { 
     StackStorage.Clear(); 


    } 

    public int PrintCount() 
    { 

     return StackStorage.Count(); 


    } 




} 
    And the code I have in the main method: 
Stack MyStack = new Stack(); 
     MyStack.Push(1); 
     MyStack.Push(2); 
     MyStack.Push(3); 
     Console.WriteLine(MyStack.PrintCount()); 
     Console.ReadKey(); 
+0

ポスト全体の例外。また、**例外をすべて**読んでください。それは何が間違っているのかを、「それはおそらくそれが修飾語です」よりも良いアイデアにします。 – Blorgbeard

+1

あなたの4番目のコード行を見てください。 'StackStorage.Count - 1'の価値はどうなると思いますか?それは配列の長さに対して有効な値ですか? – Blorgbeard

答えて

1
public static List<object> StackStorage = new List<object>(); 
public static object LastElement = StackStorage[StackStorage.Count - 1]; 
public static object FirstElement = StackStorage[0]; 

は、アプリケーションの起動時に1回計算され、アプリケーションの起動時にStackStorage.Count - 1は-1になるため、例外が発生します。

本当に必要なのは、アクセスする必要があるたびに計算することです。たとえば:

public object GetLastElement(){ 
    if (StackStorage.Count > 0) 
     return StackStorage[StackStorage.Count - 1]; 
    throw new Exception("Collection is empty"); 
} 
//and so on 

しかし、私はこの道を行くことをお勧めしませんが、より良いアプローチは次のようになります。あなたがいないと、クラスのインスタンスに属するように、基になるコレクションを積み重ねたいと

  • は(静的取り除きます実行中のプロセスのinstace)
  • 使用インデックス
  • 使用のジェネリックその場合、あなたのクラスパンフレットに

ULDは、次のようになります。

public class Stack<T> 
    { 
     private const int MAX_SIZE = 8; 

     private List<T> StackStorage = new List<T>(); 

     private void RemoveLast() 
     { 
      StackStorage.RemoveAt(StackStorage.Count - 1); 
     } 

     public void Push(T obj) 
     { 
      StackStorage.Insert(0, obj); 

      if (StackStorage.Count > MAX_SIZE) 
       RemoveLast(); 
     } 

     public T Pop() 
     { 
      if (StackStorage.Count == 0) 
       throw new Exception("Stack is empty"); 

      T result = StackStorage[StackStorage.Count - 1]; 
      RemoveLast(); 

      return result; 
     } 

     public void Clear() 
     { 
      StackStorage.Clear(); 
     } 

     public int Count => StackStorage.Count; 
    } 

そして、あなたはそれが好きで使用することができます:

Stack<int> MyStack = new Stack<int>(); 
    MyStack.Push(1); 
    MyStack.Push(2); 
    MyStack.Push(3); 
    Console.WriteLine(MyStack.Count); 
    Console.ReadKey(); 
0

は、一度に、このようにゼロ要素、要素を持た、StackStorageの最後の要素、それを設定しようとしている、とノー最後の要素。

StackStorage.Count - 1 = 0 - 1 = -1 // invalid array index 

代わりのFirstElementLastElementを使用して、プッシュとポップときちょうどあなたがしたいのインデックスを使用しています。

FirstElementLastElementは、実際に最初と最後の要素ではありません。開始時に初期化しようとしているため、StackStorageが最新の状態に保たれます。

関連する問題