簡體   English   中英

首先是C#練習

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM