0

ボタン8クリックイベントで私はしました:

 private void button8_Click(object sender, EventArgs e)
        {
            if (buttonLockMode == true)
            {
                trackBar1.Enabled = true;
                button8.ForeColor = Color.Red;
                button8.Enabled = false;
                textBox1.Text = "Frame Number : " + trackBar1.Value;
                this.trackBar1.Select();
                textBox3.Enabled = true;
                textBox4.Enabled = true;
                wireObjectAnimation1 = new WireObjectAnimation(this, wireObject1);
                int currentFrameIndexRight = trackBar1.Value;
                wireObjectCoordinates1 = new WireObjectCoordinates() { FrameNumber = currentFrameIndexRight };
                WireObjectCoordinatesCloneFrame();

                List<WireObjectCoordinates>  temp = wireObjectAnimation1.CoordinatesList;
                temp.Add(wireObjectCoordinates1);
                //wireObjectAnimation1.CoordinatesList.Add(wireObjectCoordinates1);

                //WireObjectCoordinatesCloneFrame();

            }
            else
            {
                button8.ForeColor = Color.Black;
            }
        }

Phoog私は一時リストの同じアイデアを使用しました。そしてwireObjectanimationで私はしました:

private List<WireObjectCoordinates> _coordinateslist = new List<WireObjectCoordinates>();
        public List<WireObjectCoordinates> CoordinatesList
        {
            get { return _coordinateslist; } 
        }

それでも、get行にブレークポイントを設定すると、_coordinateslistとCoordinatesListの両方が空になります。

4

1 に答える 1

1

First述語を満たす要素がない場合にスローします。_coordinatesListしたがって、 がFrameNumberに等しい項目はおそらく存在しないことになりcurrentFrameIndexます。

これを試してください: に変更catchcatch (Exception e)、実行が catch ブロックに入ったら、デバッガーを使用して例外を調べます。または、処理された例外で中断するようにデバッガーを設定します。これにより、例外を調べる機会も得られます。

仮説が真であるかどうか、つまり述語を満たす要素がシーケンスにないことを判断したら、次のステップに進むことができます。これは、述語を満たす要素がない理由を判断することです。が間違っているか、期待を満たすはずのコードが間違っています。

catch { }これは、コードで使用してはいけない理由の良い例です。

コード規則に固執する場合にも役立ちます。のような識別子_coordinatesListは通常、プライベート フィールドです。WireObjectCoordinatesList通常、公共の財産になります。あなたはそれを逆に持っているので、混乱します。

リストゲッターのブレークポイントについて:

get にブレークポイントを設定し、button8 をクリックするとそこで停止しますが、List _coordinatesList は空です。Form1 button8 クリック イベントにブレークポイントを配置すると、リストにポイント座標が含まれていることがわかりますが、wireObjectanimation クラスにいる場合、リストは空です。

次のコードを検討してください。

private List<string> _words = new List<string>();
public List<string> Words { get { return _words; } }

そして、この呼び出しコード:

void AddAWord(string word)
{
    this.Words.Add(word);
}

その呼び出しコードはこれと同等です:

void AddAWord(string word)
{
    List<string> temp = this.Words;
    temp.Add(word);
}

つまり、プロパティ ゲッターは最初に にリストを返し、AddAWord次にリストをAddAWord呼び出しAddます。プロパティ ゲッターにブレークポイントを設定したときにリストにまだ何も含まれていないのは、おそらくこれが原因です。

編集

一時変数を追加することで問題が解決することを示唆するつもりはありませんでした。むしろ、一時変数は、問題が発生している理由を明確にすることを目的としています。temp 変数を追加しても、コードの意味は変わりません。実際、C# コンパイラは temp 変数を暗黙的に作成する可能性があります。

おそらく私はあなたが何をしたか、何を期待しているのかを誤解していましたが、私にはあなたの期待が間違っているように見えます. つまり、ブレークポイントを間違った行に置いています。

検討:

1  private List<WireObjectCoordinates> _coordinateslist = new List<WireObjectCoordinates>();  
2  public List<WireObjectCoordinates> CoordinatesList  
3  {  
4      get { return _coordinateslist; } // <<< your breakpoint here
5  }  
6
7  private void button8_Click(object sender, EventArgs e)   
8  {   
9      if (buttonLockMode == true)   
10     {
11         // ...
12         List<WireObjectCoordinates>  temp = wireObjectAnimation1.CoordinatesList; // <<< my breakpoint here
13         temp.Add(wireObjectCoordinates1);
14     }   
15     else   
16     {   
17         // ...

コードをステップ実行します。4 行目にブレークポイントがあります。12 行目にブレークポイントを追加します。最初に 12 行目にヒットします。F11を押します。実行は、ブレークポイントである 4 行目に移動します。リストが空であることに注意してください。まだ 13 行目に到達していないため、もちろん空です。

F11 キーを数回押して、プロパティ ゲッターをステップ実行します。実行ポイントは 12 行目に戻りtempます。変数はまだ null です。F11 をもう一度押して、プロパティ値をtemp変数に割り当てます。実行は 13 行目に移動します。

もう一度 F11 を押します。これにより、メソッドが呼び出されますAdd。これで、リストには 1 つの要素が含まれます。

私のポイントは、一時変数があるかどうかに関係なく、この一連の命令は同じであるということです。次のような 1 行の式を考えてみましょう。

wireObjectAnimation1.CoordinatesList.Add(wireObjectCoordinates1);

次の手順がこの順序で行われます。

  • によって参照されるオブジェクトを決定するwireObjectAnimation1
  • CoordinatesListそのオブジェクトのゲッターを呼び出します
  • 前のステップで getterAddによって返されたオブジェクトでメソッドを呼び出しますCoordinatesList

ブレークポイントは 2 番目のステップにあります。Add3 番目のステップで呼び出されます。したがって、ブレークポイントに到達すると、リストは空になります。

于 2012-07-09T17:40:56.163 に答える