典型化在编程语言中的意义

时间:2012-03-13 15:20:10

标签: compiler-construction types casting theory

我一直在学习C#课程,我的脑海里浮现出以下主题,时间已经到来,希望摆脱它:典型化在编程语言中的含义是什么?

当我问自己,构建类型安全语言的意愿背后有什么原因/主题时,我提出的最终答案(也许是唯一的答案)是:用语言定义类型的能力允许我们对我们在程序中使用的数据强制执行编译时约束,以便IDE /编译器可以帮助预防/检测错误,否则我们会错过 - 并且可能很晚才发现 - 这当然是一个问题。其中包括无效操作,无效成员访问等等。

如果我到目前为止是正确的,那么我会问:在使用C#等语言进行投射时,它意味着什么/真正发生了什么?假设我有一个使用Object类型的参数定义的方法,并且我传递了类型的任何派生(即任何类型) - 此时在幕后发生了什么?

我倾向于认为打字还限制了我可以在任何给定对象实例中访问哪些成员。换句话说,我假设编译器总是查看变量的类型而不是它接收的实例来执行/应用其验证规则然后触发或不触发错误消息。这是正确的吗?在下面给出的示例中,由于变量类型是Object,编译器将不允许我访问我的任何实例成员 - 除非我对实例的类型执行强制转换。我想在此澄清的一点是,实例是并且将始终保持其类型 - 无论是否正在执行强制转换。根据我的理论,演员阵容是必要的,因此编译器 - 一个帮助我们工作的工具 - 以及我们在构建程序的每一步中被制服的认可 - 可以接受这个代码真的是一个100%信任/“安全”。

然后我想到上面提到的应用于多态,并且似乎有意义:持有更专用类型的实例的更通用类型不会导致编译器错误,因为访问实例成员没有风险没有在更一般的类型中定义,因为更专业的类型继承它们(覆盖它们或不覆盖它们,甚至隐藏它们)。另一方面,相反(当类型比实例更专业时) - 包含一个问题,因为程序员很可能错误地访问实例中的专用成员(这将不存在)。

作为最后一点,我想每个实例都会分配一块内存(我想知道是否必然是连续的) - 总的来说,它的每个类型成员的内存需求总和(加上一些更多的元数据/头信息,无论如何) - 并且每个成员定义生成一个特定的内存地址,用于访问实例以访问任何给定成员(无论是变量,方法等)。

以上任何假设都是错误的吗? (或许我应该问......他们中的任何一个都对吗?)

1 个答案:

答案 0 :(得分:0)

您的答案很好地理解了我们在编程语言中输入类型的原因。