【问题标题】:Why were C# generics designed to behave so differently from C++ templates? [closed]为什么 C# 泛型的设计行为与 C++ 模板如此不同? [关闭]
【发布时间】:2011-08-26 08:51:15
【问题描述】:

我已经注意到C# generics are quite different from C++ templates。我已经阅读了this question 并对其进行了解答,并对其中的区别有了基本的了解。

但是我不明白这种设计差异的原因。我的意思是,在设计 C# 时,C++ 已经相当发达。在 C++ 模板中,C# 开发人员没有克隆 C++ 模板,而是引入了差异如此巨大的泛型,什么是次优的?

泛型可以做什么 C++ 模板不能做的事情? C# 泛型在哪些方面优于 C++ 模板?设计 C# 泛型与 C++ 模板行为不同的原因是什么?

【问题讨论】:

  • 第二个问题是C++ vs java generics
  • 一个主要优点是静态类型。
  • @George:模板和泛型都是静态类型的
  • 为什么有人让泛型表现得像 C++ 模板?它们最大的共同点是尖括号。请记住,泛型是 CLR 的一个特性 - 它们在 C# 和 VB.Net 中都公开。
  • @Joren,对不起,我的 c++ 生锈了!

标签: c# .net c++ templates generics


【解决方案1】:

原因是一个是模板,另一个不是。听起来多余?部分原因是你问了一个问题,“为什么汽车与飞机不同”。

模板是一种非常复杂的机制,大部分复杂性很少使用。我想你并不真正知道模板能做什么——只有人们每天使用的 25% 的 C++ 模板。这是主要问题 - 它们太复杂了。对编译器来说很难。

所以泛型应该为最常见的模板使用捕获一种不同的方法,即泛型通用类型(例如,没有专门化)。

泛型可以做什么 C++ 模板不能做的事情?

什么都没有。

设计 C# 泛型与 C++ 模板行为不同的原因是什么?

事实上,C++ 泛型几乎没有人掌握,而且对于编译器来说正确实现是一件很糟糕的事情,而且大部分时间都没有使用。

【讨论】:

  • 您能否提供一个 C++ 模板功能的示例,该功能显然超出了这 25% 的范围?
  • gotw.ca/publications/mill17.htm 例如讨论有问题的好功能之一。
  • 无法抗拒。你说:“因为你问了一个问题,“为什么汽车与飞机不同”。然后继续回答这个问题:“泛型能做什么 C++ 模板不能做的事情?”与“无”。飞机可以飞汽车不能:-)。现在变得严肃起来,你最初是对的,泛型和模板是完全不同的东西。泛型在编译并链接到字节码后仍然是“开放”类型,而模板是静态编译时评估的这一事实也意味着您可以使用泛型类型执行在编译/链接后模板无法执行的操作。
【解决方案2】:

它工作方式完全不同的主要原因。

C++ 模板在编译时进行评估。
C# 泛型在运行时进行评估。

此外,c++ 模板很复杂。在开发 C# 时,他们决定降低模板的复杂性。既适用于用户,也适用于运行时评估实现。

【讨论】:

  • “C# 泛型在运行时进行评估”,对吧?我们使用 C# 泛型进行静态类型检查。有链接吗?
  • 不过,他是对的。泛型编译成一个开放类字节码,在运行时对特定类型类关闭。模板是硬编码的。 C# 中的 List 作为 List temaplte 类存在,在 C++ 中,编译器后没有 List tempalte。
  • @George Duckett:C# 有反射。除其他外,这允许您在运行时动态获取类型。您可以在运行时创建具有该类型的泛型类。静态类型检查检查泛型中的任何类型 T,您只能分配一个 T。因此在运行时它将适用于任何类型。如果在运行时仍然发生类型不匹配(通常是由于滥用技巧),您将收到异常。
  • @TomTom:泛型是及时编译的。这与在运行时评估不同相同,这意味着每次您的程序使用泛型类或方法执行某些操作时,整个过程都会重新完成。 //@Yochai:反射与它无关。是的,通过反射,您可以在运行时创建通用事物。您还可以创建其他任何东西,所有这些通常在编译时考虑。当然,编译时间总是发生在运行时间之前,因为 C# 是及时编译的。
【解决方案3】:

泛型可以做什么 C++ 模板不能做的事情?

  • 泛型具有关于实例化类型的运行时信息。这对于内省(反射)和使用它的设备很有用;
  • C# 4.0 上的泛型支持接口和委托类型的协变和逆变。因此,作为一个小例子,当请求 IEnumerable<Class> 时可以使用 IENumerable<Derived>,其中 Derived 继承自 Class

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2018-11-17
    • 2010-09-07
    • 1970-01-01
    相关资源
    最近更新 更多