如果索引不存在,在索引器上返回null是否正确?
本文关键字:索引 是否 null 返回 不存在 如果 | 更新日期: 2023-09-27 18:05:50
我添加了一个索引器到我的类。它是正确的编码返回null时,索引不存在吗?然后消费类也必须检查是否为空。有没有更优雅的方式?
public class ObjectList
{
private readonly ArrayList _objectList = new ArrayList();
public void Add(object value)
{
_objectList.Add(value);
}
public object this[int index]
{
get
{
if (CheckIndex(index))
return _objectList[index];
else
return null;
}
set
{
if (CheckIndex(index))
_objectList[index] = value;
}
}
private bool CheckIndex(int index)
{
if (index >= 0 && index <= _objectList.Count - 1 )
return true;
else
return false;
}
public int IndexOf(object value)
{
return _objectList.IndexOf(value);
}
}
class Program
{
static void Main(string[] args)
{
var oList = new ObjectList();
oList.Add("Some String");
oList.Add("new string");
//oList[1] = "Changed String";
Console.WriteLine("Index of new string = " + oList.IndexOf("new string"));
Console.WriteLine("Index of Some String = " + oList.IndexOf("Some String"));
Console.WriteLine("index 0 = {0} and index 5 = {1}", oList[0], oList[1]);
Console.WriteLine("Non-existing index 5 doesn't lead to crash when written to the console = {0} ", oList[5]);
if(oList[5]!=null)
Console.WriteLine("But when GetType is called on non-existing index then it crashes if not intercepted.", oList[5].GetType());
}
}
我也想知道为什么当我将元素的值写入控制台时,当它为空时,程序不会崩溃。
但是,如果在调用GetType()时不检查null,则它会崩溃。
怎么会?
是"It depends "
1-当你构建一个库(例如DLL),而这个DLL是由你根本不知道的软件使用的,或者它还没有退出。更好的方法是抛出如下
所示的期望public object this[int index]
{
get {
if (index >= 0 && index <= _objectList.Count - 1 )
throw new IndexOutOfRangeException();
// your logic here .....
}
}
2-但如果你只构建一个小类从另一个地方使用。你可以遵循第一种方式,也可以返回null。
public object this[int index]
{
get {
if (index >= 0 && index <= _objectList.Count - 1 )
return null;
// your logic here .....
}
}
,这时你必须检查索引器返回的引用但是(我更喜欢第一种方式,它更干净)
最常见的方法是抛出IndexOutOfRangeException。这就是. net内置容器所做的,许多人可能期望从类似的接口中获得相同的行为。有人可能会说,"请求原谅比请求允许更好。"
然而,如果你试图访问一个无效的项,你在内部使用的ArrayList
对象就会抛出这个错误。此外,ArrayList
本身已经自动完成了边界检查的开销,因此,在这种情况下,索引访问器应该是ArrayList
的简单包装器。
另一种情况可能是:如果我将null
添加到您的对象中会怎么样?然后我怎么知道我将来想要得到的对象是否不存在,或者只是值null
?异常通过中断代码流来解决这个问题,因此您可以使用假设来编写代码,假设代码可以工作,但是您知道在失败的情况下该怎么做。