当您对数组属性进行赋值时,如下所示:
UserProfession.Designation[0] =txt_Search.Text.ToString();
您实际上正在做的是调用该get
属性的部分......而不是set
. 这将返回支持该属性的对象......整个对象,而不仅仅是索引。直到对象返回后才会进行索引查找。一旦你有了那个对象,访问索引就可以正常工作了。
你得到这个特定的异常是因为你有一个UserProfession.Designation
应该返回对数组对象的引用的表达式,但是因为你从未初始化数组,所以当你尝试查找第 0 个元素的引用时,那里什么也没有。此时,框架发现数组(您的“对象引用”)“未设置为对象的实例”……这只是一种奇特的说法null
。
换句话说,您需要有一个已经存在的数组来保存您要分配的值。这意味着做这样的事情:
Designation = new String[10];
public String[] Designation
{
get;
set;
}
但是,请注意我们从未使用过该set
部分?因此,您可以进一步简化,如下所示:
Designation = new String[10];
public String[] Designation {get;private set;}
这将防止客户端代码从您的对象下完全交换整个数组,否则将提供数组属性的全部功能。如果您为数组提供自己的后备存储,您甚至可以完全摆脱 setter 而不会丢失功能:
private string[] _designation = new string[10];
public string[] Designation {get {return _designation;} }
但是,让我们再补充一点:您希望在初始化数组之前将其分配给数组,这向我表明您可能并不真正知道它会在前面有多大。如果是这种情况,您可能需要某种集合而不是数组。泛型 List 是一种方便且非常兼容的数组替代品。看起来像这样:
private List<string> _designation = new List<string>();
public List<string> Designation {get {return _designation;}}
您仍然可以按索引访问该列表中的项目,就像使用数组一样。您现在需要担心的唯一区别是如何添加新项目:
UserProfession.Designation.Add(txt_Search.Text);
另请注意,我删除了 .ToString() 调用。由于您的.Text
属性几乎可以肯定已经是一个字符串,因此调用 .ToString() 方法只是愚蠢的。