C# 头先练习
当我试图解决《头先C#》一书中的一个练习时,我想出了一个与给定解不同的方法。我对C#和编程基本上是个新手,我想了解这本书的方法是否比我的好,以及为什么它比我的好 我将详细说明问题,然后提供他们的答案和我的答案。请尽可能详细、简单/易懂地回答我 使用大象类创建一个程序。举两个大象的例子 然后交换指向它们的引用值,而不获取 任何大象实例都会被垃圾收集。制作窗体(Windows窗体) 应用程序)带有3个按钮。第一个按钮上写着“劳埃德”,是 第二个说“露辛达”,第三个说“交换”。点击 Lucinda按钮或Lloyd按钮弹出一个新窗口,显示 “我的耳朵(耳朵大小)英寸高”的信息 弹出窗口为“(名称)显示…”,名称为Lucinda或 劳埃德 您应该使用整数字段创建大象类 名为EarSize,以及名为Name的字符串字段。WhoAmI()是 方法显示弹出消息框。创造两个大象 实例和参考;两个大象字段将添加到 形式1类,命名为劳埃德和露辛达。它们是初始化的C# 头先练习,c#,class,C#,Class,当我试图解决《头先C#》一书中的一个练习时,我想出了一个与给定解不同的方法。我对C#和编程基本上是个新手,我想了解这本书的方法是否比我的好,以及为什么它比我的好 我将详细说明问题,然后提供他们的答案和我的答案。请尽可能详细、简单/易懂地回答我 使用大象类创建一个程序。举两个大象的例子 然后交换指向它们的引用值,而不获取 任何大象实例都会被垃圾收集。制作窗体(Windows窗体) 应用程序)带有3个按钮。第一个按钮上写着“劳埃德”,是 第二个说“露辛达”,第三个说“交换”。点击 Lucinda按钮
lucinda = new Elephant() { Name = "Lucinda", EarSize = 33 }; lloyd =
new Elephant() { Name = "Lloyd", EarSize = 40 };
让劳埃德和露辛达的纽扣起作用。劳埃德·巴顿在呼叫
lloyd.WhoAmI()
和Lucinda按钮调用Lucinda.WhoAmI()
连接交换按钮。让交换按钮交换这两个
引用,这样当您单击“交换”时,Lloyd和Lucinda
变量交换对象,并显示“对象交换”框。这个
第一次单击交换时,如果单击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 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");
}
}
请允许我深入了解这些方法之间的差异,哪种更好,以及为什么会这样
提前谢谢各位 好的,那么您的答案被认为是错误的原因如下: 问题特别要求您这样做: 创建两个大象实例,然后交换指向它们的引用值,而不会回收任何大象实例 您所做的只是定义了一种查找需要显示的大象的方法,但您没有完成分配的目标,即专门交换对象指向的引用 在他们提供的答案中,他们只是这样做:
private void button3_Click(object sender, EventArgs e)
{
Elephant holder;
holder = lloyd;
lloyd = lucinda;
lucinda = holder;
MessageBox.Show("Objects Swapped");
}
他们实际上交换了变量引用。赋值的目的似乎是向您表明,您必须维护对每个对象的引用,否则它们将被垃圾收集。如果您没有像上面那样使用holder
变量交换引用,那么其中一个引用将被垃圾收集,因为没有任何引用会再引用它
这在任何托管编程语言中都是一个重要的概念,因为您必须确保维护引用,否则会将变量丢失给垃圾收集器。在非托管编程语言中,如果不使用holder
,则会出现内存泄漏
他们提供的答案也是一个更重要的学习概念。有无数种方法可以满足他们的要求,但如果您以这种方式执行,那么您就可以学习如何管理对对象的引用,而不必到处分散查找,例如if(计数器%2==1)
。想象一下,如果你有10份推荐信,而不是两份。现在你必须改变所有的逻辑
我希望这有助于你理解问题的要点,如果你还有其他问题,请告诉我