如何定义“类型”的含义

摘自Eric Lippert关于“是”的含义 的博客 是 :

类型的一个常见概念是类型是值的集合,并且赋值兼容性仅仅是检查给定值是否是必要集合的成员。 但在C#中并非如此。

他给出的计数器示例是null is string返回false ,但string b = null完全没有C#编译器。

也许这是一个愚蠢的问题,但是在C#.Net上下文中定义“类型”概念的更好方法是什么? 它只是用来定义内存占用规则的一个词吗? …到CLR? 我意识到这个定义是多么宽松(而且可怕的错误),但我正在努力适应一个漂亮的包装并绕过类型的想法。

注意:越简单,但完全准确,越好。 (强N型 ,这里)。

什么是在C#.Net上下文中定义“类型”概念的更好方法? 它只是用来定义内存占用规则的一个词吗? 我正在努力适应一个漂亮的包装,并围绕类型的想法鞠躬。

这是一个棘手的问题。 你打开了关于我的文章的链接,但我认为你真正想要阅读的是这一个:

http://blogs.msdn.com/b/ericlippert/archive/2011/08/29/what-is-this-thing-you-call-a-quot-type-quot-part-one.aspx

http://blogs.msdn.com/b/ericlippert/archive/2011/09/07/what-is-this-thing-you-call-a-quot-type-quot-part-two.aspx

简述:

从“数学”的角度来看,类型就像一个数字:我们可以使用规则操纵的抽象数量。 就像“如果T是一个类型那么T[]也是一个类型”,依此类推。

一旦我们有一个抽象的类型概念,那么我们可以为每个表达式分配一个类型,然后我们可以创建一个自动确定程序是否遵循类型安全规则的validation程序。

Type的传统英语定义是一个很好的起点。

一类具有共同特征的人或事物。

.NET类型定义特定类别的.NET对象(即:System.IO.Stream)。 它包含一组特定.NET对象的属性和方法(特征)。

您是否在寻找更多技术描述(即:内存管理等)?

这里有类似问题的一些好的答案: 为什么当给定null时,is运算符返回false?

这里对null文字进行了更详细的讨论:null文字的类型是什么?

为了符号目的,似乎早期版本的.NET中曾经存在null类型,但随后在后续版本中被删除。

从IL程序员的角度来看,我可以说当在IL中写入’if(myvar == null)’之类的语句时,它会是这样的:

 Ldloc myvar brfalse IfNullLabel 

无论其类型如何,仅使用一条IL指令检查变量的空引用。 如果将其与另一个字符串进行比较,则将调用Equals方法。 所以在内部,当引用指向空文本时,值为null。 就如此容易。

根据编程指南,我想你可能会过度思考这一点

存储在类型中的信息可包括以下内容:

  • 类型变量所需的存储空间。
  • 它可以表示的最大值和最小值。
  • 它包含的成员(方法,字段,事件等)。
  • 它inheritance的基类型。
  • 变量内存在运行时分配的位置。
  • 允许的操作类型。

我知道这不会占用null但在c#中, null实际上只是缺少引用的内存地址。

有更多的上下文将有助于回答你的问题(“ [...] define the idea of 'type' in a C#.Net context[...] ”,但这里是一个快速的刺。 .NET中的类型概念来自面向对象的编程 ,并且是来自前OOP编程语言的数据类型概念的概括。 最简单的forms,你可以说……

类型是结构的命名模板,其实例包含数据和/或行为。

编辑部分中的问题解答:

[…] CLR如何处理类型的想法?

我不确切地知道你的意思,但CLR中的一个类型 – 我上面的定义中的’命名模板’ – 在物理上存储为CIL,并在系统中由一个对象本身表示(就像所有对象一样)是一种类型。

在这种情况下,该类型被命名,当然, System.Type 。 (如果你很好奇,这种类型实际存储在mscorlib程序集中。)我知道我在自己的定义中使用了一个术语,但很难不这样做,因为这个概念本质上是递归的。

[…] CLR是否需要隐式地将null转换为赋值字符串s = null中的字符串? 答案到目前为止暗示不,它没有,但是什么允许这个任务? null只是在这里被视为一个特例吗?

是的,这是一个特殊情况,不,编译器和CLR都没有将null转换为string (或其他任何东西)。 null没有类型(1)并且不能转换为任何类型 – 它是一个特殊的“值”,表示缺少值(2) ,因此可以赋值给任何引用类型的变量(3)


(1)根据您的外观,它可能是也可能不是 “null type”类型 。

(2)这样的值将是对该类型的实例的引用 。

(3)有两种类型 – 引用类型值类型 – 而null实际上只适用于前一种类型 。 它可以出现在源代码中(例如int? i = null; ),因为它被赋值给可空值类型的变量,但这只是语法糖,幕后发生的事情是非常不同的,只与这个讨论相关。