Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么在IEnumerable上使用IList?_C#_.net - Fatal编程技术网

C# 为什么在IEnumerable上使用IList?

C# 为什么在IEnumerable上使用IList?,c#,.net,C#,.net,1) 我读了一些(常规)代码片段,看到一些地方使用了IList,还有一些地方使用了IEnumerable。使用前者的优点是什么 2) 在c#中是和作为。 我知道,是进行类型检查的,与进行铸造一样。 但究竟什么是铸造?强制数据到某个大小的对象?当为和为时不同 IList提供了某些IEnumerable没有的方法。最重要的是,添加到它的功能(有关更多信息,请查看) is比较类型,返回是否可以将某个对象强制转换为类型as实际执行该转换,如果失败,则返回null。强制转换是指出于任何原因将A类型的对象转

1) 我读了一些(常规)代码片段,看到一些地方使用了
IList
,还有一些地方使用了
IEnumerable
。使用前者的优点是什么

2)
在c#中是
作为
。 我知道,
进行类型检查的,
进行铸造一样。 但究竟什么是铸造?强制数据到某个大小的对象?当
时不同

  • IList
    提供了某些
    IEnumerable
    没有的方法。最重要的是,添加到它的功能(有关更多信息,请查看)
  • is
    比较类型,返回是否可以将某个对象强制转换为类型
    as
    实际执行该转换,如果失败,则返回
    null
    。强制转换是指出于任何原因将
    A
    类型的对象转换为
    B
    类型的对象
  • IList[]
    表示以下内容:

    • 可以迭代
    • 是有限的,已知的大小
    • 是可重复的
    • 可以通过索引随机访问
    • 可编辑(可选,可检查):重新分配值、添加、删除等
    另一方面,
    IEnumerable
    ,只能进行迭代。并不是所有可以迭代的东西都是列表。例如:

    static IEnumerable<int> Get() {
        Random rand = new Random();
        while(true) yield return rand.Next();
    }
    

    is
    执行类型检查,返回
    true
    /
    false
    。。。i、 e.
    obj
    一个
    IList
    ?是或否

    as
    执行“尝试执行此”类型检查;如果失败,则返回
    null
    ,如果成功,则返回类型化引用(etc)。基本上,这是一个效率问题:

    if(obj is IList) {
        var list = (IList) obj;
        ...
    }
    
    效率低于:

    var list = obj as IList;
    if(list != null) {
        ...
    }
    

    如果
    obj
    为空,它们的行为也不同<代码>is引发异常
    as
    返回
    null

    大多数情况下,在C#中,强制转换不会在类型之间转换对象。通常,它只是在运行时检查对象是否为给定的编译时类型,如果是,则允许您将对象分配到所述类型的变量中。(如果不是,则返回
    null
    或抛出异常,这取决于您是否将parens或
    用作
    )事实上,它通常指的是强制,而不是转换。您是否实际衡量了这两种方法的性能?IL指令是isinst,尽管它的名称表明它与as操作相对应。在伊利诺伊州没有任何行动。实际上是在IL is
    obj as type!=空
    。所以选择应该是可读性,我想say@RuneFS我经常用IL编写代码,所以我很清楚这一点。然而,不同之处在于isinst之后的额外castclass。我承认,这是一个微小的区别。我认为JIT编译器应该能够优化这个类转换。但我不知道它当前是否存在。顺便说一句,如果对象为null,则不会引发异常。表达式将计算为false:@Rune我一定是记错了。。。我的道歉
    var list = obj as IList;
    if(list != null) {
        ...
    }