[英]Head First C# exercise
在嘗試解決“Head First C#”一書中的練習時,我提出了一種不同的方法,而不是給定的解決方案。 我對C#和一般的編程都很陌生,我想了解這本書的方法是否以及為什么比我的更好。
我將詳細說明問題,然后提供他們的答案和答案。 請盡可能詳細,簡單/可理解的答案給我!
使用Elephant類創建程序。 創建兩個Elephant實例,然后交換指向它們的引用值,而不會將任何Elephant實例垃圾收集。 使用3個按鈕創建一個表單(Windows窗體應用程序)。 第一個按鈕是“Lloyd”,第二個按鈕是“Lucinda”,第三個按鈕是“Swap”。 單擊Lucinda按鈕或Lloyd按鈕會彈出一個新窗口,顯示消息“我的耳朵是(EarSize)英寸高”。 彈出窗口的標題是“(姓名)說......”,名字是Lucinda或Lloyd。
您應該使用名為EarSize的整數字段和名為Name的字符串字段創建Elephant類。 WhoAmI()是顯示彈出消息框的方法。 創建兩個大象實例和一個參考; 兩個Elephant字段被添加到Form1類中,並命名為Lloyd和Lucinda。 他們被初始化;
lucinda = new Elephant() { Name = "Lucinda", EarSize = 33 }; lloyd = new Elephant() { Name = "Lloyd", EarSize = 40 };
讓Lloyd和Lucinda按鈕工作。 Lloyd按鈕調用
lloyd.WhoAmI()
,Lucinda按鈕調用lucinda.WhoAmI()
。連接交換按鈕。 使交換按鈕交換兩個引用,這樣當您單擊swap時,Lloyd和Lucinda變量交換對象並顯示“Objects swapped”框。 第一次單擊Swap時,如果單擊Lucinda按鈕,Lloyd框應該出現,如果單擊Lloyd按鈕,Lucinda框應該出現。 如果再次單擊“交換”,當您單擊Lloyd或Lucinda時,他們的常規框應該正常顯示。 如果再次單擊交換按鈕,對象會再次切換...您明白了。
這是本書提供的代碼作為正確的答案:
using System.Windows.Forms;
class Elephant
{
public int EarSize;
public string Name;
public void WhoAmI()
{
MessageBox.Show("My ears are " + EarSize + " inches tall.", Name + " says...");
}
}
****************************新課程******************** *********
public partial class Form1 : Form
{
Elephant lucinda;
Elephant lloyd;
public Form1()
{
InitializeComponent();
lucinda = new Elephant() { Name = "Lucinda", EarSize = 33 };
lloyd = new Elephant() { Name = "Lloyd", EarSize = 40 };
}
private void button1_Click(object sender, EventArgs e)
{
lloyd.WhoAmI();
}
private void button2_Click(object sender, EventArgs e)
{
lucinda.WhoAmI();
}
private void button3_Click(object sender, EventArgs e)
{
Elephant holder;
holder = lloyd;
lloyd = lucinda;
lucinda = holder;
MessageBox.Show("Objects Swapped");
}
}
************************我的回答*********************** ******
到目前為止顯示的代碼是構成正確解決方案的兩個類。 我現在將粘貼我在下面提出的解決方案。 我的大象課與書的相同,但我的Form1課程不同,所以我將發布不同的課程。
public partial class Form1 : Form
{
Elephant lucinda;
Elephant lloyd;
public int counter = 0;
public Form1()
{
InitializeComponent();
lucinda = new Elephant() { Name = "Lucinda", EarSize = 33 };
lloyd = new Elephant() { Name = "Lloyd", EarSize = 40 };
}
private void button1_Click(object sender, EventArgs e)
{
if (counter % 2 == 1)
{
lucinda.WhoAmI();
}
else
{
lloyd.WhoAmI();
}
}
private void button2_Click(object sender, EventArgs e)
{
if (counter % 2 == 1)
{
lloyd.WhoAmI();
}
else
{
lucinda.WhoAmI();
}
}
private void button3_Click(object sender, EventArgs e)
{
counter += 1;
MessageBox.Show("Objects Swapped");
}
}
對於這些方法之間的差異,我將不勝感激,這更好,為什么會這樣。
先謝謝你們!
好的,所以您的答案被認為是錯誤的原因如下:
這個問題具體要求你這樣做:
創建兩個Elephant實例,然后交換指向它們的引用值,而不會將任何Elephant實例垃圾收集
你所做的是定義一種查找哪個大象需要顯示的方法,但是你沒有完成賦值的目標,它專門用於交換對象指向的引用。
在他們提供的答案中,他們做到了這一點:
private void button3_Click(object sender, EventArgs e)
{
Elephant holder;
holder = lloyd;
lloyd = lucinda;
lucinda = holder;
MessageBox.Show("Objects Swapped");
}
他們實際上交換了變量引用。 賦值的目的似乎是向您展示您必須維護對每個對象的引用,否則它們將被垃圾收集。 如果您沒有像上面那樣使用holder
變量交換引用,那么其中一個引用將被垃圾收集,因為沒有任何內容可以引用它。
這是任何托管編程語言中的一個重要概念,因為您必須確保維護引用,否則您將丟失變量到垃圾收集器。 在非托管編程語言中,如果不使用holder
則會出現內存泄漏。
他們提供的答案也是一個更重要的學習概念。 有無限的方式來做他們所要求的,但如果你這樣做,那么你將學習如何管理對象的引用,而不必在任何地方分散查找,例如你的if (counter % 2 == 1)
。 想象一下,如果不是兩個參考,你有10.現在你必須改變所有的邏輯!
我希望這可以幫助您理解問題的關鍵點,如果您有任何其他問題,請告訴我!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.