【问题标题】:Constructor Confusion - 'never assigned to, and will always have its default value'构造函数混淆 - '从未分配给,并且将始终具有其默认值'
【发布时间】:2014-02-12 00:28:09
【问题描述】:

这些是我的指示:

iii) 给 Pair 一个构造函数。
iv) 给 Pair 一个 set 属性,作为 key。
v) 还为 key 提供一个 get 属性。

在查看了我在这个论坛上可以找到的尽可能多的构造函数线程以获取信息后,我发现虽然给出的答案非常准确和准确,但我仍然没有完全理解。

我们被告知,如果定义了构造函数,则必须初始化所有属性,并且禁止对结构中的属性进行零碎初始化。

我的代码:

 using System ;
   using System.Drawing ; 
   // above namespace 
   // has the class Color 

   public class PairApp
   {
      public static void Main()
      {
            Pair two = new Pair();
            two.print(); 
      }

      struct Pair
      {

                int key;
                Color colour;


                public void print()
                {
                    Console.WriteLine("key : " + key );
                    Console.WriteLine("colour : " + colour);
                }
      }
   }
   //
   // Some values from the 
   // class Color
   //    Color.Red
   //    Color.Cyan
   //    Color.DarkGray
   //

我的问题:

  1. 为什么我需要为 Pair 创建一个构造函数? Pair two = new Pair(); 不就是这样做的吗?

  2. 如果Pair two = new Pair(); 是构造函数,那么它已经被定义了,对吧?如果它已被定义,我将如何避免出现下面列出的错误。

  3. 我的讲师说“禁止对结构中的属性进行零碎初始化”是什么意思?我经常为编程世界中使用的术语而苦恼,所以请帮帮我:)

调试:

airapp.cs(17,16): warning CS0649: Field `PairApp.Pair.key' is never assigned to, and will always have its default value `0'
pairapp.cs(18,18): warning CS0649: Field `PairApp.Pair.colour' is never assigned to, and will always have its default value
Compilation succeeded - 2 warning(s)

编辑 更新代码:

现在它运行起来没有以前的错误。非常感谢大家解释得这么好!

但是,它提出了以下错误:pairapp.cs(14,14): error CS1520: Class, struct, or interface method must have a return type。查找后,我看不出它与以下示例中的示例有何不同:http://msdn.microsoft.com/en-us/library/aa288208(v=vs.71).aspx

我想要完成的(希望我没有弄糊涂自己)是创建一个构造函数,将值分配给结构的字段。 我做对了吗?

我还删除了下面的部分,因为在添加了下面更新版本中可以看到的内容之后感觉是多余的。

Pair two;

        two = new Pair();
        two.print();

我更新的代码:

using System ;
   using System.Drawing ; 
   // above namespace 
   // has the class Color 

   public class PairApp
   {
      public static void Main()
      {

            Lion p1 = new Lion(5, Color.Red);
            p1.print(); 
      }
      public Lion(int key, Color colour)
      {
            this.key = key;
            this.colour = colour;
      } 
      struct Pair
      {

                int key;
                Color colour;


                public void print()
                {
                    Console.WriteLine("key : " + key );
                    Console.WriteLine("colour : " + colour);
                }
      }
   }
   //
   // Some values from the 
   // class Color
   //    Color.Red
   //    Color.Cyan
   //    Color.DarkGray
   //

【问题讨论】:

标签: c# .net constructor attributes initialization


【解决方案1】:
  1. 您不需要为 Pair 创建构造函数,因为它可以与默认构造函数(您列出的示例)一起正常工作。但是,如果您的结构具有应该使用某些值初始化的字段,那么创建一个接受这些值的构造函数并立即为您构造您的结构是一个好主意。默认构造函数不会使用默认值以外的任何内容为您初始化字段(如您的错误输出中所示)。

    这将我们带到您的下一个问题......

  2. 一个类型实际上可以有一个或多个构造函数。您列出的是默认构造函数,如果您不编写任何自己的构造函数并且不接受任何参数并且除了允许在内存中创建结构的实例之外什么都不做,它会自动创建。

    在您的情况下,您需要创建一个构造函数,它接受两个参数keycolour,并将它们分配给结构中的字段。签名应类似于 public Pair(int key, Color colour),您需要将字段 this.keythis.colour 分配给构造函数中的这些参数。

  3. 在这种情况下,分段初始化可能只是指仅初始化部分字段而不是全部(我所知道的这个词没有任何特定于编程的含义)。

    您看到的警告正是在代码中未初始化或未分配某些字段的结果。再举一个例子,如果你创建了一个构造函数,它只给key赋值,而从来没有给colour赋值,输出会是什么?


你的构造函数有两个问题:

  1. 它必须与它正在构造的类型同名。所以在这种情况下,它是Pair。 (原来在 my 的答案中有一个错字可能会误导你,我现在已经修正了。)

  2. 它需要出现在内部结构定义中,而不是在它旁边。 (换句话说,在结构本身的字段和方法旁边。)

【讨论】:

  • 我现在根据此页面上的建议更新了我的代码。非常感谢您提供的所有帮助,感觉我正在努力超越基础知识:)。
  • @viKK:很高兴听到这个消息。一切顺利! :)
  • 我知道你已经帮助了我,但我觉得我被困住了。我在更新后的代码中添加了几个问题,以及阻止我返回另一组问题的错误/警告。有机会再看看吗? :)
  • @viKK:几分钟后我就要出发了,但你及时抓住了我。我已经更新了我的答案。
  • 搞定了!非常感谢!完全掌握构造函数的工作方式,以及使用 get/set 授予读写权限。 :D 非常感谢! :)
【解决方案2】:
Pair two = new Pair();

不是构造函数,它将Pair 的实例分配给局部变量。实例是使用构造函数创建的,但这里没有定义。

构造函数是一个东西,在你的类中定义。它看起来像一个没有返回值的方法,并且可以使用参数进行覆盖(以简化您的生活)。

struct Pair
{
    public Pair() {} // constructor
}

这听起来不对,或者您改写它是错误的:

如果定义了构造函数,则必须初始化所有属性,并且禁止对结构中的属性进行零碎初始化

您的问题是access modifiers。默认情况下,您的字段是private(如果我记得C++ 结构默认具有公共字段,这可能是混淆的原因)。因为您没有定义任何构造函数 - 使用默认值(仅为所有字段分配内存,但为它们分配任何值)。

构造函数中的私有字段和没有字段初始化(实际上,没有定义构造函数) - 意味着您根本没有为它分配任何东西(您只是使用 print 方法中的值)。这使编译器可以确定您在某处弄错了什么。添加任何类型的设置都会使compiler shut =D

struct Pair
{
    int key;
    Color colour;

    public void print()
    {
        Console.WriteLine("key : " + key );
        Console.WriteLine("colour : " + colour);
    }

    // no more warning, but.. are you sure? 
    public void LOL()
    {
        key = 0;
        Color = Color.Red;
    }
}   

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多