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 类库中一些类中看到很多属性,却没找到字段。还有如可看一些类的实现体,我转到定义处,方法啊都只是个声明。实现体没找到。
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 类库中一些类中看到很多属性,却没找到字段。还有如可看一些类的实现体,我转到定义处,方法啊都只是个声明。实现体没找到。
Console.WriteLine(test1.Number);
这地方如果你写成Console.WriteLine(test[0].Number); 运行时依然会出错的。绿色部分会出现运行时NullPointReferenceException这是必然的。
红色部分根本编译不过去,Test test1;这样只声明就使用违反了编译规则。
Test[] test = new Test[2]; //这里调用了默认构造函数,建立了两个Test的实例,
Console.WriteLine(test[0].Number); //因为test[0]已经建立了,所有调用他的属性不会出错。
但是,因为是调用的默认构造函数,你的构造函数里面没有给这个属性进行实例化。所有运行的时候会出错红色:
Test test1; //只是声明了一个Test的对象,并没有实例化。
Console.WriteLine(test1.Number); //因为没有实例化,所以调用的时候就会出错。
Console.WriteLine(test[0].Number);但new Test[2];时。他并没有去new两个对象填在里面。
这只是相当于初始化两个null。楼主的理解是正确的。不过就是数组初始化的时候,可能没搞清楚。new test[2]没有创建两个实例放在里面。
就算是你改public也是一样。test[1]里面的也是null.
但它能骗过编译器
红色部分应该是Test test1 = new Test(a);//a你自己设定的实参
我也是菜鸟,不知道自己说的对不对