2016-12-02 37 views
2

我有這個簡短的Windows窗體應用程序代碼,我無法正常工作。它使用類的實例(作爲臨時存儲位置)來填充相同類類型的數組。它有一個按鈕和一個文本框。如果按下按鈕,文本將保存在名稱成員中並添加到陣列中。 如果名稱被另一個數組成員佔用,它應該顯示一條消息「name taken!」而不是將它添加到數組中。問題是這種情況檢查總是正確的! 如果我們在「嫁」型,調試器顯示爲什麼我的類數組元素的行爲像一個指針? (C#)

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

等同於:

if ("Marry" == "Marry") 

彷彿一個指向其他。爲什麼是這樣?我如何解決它?謝謝!

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'的實例,所以你會繼續重用它 – harold

+1

因爲你有一個引用數組,所有指向同一個'example'對象,因爲你只創建一個。 – juharr

回答

1

你只有一個temp對象,並添加保持它添加到陣列中。這是相同的temp因爲你從來沒有創建一個new之一。我已經改寫爲你:

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

我也轉換您的固定數組列表,所以你千萬不要意外嘗試,並添加11名,然後炸燬。我已經將您的搜索轉換爲LINQ來簡化。

0

click事件中移動臨時對象初始化,否則你正在更新同一對象

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

您可以使用列表

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

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

您只能創建一個example對象。您將多個對同一個對象的引用放入數組中。一種解決方案是創建一個新的example對象把數組:

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

//... 
examleArray[examleArrayIndex] = new example(temp.Name); 
相關問題