2016-11-23 3 views
0

私は何らかの理由で私に困惑している非常に単純なプログラムを持っています。私はそれを置いて、今朝もう一度それに戻って来て、私はまだ困惑しています。まず、私はこれが理想的な解決策ではないことを認識しています。私は2つの形式:メインとログを持っています。メインフォームには、クリックするとList _debugLogに追加されるボタンがあります。 btnDebugをクリックすると、ログフォームが開き、_debugLogが渡されます。すべてが問題なく、タイマーがセットアップされ、実行され、すべて正常です。イベントlog.UpdateLog()は2.5秒ごとにトリガーされ、更新されたログでログ・フォームを更新します。ただし、mainFormLog.Countと_log.Countは常に同じで、btnAddをメインフォームでクリックすると増加します。 _logはtickイベントの新しい_debugLog(mainFormLog)をどのように持っていますか?なぜこれらの2つのリスト<string>には常に同じ数の項目が含まれていますか?

namespace Tool 
{ 
    public partial class Main : Form 
    { 
     private List<string> _debugLog = new List<string>(); 

     public Main() 
     { 
      InitializeComponent(); 
     } 

     private void btnAdd_Click(object sender, EventArgs e) 
     { 
      _debugLog.Add("message!"); 
     } 

     private void btnDebug_Click(object sender, EventArgs e) 
     { 
      Log log = new Log(_debugLog); 
      log.Show(); 

      Timer dt = new Timer(); 
      dt.Interval = 2500; 
      dt.Enabled = true; 

      dt.Tick += delegate { 
       log.UpdateLog(_debugLog); 
      }; 

     } 
    } 

    public partial class Log : Form 
    { 
     private List<string> _log; 

     public Log(List<string> log) 
     { 
      InitializeComponent(); 
      _log = log; 
     } 

     public void UpdateLog(List<string> mainFormLog) 
     { 
      if (mainFormLog.Count > _log.Count) 
      { 
       MessageBox.Show("Log has been updated!"); 
      } 
      else 
      { 
       MessageBox.Show("Nothing new!" + mainFormLog.Count.ToString() + "/" + _log.Count.ToString()); 
      } 
     } 
    } 
} 
+0

あなたはログのコンストラクタに_debugLogを渡します。それが理由です –

+0

もう少し説明できますか?私はコンストラクタで渡しますが、決して再度は行いません。 _logはどのように更新を続けますか? – Scott

+2

ダウン投票は何ですか?それは完全に有効な質問です。 –

答えて

0

あなたのすべての変数_debugLogmainFormLog、および_logは、メモリ内の同じリストを指しています。 1つのリストしか作成しておらず、新しい変数をそのリストに割り当てると、それはメモリ内のある場所へのポインタに過ぎず、自動的にリストの新しいコピーを作成することはありません。

2

まあ、あなたは、メインからログにリストへの参照を渡すので、実際には同じリストです。あなたがメインのリストで初期化される別のリストが必要な場合

あなたが使用することができます:値について

public Log(List<string> log) 
{ 
    InitializeComponent(); 
    _log = new List<string>(log); 
} 

はたぶんthisは、変数と参照の違いを理解するのに役立ちますタイプの場合、値は情報そのものです。参照 タイプの場合、値はnullである可能性のある参照値であるか、または情報を含むオブジェクトにナビゲートする方法である可能性があります。

たとえば、変数を1枚の紙のように考えると、 に「5」または「false」と書かれていますが、私の 家を持っていない可能性があります。私の家への道案内が必要です。それらの の指示は参照と同じです。特に、2つの 人が私の家に同じ の道案内を含む別の紙を持っている可能性があります。もし1人がそれらの指示に従って と私の家を赤く塗ったら、その人はその変更を でも見るでしょう。彼らが両方とも紙の上に私の家の別の写真を持っていたならば、 その人に自分の紙を塗っている人は他の人のペーパーを全く変えません。

+0

私は今、それが完全に意味を参照してください。 – Scott

関連する問題