2016-12-02 1 views
2

私はこの短いウィンドウフォームアプリケーションコードを正しく動作させることができません。クラスのインスタンスを一時的な格納場所として使用して、同じクラス型の配列を生成します。それはボタンとテキストボックスを持っています。ボタンを押すと、テキストが名前のメンバーに保存され、配列に追加されます。 の名前が別の配列メンバーによって使用されている場合は、 "name taken!"というメッセージが表示されます。それを配列に追加しないでください。問題は、この状態チェックが常に真であることです!一方が他方を指しているかのようにクラスの配列要素がポインタのように動作するのはなぜですか? (C#)

if ("Marry" == "Marry") 

:私たちは「結婚」と入力した場合 、デバッガは

if (examleArray[i].Name == temp.Name) 

と等価であることを示しています。どうしてこれなの?どのように私はそれを修正するのですか?ありがとうございました!

namespace errorexample 
{ 
    public partial class Form1 : Form 
    { 

     example temp = new example(); 
     example[] examleArray = new example[10]; 
     int examleArrayIndex = 0; 
     bool NameTaken = false; 

     public Form1() 
     { InitializeComponent(); } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      temp.Name = textBox1.Text;   
      NameTaken = false; 

      for (var i = 0; i < (examleArrayIndex); i++) 
      { 
       if (examleArray[i].Name == temp.Name) 
       { 
        NameTaken = true; 
        MessageBox.Show("Name taken!"); 
       } 

      } 

      if (NameTaken == false) 
      { 
       examleArray[examleArrayIndex] = temp; 
       examleArrayIndex++; 
      } 
     } 
    } 

    public class example { 
     public string Name; 
    } 

} 
+7

フォーム内に 'example'のインスタンスが1つしかないので、再利用し続けます。 – harold

+1

同じ' example'オブジェクトを指す参照の配列があるため、作成するだけです。 – juharr

答えて

1

:一つの解決策は、配列に格納するための新しいexampleオブジェクトを作成することです。 を決して作成しないので、同じtempです。私はあなたのためにそれを書き換えてきた:あなたが今まで誤って試してみて、11名を追加してから爆破しないように

List<example> examleArray = new List<example>(); 
private void button1_Click(object sender, EventArgs e) 
{ 
    if (examleArray.Any(e=>e.Name == textBox1.Text)) 
    { 
    MessageBox.Show("Name taken!"); 
    } else { 
    examleArray.Add(new example { Name = textBox1.Text }); 
    } 
} 

は、私はまた、リストにあなたの一定の配列を変換しました。私はあなたの検索をLINQに変換して簡略化しました。

0

クリックイベント内の移動の一時オブジェクトの初期化、そうでない場合は、同じオブジェクトに

private void button1_Click(object sender, EventArgs e) 
     { 
      example temp = new example(); 
      temp.Name = textBox1.Text;   
      NameTaken = false; 

      for (var i = 0; i < (examleArrayIndex); i++) 
      { 
       if (examleArray[i].Name == temp.Name) 
       { 
        NameTaken = true; 
        MessageBox.Show("Name taken!"); 
       } 

      } 

      if (NameTaken == false) 
      { 
       examleArray[examleArrayIndex] = temp; 
       examleArrayIndex++; 
      } 
     } 

を更新しているあなたは一つだけexampleオブジェクトを作成リスト

List<string> example = 
     new List<string>(); 

if(example.Contains(textBox1.Text)) 
{ 
    MessageBox.Show("Name taken!"); 
}else 
{ 
    example.Add(textBox1.Text); 
} 
0

を使用することができます。同じオブジェクトへの複数の参照を配列に入れています。あなたが唯一のtempオブジェクトを持っている、とあなたはキープ配列に追加を追加

public class example { 
    public string Name; 
    public example(string name){ 
     Name = name; 
    } 
} 

//... 
examleArray[examleArrayIndex] = new example(temp.Name); 
関連する問題