相关疑难解决方法(0)

为什么不从List <T>继承?

在规划我的程序时,我经常从一连串的想法开始:

足球队只是一个足球运动员名单.因此,我应该代表它:

var football_team = new List<FootballPlayer>();
Run Code Online (Sandbox Code Playgroud)

此列表的顺序表示球员在名单中列出的顺序.

但我后来才意识到,除了仅仅是球员名单之外,球队还有其他属性,必须记录下来.例如,本赛季的总得分,当前预算,统一颜色,string代表球队名称等等.

那么我认为:

好吧,足球队就像一个球员名单,但另外,它有一个名称(a string)和一个总分(a int)..NET不提供用于存储足球队的类,所以我将创建自己的类.最相似和相关的现有结构是List<FootballPlayer>,所以我将继承它:

class FootballTeam : List<FootballPlayer> 
{ 
    public string TeamName; 
    public int RunningTotal 
}
Run Code Online (Sandbox Code Playgroud)

但事实证明,指南说你不应该继承List<T>.我在两个方面完全被这个指南搞糊涂了.

为什么不?

显然List是以某种方式针对性能进行了优化.怎么会这样?如果我延长会给我带来什么性能问题List?究竟会打破什么?

我看到的另一个原因List是微软提供的,我无法控制它,所以我在以后暴露"公共API"后无法改变它.但我很难理解这一点.什么是公共API,我为什么要关心?如果我当前的项目没有并且不太可能拥有此公共API,我可以放心地忽略此指南吗?如果我继承List 并且事实证明我需要一个公共API,那么我将遇到什么困难?

为什么它甚至重要?列表是一个列表.什么可能改变?我可能想要改变什么?

最后,如果微软不想让我继承List,他们为什么不上课sealed呢?

我还应该使用什么呢?

显然,对于自定义集合,Microsoft提供了一个Collection应该扩展的类而不是List.但这个类是非常裸露,并没有多少有用的东西,比如AddRange,例如.jvitor83的答案提供了该特定方法的性能原理,但是如何缓慢AddRange而不是没有AddRange

继承Collection是比继承更多的工作List,我认为没有任何好处.当然微软不会告诉我无缘无故地做额外的工作,所以我不禁觉得我在某种程度上误解了某些东西,而继承Collection实际上并不是解决我问题的正确方法.

我见过如实施的建议IList …

.net c# oop inheritance list

1299
推荐指数
22
解决办法
17万
查看次数

何时使用IList以及何时使用List

我知道IList是接口,List是具体类型,但我仍然不知道何时使用每一个.我现在正在做的是如果我不需要使用该接口的Sort或FindAll方法.我对吗?有没有更好的方法来决定何时使用界面或具体类型?

.net c#

174
推荐指数
7
解决办法
13万
查看次数

C#中的数组如何部分实现IList <T>?

您可能知道,C#中的数组实现IList<T>了其他接口.但不知何故,他们这样做没有公开实现Count属性IList<T>!数组只有一个Length属性.

这是一个明显的例子,C#/ .NET打破了自己关于接口实现的规则,还是我错过了什么?

.net c# arrays interface list

98
推荐指数
4
解决办法
1万
查看次数

返回IList <T>比返回T []或List <T>更糟糕吗?

像这样的问题的答案:List <T>或IList <T>似乎总是同意返回一个接口比返回一个集合的具体实现更好.但我正在努力解决这个问题.实例化接口是不可能的,因此如果您的方法返回一个接口,它实际上仍然返回一个特定的实现.我通过编写两个小方法来尝试一下这个:

public static IList<int> ExposeArrayIList()
{
    return new[] { 1, 2, 3 };
}

public static IList<int> ExposeListIList()
{
    return new List<int> { 1, 2, 3 };
}
Run Code Online (Sandbox Code Playgroud)

并在我的测试程序中使用它们:

static void Main(string[] args)
{
    IList<int> arrayIList = ExposeArrayIList();
    IList<int> listIList = ExposeListIList();

    //Will give a runtime error
    arrayIList.Add(10);
    //Runs perfectly
    listIList.Add(10);
}
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,当我尝试添加新值时,我的编译器没有给我任何错误,但显然IList<T>当我尝试向其添加内容时,将我的数组公开为暴露的方法会产生运行时错误.因此,那些不知道我的方法中发生了什么,并且必须为其添加值的人,被迫首先将我复制IList到a List以便能够添加值而不会有错误.当然,他们可以做一个类型检查,看看他们是否正在处理a List或者a Array,但是如果他们不这样做,并且他们想要将项目添加到集合中,他们别无选择将其复制IList到a List,即使它已经是一个List.数组永远不会暴露为IList

我的另一个问题是基于相关问题的接受答案(强调我的):

如果您通过其他人将使用的库公开您的类, …

.net c# abstraction interface

80
推荐指数
5
解决办法
4601
查看次数

为什么公开List <T>被认为是不好的?

根据FXCop,List不应该在API对象模型中公开.为什么这被认为是不好的做法?

c# fxcop

57
推荐指数
3
解决办法
2万
查看次数

List和IList之间的区别

可能重复:
IList <int> vs List <int>
C# - List <T>或IList <T>

List和IList之间有什么区别,哪一个具有更好的性能以及何时使用List over IList,反之亦然?

.net c#

45
推荐指数
3
解决办法
7万
查看次数

IList <int> vs List <int>

你能帮我理解这两者之间的实际差异吗?

IList<int> myList = new List<int>();

List<int> myList = new List<int>();
Run Code Online (Sandbox Code Playgroud)

c#

29
推荐指数
3
解决办法
3万
查看次数

接口作为返回类型

接口可以是函数的返回类型.如果是的话那就是优势.例如,以下代码更正在返回接口数组的位置.

public interface Interface
{
    int Type { get; }
    string Name { get; }
}

public override Interface[] ShowValue(int a)
{
.
.

}
Run Code Online (Sandbox Code Playgroud)

c# interface

21
推荐指数
4
解决办法
3万
查看次数

foreach with generic List,在使用值类型时检测第一次迭代

foreach通过一个通用的清单荷兰国际集团我经常想做些不同的事在列表中的第一个元素:

List<object> objs = new List<object>
{
    new Object(),
    new Object(),
    new Object(),
    new Object()
};

foreach (object o in objs)
{
    if (o == objs.First())
    {
        System.Diagnostics.Debug.WriteLine("First object - do something special");
    }
    else
    {
        System.Diagnostics.Debug.WriteLine("object Do something else");
    }
}
Run Code Online (Sandbox Code Playgroud)

这将输出:

    First object - do something special
    object Do something else
    object Do something else
    object Do something else

这一切都很好,花花公子.

但是,如果我的通用列表是值类型,则此方法将失败.

List<int> ints = new List<int> { 0, 0, 0, 0 };
foreach (int i in …
Run Code Online (Sandbox Code Playgroud)

.net c#

18
推荐指数
3
解决办法
3万
查看次数

为什么返回集合接口而不是具体类型?

我注意到在其他人的代码中,返回泛型集合的方法几乎总是返回一个接口(例如IEnumerable<T>或者IList<T>),而不是具体的实现.

我有两个相关的问题.首先,为什么(如果有的话)返回接口被认为更好?其次,是否有一个包含Sort方法的集合接口(如同List<T>)?

.net c# interface list return-type

16
推荐指数
2
解决办法
5979
查看次数

标签 统计

c# ×10

.net ×7

interface ×4

list ×3

abstraction ×1

arrays ×1

fxcop ×1

inheritance ×1

oop ×1

return-type ×1