如果索引不存在,在索引器上返回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,则它会崩溃。
怎么会?

如果索引不存在,在索引器上返回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 ?异常通过中断代码流来解决这个问题,因此您可以使用假设来编写代码,假设代码可以工作,但是您知道在失败的情况下该怎么做。