首先是C#练习

时间:2017-03-05 01:58:19

标签: c# class

在试图解决“Head First C#”一书中的练习时,我提出了一种不同的方法,而不是给定的解决方案。我对C#和一般的编程都很陌生,我想知道这本书的方法是否以及为什么比我的方法更好。

我会详细说明问题,然后提供他们的答案和答案。请尽量给我详细,简单/可理解的答案!

  

使用Elephant类创建程序。制作两个大象实例   然后交换指向它们的引用值,而不是获取   垃圾收集的任何大象实例。制作表格(Windows窗体   应用程序)有3个按钮。第一个按钮说“劳埃德”,   第二个说“Lucinda”,第三个说“Swap”。点击   Lucinda按钮或Lloyd按钮会弹出一个显示的新窗口   消息“我的耳朵是(EarSize)英寸高。”的标题   弹出窗口是“(姓名)说......”,名字是Lucinda或者   劳埃德。

     

您应该使用整数字段创建Elephant类   名为EarSize,名为Name的字符串字段。 WhoAmI()是   显示弹出消息框的方法。创造两个大象   实例和参考;两个大象字段被添加到   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()

     

连接交换按钮。交换按钮交换两个   引用,这样当你点击交换时,Lloyd和Lucinda   变量交换对象,并显示“对象交换”框。该   第一次单击Swap,如果单击Lloyd的Lucinda按钮   盒子应该出现,如果你点击Lloyd按钮Lucinda盒子   应该出现。如果再次单击“交换”,则单击“劳埃德”或“   Lucinda他们的常规盒子应该正常出现。如果单击   再次交换按钮,对象再次切换......你明白了。

HERE是本书提供的代码作为正确答案:

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

拜托,我将非常感谢能够深入了解这些方法之间的差异,这些方法更好,为什么会这样。

先谢谢你们!

1 个答案:

答案 0 :(得分:4)

好的,所以您的答案被认为是错误的原因如下:

问题特别要求你这样做:

  

创建两个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.现在你必须改变所有的逻辑!

我希望这可以帮助您理解问题的关键点,如果您有任何其他问题,请告诉我们!