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



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

当您想提供术语的定义时,类型Int, String或…
立刻想到了Template这个词,但它与"Class"的定义非常接近,现在我想知道术语类型的确切定义是什么。

Is it the same as class definition !?Type == class ! ?

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

可以互换使用Type和Class吗?
你能给我一个关于Type的全面定义吗?

正如其他人所注意到的,c#规范并没有正式定义"类型"。c#规范既不试图成为语言语义的正式数学描述,也不试图成为新手程序员的教程;在开始阅读规范之前,您应该知道"type"one_answers"value"等单词的含义。

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

另一种回答是,类型由一组值、一组操作这些值的规则和一个名称组成。这是一种非常常见的类型定义,但是当您尝试更正式地考虑它时,它会遇到问题。匿名类型的名称是什么?是double*[][]名称类型的"指针的锯齿二维数组double"?这种类型有名字吗?List<int>List<System.Int32>是同一类型的两个不同的名称吗?任何值集合构成类型吗?类型本身是值吗?类型的类型是什么?等等......这是一个很好的工作定义,但它并不完全经得起推敲。

作为一个编译器作者,我认为c#中的类型是这样的:类型是一个分类,可以应用于表达式。如果存在证明,证明该表达式可以根据c#规则合法地归类为该类型,则该表达式被归类为特定类型。

例如,假设我们正在尝试计算表达式"1 + 2.3"的类型。我们从计算表达式"1"的类型开始。c#的规则给了我们这个;这种形式的表达式总是被归类为int类型。我们计算出表达式"2.3"的类型。同样,c#规则告诉我们,这种形式的表达式被归类为"double"。整个表达式的类型是什么?c#规则告诉我们,"int"one_answers"double"的和被归类为"double"。所以这个表达式的类型是"double"

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

但是在这个层次上,类型只是一个分类。你可以对任何定义域做同样的事情。你说在正整数的域中,某些数被归类为"奇数",某些数被归类为"偶数"。某些数被分为"素数"one_answers"合数"。如果你想对一个数字进行分类,比如"123",那么你可以写一个证明,证明"123"同时被分类为"奇数"one_answers"合数"。

你可以编造任何你想要的分类,你知道你刚刚做了什么吗?你刚选了一种类型。你可以把数字分为"两个素数的和"one_answers"不是两个素数的和",以及"大于4"one_answers"不大于4"。然后你可以把它们组合成"大于4的偶数而不是两个奇素数的和"很容易确定任何特定的整数是否为该类型的成员;到目前为止,我们尝试过的所有整数都被确定为而不是是该类型的成员。目前还不知道该类型是否有任何成员;仅仅因为你能想出一个类型并不意味着你知道这个类型的大小!

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

不,"type"one_answers"class"不能互换使用。

类型可以是:

  • 委托类型
  • 枚举类型
  • struct
  • 指针类型
  • 一个数组类型(也是一个类)

就我所知,c#规范并没有真正"定义"类型"这个词。甚至早在介绍的时候,它就谈到c#有一个"统一的类型系统",但没有定义类型是什么。

我怀疑对于大多数开发人员来说,给出示例来说明您所说的"类型"这个词的含义比试图准确地定义这个词更简单,更容易交流。

类型和类不能互换使用。

这是一本关于类型的有趣读物。


注意类型包括结构体、接口、委托、指针类型和枚举构造以及类。

Here goes…

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

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

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

任何类型都可以继承另一个(非匿名)类型。然后将另一个类型称为基类型。

EDIT:正如Jon Skeet所说,静态类不能被实例化,所以我的定义是平淡的。也许它应该是"任何可以实例化的东西,或者一个静态类"……

我能想到的最好的工作日答案是:

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

如果你想从计算机科学的角度深入了解基本类型是什么,我想你不会在c#文档中找到答案。类型是我们大多数人在日常生活中成功使用的东西,无需确定它们的确切定义。但如果你真的想知道,我认为你会在编程理论和语言社区(特别是ML和Haskell)中找到更好的答案,在那里人们非常小心地精确形式化他们正在谈论的内容。

维基百科关于Type System的条目是一个很好的起点。

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

"type"是"data type"的简写。您使用的任何变量都有一些数据类型,无论是所谓的"简单类型"(如intlong)还是"复杂类型"(如structclass)。

虽然类总是类型,但不是每个类型都是类。例如,int是一个类型,而不是一个类。 c#有一个特性,对于每个简单类型都有一个表示类(bool => Boolean)。

你不能把类和类型互换使用,但如果你这样做,大多数情况下会被理解:-)

最新更新