Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 头先练习_C#_Class - Fatal编程技术网

C# 头先练习

C# 头先练习,c#,class,C#,Class,当我试图解决《头先C#》一书中的一个练习时,我想出了一个与给定解不同的方法。我对C#和编程基本上是个新手,我想了解这本书的方法是否比我的好,以及为什么它比我的好 我将详细说明问题,然后提供他们的答案和我的答案。请尽可能详细、简单/易懂地回答我 使用大象类创建一个程序。举两个大象的例子 然后交换指向它们的引用值,而不获取 任何大象实例都会被垃圾收集。制作窗体(Windows窗体) 应用程序)带有3个按钮。第一个按钮上写着“劳埃德”,是 第二个说“露辛达”,第三个说“交换”。点击 Lucinda按钮

当我试图解决《头先C#》一书中的一个练习时,我想出了一个与给定解不同的方法。我对C#和编程基本上是个新手,我想了解这本书的方法是否比我的好,以及为什么它比我的好

我将详细说明问题,然后提供他们的答案和我的答案。请尽可能详细、简单/易懂地回答我

使用大象类创建一个程序。举两个大象的例子 然后交换指向它们的引用值,而不获取 任何大象实例都会被垃圾收集。制作窗体(Windows窗体) 应用程序)带有3个按钮。第一个按钮上写着“劳埃德”,是 第二个说“露辛达”,第三个说“交换”。点击 Lucinda按钮或Lloyd按钮弹出一个新窗口,显示 “我的耳朵(耳朵大小)英寸高”的信息 弹出窗口为“(名称)显示…”,名称为Lucinda或 劳埃德

您应该使用整数字段创建大象类 名为EarSize,以及名为Name的字符串字段。WhoAmI()是 方法显示弹出消息框。创造两个大象 实例和参考;两个大象字段将添加到 形式1类,命名为劳埃德和露辛达。它们是初始化的

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份推荐信,而不是两份。现在你必须改变所有的逻辑

我希望这有助于你理解问题的要点,如果你还有其他问题,请告诉我