class Program
{
static void Main(string[] args)
{
A a1 = new A(1);
A a2 = new A(2); A a = null;
a = a1;
Console.WriteLine(a.id.ToString()); // 正确
A[] arr=null; //空应用 arr[0] = a;
Console.WriteLine(arr[0].id.ToString()); //错误 ,为什么呢?
Console.ReadLine();
}
} public class A
{
public int id;
public A(int i)
{
id = i;
}
}几乎同样的c++代码却可以:
class A
{
public:
int id;
A()
{
}
A(int i)
{
id=i;
}
};
int main(int argc, char* argv[])
{
A a1(1);
A a2(2);
A* arr[2]; //空指针 arr[0]=&a1;
printf("%d\n",arr[0]->id); //正确
return 0;
}
{
static void Main(string[] args)
{
A a1 = new A(1);
A a2 = new A(2); A a = null;
a = a1;
Console.WriteLine(a.id.ToString()); // 正确
A[] arr=null; //空应用 arr[0] = a;
Console.WriteLine(arr[0].id.ToString()); //错误 ,为什么呢?
Console.ReadLine();
}
} public class A
{
public int id;
public A(int i)
{
id = i;
}
}几乎同样的c++代码却可以:
class A
{
public:
int id;
A()
{
}
A(int i)
{
id=i;
}
};
int main(int argc, char* argv[])
{
A a1(1);
A a2(2);
A* arr[2]; //空指针 arr[0]=&a1;
printf("%d\n",arr[0]->id); //正确
return 0;
}
打错字了arr[0] = a;改成 arr[0] = a1;
Console.WriteLine(arr[0].id.ToString()); //错误 ,为什么呢?
这样是可以的,我想知道为什么c++ 空数组指针可以指向一个有效的对象,而c#的空数组引用不可以应用一个有效的对象。
那为什么下面的空应用a可以正确的应用有效的对象呢?
A a = null;
a = a1;
这样写是可以的。我的想法是:
A[] arr=new A[1]; //已经用默认构造函数产生了一个对象。
arr[0]=a1; //引用了另外一个对象,那原来的对象呢?相当于产生的一个多余的对象。就像下面的语句
A a = null;
a = a1; 谁也不会像下面这样写一样A a = new A(); //产生了不必要的一个对象。
a = a1; 但实际上
A[] arr=null;
arr[0] = a1;
这样却不行。
这样写是可以的。我的想法是:
A[] arr=new A[1]; //已经用默认构造函数产生了一个对象。
arr[0]=a1; //引用了另外一个对象,那原来的对象呢?相当于产生的一个多余的对象。就像下面的语句
A a = null;
a = a1; 谁也不会像下面这样写一样A a = new A(); //产生了不必要的一个对象。
a = a1; 但实际上
A[] arr=null;
arr[0] = a1;
这样却不行。
那
A[] arr=null;
arr[0] = a1; //这也是给arr[0]赋值啊,就相当于它初始化了,实际上不可以,不知道为什么?
其实你只要细心点就可以发现了,为什么A a = null;
a = a1;这样没错而A[] arr=null;
arr[0] = a1;有错呢
你没看到arr是用了索引[0]吗?
a和arr都是一个对象,没有初始化不能使用它的属性,方法或索引
a=a1;这是给a赋值
arr[0]=a1,这是给arr[0]赋值,不是给arr赋值
A[] arr=null;改成 A[2] arr=null;这样是不可以的,有方法实现这样的目的吗?就是初始化一定长度的数组,但是数组的元素都是null?
但这样做有什么意义吗