using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            Test[] test = new Test[2];
            Console.WriteLine(test[0]); 
   
            Test test1;
            Console.WriteLine(test1.Number);
   
 }
    class Test
    {
        private Test()
        { 
        }
        public Test(int number)
        {
            this.number = number;
        }
        public int Number
        {
            set { number = value; }
            get { return number; }
        }       
        int number;
    }
}
为什么绿色部分的代码没错。红色的错了。我的理解是test1是个引用类型的值,其实就是一个地址值,而它指向的内存块还没有开辟出来,所以它错。而test也是一个地址值,它指向的内存块是存的Test类型的值,也就是说它指向的还是地址值,而test[0]指向的内存块也还没有开辟出来,也就是说test[0]与test1在这里是等价的,为什么一个有错,一个没错还有我觉得一个属性应该对应一个字段。为什么我在.net 类库中一些类中看到很多属性,却没找到字段。还有如可看一些类的实现体,我转到定义处,方法啊都只是个声明。实现体没找到。

解决方案 »

  1.   

    纠正一下,绿色部分那个地方是test【0】.Number;
      

  2.   

    Test test1=new Test();
    Console.WriteLine(test1.Number);  
      

  3.   


    这地方如果你写成Console.WriteLine(test[0].Number); 运行时依然会出错的。绿色部分会出现运行时NullPointReferenceException这是必然的。
    红色部分根本编译不过去,Test test1;这样只声明就使用违反了编译规则。
      

  4.   

    是不是可以这样理解绿色:
    Test[] test = new Test[2]; //这里调用了默认构造函数,建立了两个Test的实例,
    Console.WriteLine(test[0].Number);   //因为test[0]已经建立了,所有调用他的属性不会出错。
    但是,因为是调用的默认构造函数,你的构造函数里面没有给这个属性进行实例化。所有运行的时候会出错红色:
    Test test1;             //只是声明了一个Test的对象,并没有实例化。
    Console.WriteLine(test1.Number);  //因为没有实例化,所以调用的时候就会出错。
      

  5.   

       Test[] test = new Test[2];
                Console.WriteLine(test[0].Number);但new Test[2];时。他并没有去new两个对象填在里面。
    这只是相当于初始化两个null。楼主的理解是正确的。不过就是数组初始化的时候,可能没搞清楚。new test[2]没有创建两个实例放在里面。
    就算是你改public也是一样。test[1]里面的也是null.
      

  6.   

    嗯,是这样,,数组是一种数据结构   new Test[2];时。他并没有去new两个对象填在里面。
    但它能骗过编译器
      

  7.   

    你那个绿色部分是创建对象数组,没错的。
    红色部分应该是Test test1 = new Test(a);//a你自己设定的实参
    我也是菜鸟,不知道自己说的对不对