在试图解决“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");
}
}
拜托,我将非常感谢能够深入了解这些方法之间的差异,这些方法更好,为什么会这样。
先谢谢你们!
答案 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.现在你必须改变所有的逻辑!
我希望这可以帮助您理解问题的关键点,如果您有任何其他问题,请告诉我们!