public class BinaryTree<T>
    {
        public BinaryTree(T item)
        {
            Item = item;
        }        public T Item
        {
            get { return _Item; }
            set { _Item = value}
        }        private T _Item;        public Pair<BinaryTree<T>> SubItems
        {
            get { return _SubItems; }
            set { _SubItems = value; }
        }        private Pair<BinaryTree<T>> _SubItems;
    }
《C#本质论》P312页的代码。
为什么这里的构造函数里没有给 _SubItems 赋值。  

解决方案 »

  1.   

    构造函数中,只能这个类必须要用到的成员赋值,就是如果想使用这个类,则必须改item赋值,而subItem是可选的
      

  2.   

    SubItems就是一个属性
    比如说窗体的背景色  也是一个属性 
    你可以给他赋值  他就会随着你的赋值改变 
    也可以选择不赋值仅仅一个属性而已 
      

  3.   


    _SubItems是字段啊。这个没有赋值啊。
      

  4.   

    是没有赋值,如果new出来后直接访问SubItems属性的成员的时候会抛出空引用异常,不过又怎么样呢?没有人规定不能抛出异常啊
      

  5.   


    看这段代码:    public struct Pair<T>
        {
            private T _Second;
            private T _First;        public T Second
            {
                get { return _Second;}
                set { _Second = value; }
            }        public T First
            {
                get { return _First; }
                set { _First = value;}
            }        public Pair(T first)
            {
                _First = first;   //没给 _Second 赋值,不能通过编译。
            }
        }
    像这个不赋值就不能通过编译,为什么上面的不赋值却能通过呢
      

  6.   

    前几天我在论坛上提出了这样一个问题。楼主可以看看http://topic.csdn.net/u/20100705/20/48a92013-541d-4e5f-a570-4fc0a40f7cac.html
      

  7.   

    "像这个不赋值就不能通过编译,为什么上面的不赋值却能通过呢"
    楼主可以看看本质论P239页,“幸运的是”这一段。至于类中字段是不是必须赋值。这个问题我在
    http://topic.csdn.net/u/20100705/20/48a92013-541d-4e5f-a570-4fc0a40f7cac.html中已经探讨过了。
      

  8.   

    using System;
    struct Score
    {
        public string Name;
        public int Language;
        public int Mathematics;
        public int Total;
        public int Rank;
    }
    class Program
    {
        public static void Main()
        {
            Score s = new Score();
            Console.WriteLine(s.Name);
            Console.ReadKey(true);
        }
    }
    以上代码不会出错。
    1:无论在struct中还是在class中如果字段没有赋值而直接用,编译器是不会报错的。
    2:而在struct中如果有带参数构造器,则必须对struct中的所有字段进行初始化。
    3:局部变量没有赋值而直接使用,编译器会报错。
      

  9.   


    额,我试了下,    public class Pair<T>      //把struct改为class可通过
        {
            private T _Second;
            private T _First;        public T Second
            {
                get { return _Second;}
                set { _Second = value; }
            }        public T First
            {
                get { return _First; }
                set { _First = value;}
            }        public Pair(T first)
            {
                _First = first;   //没给 _Second 赋值,通过编译。
            }
        }struct 的字段必须赋值,class 的字段可以不赋值。不过这是为什么?
      

  10.   

    这里API和源码例子
    一个英文的,一个翻译的:
    http://apicode.gicp.net/class.do?api=selectByfatherIndex&father=255
    http://apicodecn.gicp.net/class.do?api=selectByfatherIndex&father=255
      

  11.   

    你这个不是个Struct么?又不是Class!
      

  12.   


    嗯,你说的对。为什么struct必须在有参构造函数里给每个字段赋值,而class可以在有参构造函数里不必给每某个字段赋值呢?
      

  13.   

    这个可能与struct中禁止在实例字段声明时对实例字段进行赋值,而Class中则允许有关。
      

  14.   

    在msdn里有句话为结构定义默认(无参数)构造函数是错误的。在结构体中初始化实例字段也是错误的。只能通过两种方式初始化结构成员:一是使用参数化构造函数,二是在声明结构后分别访问成员。对于任何私有成员或以其他方式设置为不可访问的成员,只能在构造函数中进行初始化就是说结构的私有成员在构造函数里还是要初始化的