什么是术语的最佳定义" Type"特别是在c#语言?

时间:2011-07-19 09:46:34

标签: c# programming-languages types definition

这可能是一个非常简单的问题,但我对 Type 定义感到困惑。

如果您想提供术语类型的定义,例如Int, String或......,请立即想到Template这个词,但是如此接近"Class"定义,现在我想知道术语类型的定义究竟是什么。

Is it the same as class definitionType == class!?

如果是这样,我们知道c#中还有其他(引用)类型不是Class,例如InterfaceDelegate

交替使用Type和Class是否正确?
您能否给我一个关于Type 的全面定义 提前谢谢。

7 个答案:

答案 0 :(得分:14)

正如其他人所说,C#规范没有正式定义“类型”。 C#规范既不是语言语义的正式数学描述,也不是初学程序员的教程;在开始阅读规范之前,你应该知道“type”和“value”之类的词是什么意思。

在不同的精确度下,“类型”有许多可能的定义。例如,ECMAScript规范在某种程度上非正式地将类型定义为“一组值”,但由于ECMAScript只有九种可能的类型,因此它不需要具有严格的,有根据的定义。

另一个答案是,类型由一组值,一组用于操作这些值的规则和一个名称组成。这是一种非常常见的类型工作定义,但当您尝试更正式地考虑它时,它会遇到问题。匿名类型的名称是什么? double*[][] 名称的类型是“锯齿状的二维指针数组”吗?这种类型甚至有名字吗?同一类型的List<int>List<System.Int32>有两个不同的名称吗? 任何值是否构成一个类型?类型本身是否值?什么是类型?等等。这是一个很好的工作定义,但它并没有受到严格审查。

作为编译器编写者,我在C#中考虑类型的方式如下:类型是分类,可以应用于表达式。如果存在证明,则根据C#的规则,表达式可以被合法地分类为该类型,表达式被归类为特定类型。

例如,假设我们正在尝试计算表达式“1 + 2.3”的类型。我们首先计算表达式“1”的类型。 C#的规则给了我们;该表单的表达式始终归类为int。我们计算出表达式“2.3”的类型。同样,C#的规则告诉我们这个表单的表达式被归类为“double”。整个表达的类型是什么? C#的规则告诉我们“int”和“double”的总和被归类为“double”。所以这个表达式的类型是“double”。

这就是编译器在执行类型分析时所做的事情:它构造了特定表达式可以合法地以特定方式分类的证明,或者,如果程序是错误的,它会告诉您为什么它无法构建证明。

但是,在这个级别,所有类型都只是一种分类。您可以对任何域执行相同的操作。你说在正整数域中,某些数字被归类为“奇数”,某些数字被归类为“偶数”。某些数字被归类为“素数”和“复合数”。如果你想对一个数字进行分类,比如说“123”,那么你可以写一个证明“123”被分类为“奇数”和“复合”的证明。

你可以编制你想要的任何分类,你知道你刚刚做了什么吗?你刚刚做了一个类型。您可以将数字分类为“两个素数之和”和“不是两个素数之和”,“大于四”和“不大于四”。然后你可以将它们组合成类型,例如“偶数大于4的整数而不是两个奇数素数的总和”。很容易确定任何特定整数是否是此类型的成员;到目前为止,我们已经尝试过的所有整数都已确定是该类型的成员。目前还不知道该类型是否有任何成员;只是因为你能想出一种类型并不意味着你知道这种类型的大小!

类型系统可以允许任何可能的分类方案。我们可以编写C#,这样“奇数”和“偶数”,“素数”和“复合”都是“int”的子类型。我们可以编写C#,这样你可以记下的整数的任何属性都是int的子类型!我们不这样做,因为这种类型的系统给编译器带来了巨大的负担;使用这种类型系统的编译器非常复杂,非常慢,并且可能遇到必须解决不可能出现的问题的情况。 CLR和C#的设计者构建了我们拥有的类型系统,使得编译器(通常)可以非常快速地将表达式分类为类型。

答案 1 :(得分:3)

不,可互换地使用“类型”和“类”是不正确的。

类型可以是以下任何一种:

  • 一堂课
  • 界面
  • 委托类型
  • 枚举类型
  • 结构
  • 指针类型
  • 数组类型(也是类)

据我所知,C#规范并没有真正“定义”单词“type”。即使在介绍之前,它也谈到C#具有“统一类型系统”而没有定义类型是什么。

我怀疑对于大多数开发人员来说,给出例子你所说的“类型”这个词比准确定义这个词更简单,更具沟通性。

答案 2 :(得分:1)

您不应该互换使用类型和类。

This是关于类型的有趣读物。


请注意,类型包括structsinterfacesdelegatespointer typesenum结构以及classes

答案 3 :(得分:1)

这里......

类型是可以实例化的任何东西(我的定义,而不是MSFT)。

接口可以实例化,因为必须有另一种类型来实现接口。

匿名类型是没有类定义的类型,但可以实例化它们。

任何类型都可以从其他(非匿名)类型继承。然后我们将其他类型称为基类型。

编辑:正如Jon Skeet所说,静态类无法实例化,因此我的定义不变。也许它应该是“任何可以实例化的东西,或者是静态类”......

答案 4 :(得分:1)

我能提出的最佳工作回答是:

  

类型是值的集合,对这些值的操作集合以及使其唯一的名称。

如果您正在从计算机科学的角度寻找一个基本上 类型的深层答案,我认为您不会在C#文档中找到它。类型是我们大多数人在日常生活中成功使用的东西,而不必确定其确切的定义。但是如果你真的想知道我认为你会在编程理论和语言社区(特别是ML和Haskell)中找到更好的答案,人们会非常谨慎地准确地形容他们所谈论的内容。

The Wikipedia entry for Type System是一个很好的起点。

答案 5 :(得分:0)

类和类型 noi 可互换。类始终是类型,但类型并不总是类。例如,结构和接口是类型,但不是类。

答案 6 :(得分:0)

“type”只是“数据类型”的缩写。您使用的任何变量都有一些数据类型,可以是所谓的“简单类型”(如intlong),也可以是“复杂类型”,如struct或{{1 }}

虽然类始终是类型,但并非每个类都是类。例如,class是一种类型,但不是类。 C#的特点是,对于每种简单类型,还有一个代表类(int =&gt; bool)。

您不能互换地使用类和类型,但如果您这样做,则通常会理解: - )