我是OOP和C#的新手。这是我做的一个小实验:
Using System;
class A
{
public int X { get; set; }
public static A[] a = new A[10];
public static int i = 0;
public A()
{
this.X = -2;
}
public A(int x)
{
this.X = x;
}
public static void Add(A b)
{
if (i < 10) a[i] = b;
i++;
return;
}
public void Reveal()
{
Console.WriteLine(X);
}
public static void Show()
{
for (int j=0; j<=10; ++j)
{
a[j].Reveal();
}
}
}
我尝试创建一个类,其实例存储在内部,最多10个对象。调用A.Show()
时,将引发NullReferenceException:“对象引用未设置为对象的实例。”我猜想,肯定是创建了对象a[j]
,然后立即销毁了该对象。因此,它为a[j]
提供了一个空值,因此得出结果?
*这是我的main
方法:
int val = 0;
while (val != -1)
{
Console.Write("create a new object. new value: ");
val = Console.ReadLine();
A a = new A(val);
A.Add(a);
};
A.Show();
Console.ReadKey();
return;
答案 0 :(得分:2)
请注意循环的上限条件:
for (int j=0; j<=10; ++j)
{
a[j].Reveal();
}
数组a分配了10个项目,但是此代码显示您有11个项目(从0到10开始),因此将其更改为刚好低于10。还要尝试比较 因此正确的代码如下:
public static void Show()
{
for (int j = 0; j < 10; ++j)
{
a[j]?.Reveal();//Or if(a[j] != null)
}
}
还对读取客户输入的行进行修改,必须如下:
val = int.Parse(Console.ReadLine());//If you are sure that the input
可以真正转换为int或
int.TryParse(Console.ReadLine() , out int value);
if(value != 0)
{
val = value;
A a = new A(val);
A.Add(a);
}
else
{
throw new Exception();
}
答案 1 :(得分:0)
您要在分配i
之前先递增a[i]
,所以a[0]
为空,因为它将始终从1开始初始化a
。
尝试将添加方法更改为此:
public static void Add(A b)
{
if (i < 10)
{ //braces are important for readability
a[i] = b;
}
i++;
return;
}