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