[英]Why do these two List<string> always contain the same number of items?
我有一個非常簡單的程序,由於某種原因,我感到很困惑。 我放下它,今天早上又回來了,但我仍然很困惑。 首先,我知道這不是理想的解決方案。 我有兩種形式:Main和Log。 Main窗體中的按鈕在單擊時會添加到List _debugLog。 單擊btnDebug時,它將打開Log表單,並將_debugLog傳遞給它。 一切正常,計時器已設置並運行,一切正常。 每2.5秒觸發一次事件log.UpdateLog(),以使用更新后的日志來更新Log表單。 但是,mainFormLog.Count和_log.Count始終相同,並且當在主窗體上單擊btnAdd時,它們兩者都會增加。 _log如何從tick事件中獲取新的_debugLog(mainFormLog)?
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());
}
}
}
}
好吧,您是將對列表的引用從Main傳遞到Log,因此它實際上是相同的列表。
如果您想要一個單獨的列表,並使用Main中的列表進行初始化,則可以使用:
public Log(List<string> log)
{
InitializeComponent();
_log = new List<string>(log);
}
也許這有助於理解變量和引用之間的區別:
對於值類型,值是信息本身。 對於引用類型,該值是一個引用,該引用可以為null,也可以是導航到包含該信息的對象的方式。
例如,將變量想像成一張紙。 它可能上面寫有值“ 5”或“ false”,但它不能擁有我的房子……它必須要有指向我房子的指示。 這些方向等同於參考。 特別是,兩個人可能有不同的紙條,這些紙條上有指向我家的相同指示-如果一個人按照這些指示將我的房子塗成紅色,那么第二個人也會看到這種變化。 如果他們倆在紙上都只有我的房子的獨立圖片,那么一個人給他們的紙上色根本不會改變另一個人的紙。
您的所有變量_debugLog
, mainFormLog
和_log
都指向內存中的同一列表。 您只創建了一個列表,當您向該列表分配新變量時,它只是指向內存中某個位置的指針,它不會自動創建該列表的新副本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.