【问题标题】:Best resource for learning .NET generics? [closed]学习 .NET 泛型的最佳资源? [关闭]
【发布时间】:2008-09-17 16:40:04
【问题描述】:

我从未在工作中使用过任何 .NET 泛型,但我知道它们相当流行。有没有人有任何好的链接或书籍建议来学习它们?作为奖励;我只是模糊地了解什么是 .NET 泛型集合以及它们的作用......有没有人有任何实际示例说明如何使用它们来比 .NET 中的普通集合获得更大的优势?

【问题讨论】:

    标签: c# .net generics


    【解决方案1】:

    显而易见的选择..

    MSDN C# Generics

    【讨论】:

      【解决方案2】:
      【解决方案3】:

      Jeffrey Richter 通过 C# 编写的 CLR 深入探讨了泛型,是每个 .NET 开发人员都应该拥有和阅读的无价资源之一。

      【讨论】:

        【解决方案4】:

        如果您曾经使用过 C++ 模板,那么 .Net 泛型几乎是一样的。他们甚至使用类似的 语法。

        即使你不懂任何 C++,你也可能比你需要的更难,尤其是在集合方面。它们就像任何其他集合一样,但是当您创建它们时,您会在 中提供一个类型名称,以便编译器知道它们持有什么样的项目。

        【讨论】:

          【解决方案5】:

          C# 3.0 in a Nutshell 是一本很棒的参考书,其中的示例足够大,足以掌握概念而不会感到臃肿。

          【讨论】:

            【解决方案6】:

            我发现 WROX 的 Professional .NET 2.0 Generics 非常有用,因为它包含许多真实世界的示例。泛型可能会让初学者感到困惑,但在经验丰富的开发人员手中,它们可能是一个非常有用/强大/节省时间的工具。就个人而言,我发现 .NET 泛型在简化集合的定义和使用方面最有用。此外,使用泛型可以提高代码效率,因为它可以最大限度地减少通常与装箱/拆箱类型转换相关的性能损失。

            【讨论】:

              【解决方案7】:

              最好参加一些有关该主题的 Microsoft 培训。如果您正在寻找书籍,以下将是理想的:

              http://www.microsoft.com/MSPress/books/9469.aspx

              【讨论】:

                【解决方案8】:

                我的投票是-大多数情况下你可以避免它们:)

                泛型的主要优点是节省转换,如果您最终在内部进行没有任何意义的转换。如果您尝试研究这个问题,您会发现大多数泛型候选者实际上是那些可以在内部创建本机存储以获得这种好处的集合/集合。另一方面,与接口继承实现相比,大多数其他组件几乎没有/没有性能,并且大大降低了灵活性。

                如果投射让您非常烦恼,也许是时候考虑一​​下 IronPython 之类的动态语言了 :)

                而且-如果你真的遇到一个你认为通用的场景,把它作为另一个问题发布,这里的大脑可以一起看,逐个解决:)

                更新:是的,编译器检查很好,但是查看 Castle Project 的源代码,您会看到很多情况下泛型类型会因为您无法进行转换而受到影响——使 IBusinessObject 之类的东西比 BusinessObject 灵活得多——因为您不能将从 BusinessObject 继承的某些内容转换回 BusinessObject 并期望访问继承的函数。通常我看到代码最终是 BusinessObjectBase -> BusinessObject ->Your actual class。这就是为什么我觉得使用泛型并不总是有益的原因——而且我是滥用这种实现并最终获得大量有趣的泛型类型函数的人之一,一点都不好。

                更新#2:装箱/拆箱只是意味着当您使用抽象类型(如对象)来存储值并使用强类型值再次将其存储回来(这需要强制转换)时,需要强制转换对象,并不多除了我所说的收集情况,我可以看到不同之处。像这样的 AND 代码仍然可以装箱:

                public T GetValue<T>() {
                  return (T) ...;
                }
                

                这是我最常看到的一般性滥用。人们认为他们在这里处理的是原生类型,实际上他们不是。相反,他们只是将转换转换为通用语法。真正有意义的是:

                public class MyList<T>
                {
                  private List<T> _list;
                ...
                public T GetValue(int index)
                {
                  return _list[index];
                }
                

                然后又回到我们的收藏库。这就是为什么我在收集存储之后说我没有看到很多机会通用帮助。 参考本教程: http://en.csharp-online.net/Understanding_Generics—Revisiting_Boxing_and_Unboxing

                【讨论】:

                • 您可以做的不仅仅是收藏。你一定没听说过“拳击”。避免强制转换还有更多好处,而不仅仅是性能。编译器强制类型安全非常好。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-09-30
                相关资源
                最近更新 更多