我在试图解决“头先C”一书中的一个练习时想出了一个不同的方法,而不是给定的解决方案。我对C语言和一般编程很陌生,我想知道这本书的方法是否比我的好,为什么比我的好。
我会详细说明问题,然后提供他们的答案和我的答案。请给我尽可能详细和简单/易懂的答案!
用大象类创建程序。举两个大象的例子
然后交换指向它们的引用值,而不获取
垃圾收集的任何大象实例。创建窗体(Windows窗体
应用)3个按钮。第一个按钮上写着“劳埃德”
第二个说“露辛达”,第三个说“交换”。点击
Lucinda按钮或Lloyd按钮弹出一个新窗口,显示
信息“我的耳朵是(耳朵大小)英寸高。”的标题
弹出窗口是“(name)says…”,名称为lucinda或
劳埃德。
你应该用一个整数字段创建大象类
名为earsize,名为name的字符串字段。whoami()是
显示弹出消息框的方法。创造两只大象
实例和引用;这两个大象字段被添加到
一类,被命名为劳埃德和卢辛达。它们被初始化了;

lucinda = new Elephant() { Name = "Lucinda", EarSize = 33 }; lloyd =
new Elephant() { Name = "Lloyd", EarSize = 40 };

让劳埃德和露辛达的纽扣起作用。劳埃德按钮呼叫
lloyd.WhoAmI()而lucinda按钮调用lucinda.WhoAmI()
连接交换按钮。使交换按钮交换两个
引用,所以当你点击swap时,lloyd和lucinda
变量交换对象并显示“对象交换”框。这个
第一次点击swap,如果你点击lucinda按钮
盒子应该会出现,如果你点击劳埃德按钮,卢辛达盒子
应该上来。如果再次单击“交换”,则在单击Lloyd或
露辛达他们的普通盒子应该和平常一样。如果单击
再次交换按钮,对象再次切换…你明白了。
以下是本书提供的正确答案:
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");
  }
}

************************我的回答如下*****************************
到目前为止显示的代码是构成书籍正确解决方案的两个类。我现在将把我在下面提出的解决方案粘贴到这里。我的大象课和书本课是一样的,但是我的第一节课是不同的,所以我会把不同的课贴出来。
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");
    }
}

请允许我深入了解这些方法之间的差异,哪种方法更好,为什么会这样。
提前谢谢你们!

最佳答案

好吧,那么你的回答被认为是错误的原因如下:
这个问题特别要求您这样做:
创建两个大象实例,然后交换指向它们的引用值,而不收集任何大象实例的垃圾
您所做的是定义一种方法来查找需要显示的大象,但是您没有完成分配的目标,即交换对象指向的引用。
在回答中,他们提供了这样的答案:

  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个推荐人而不是两个。现在你必须改变所有的逻辑!
我希望这能帮助你理解问题的要点,如果你还有其他问题,请告诉我!

10-05 18:07