编程语言中类型化的含义



我一直在学习C#课程,下面的主题突然出现在我的脑海中,希望是时候摆脱它了:编程语言中的类型化意味着什么?

当我问自己,构建类型安全语言的意愿背后的原因/主题是什么时,我得出的最终答案(也许是唯一的答案)是:在语言中定义类型的能力使我们能够对程序中使用的数据实施编译时间限制,这样,IDE/编译器就可以帮助我们防止/检测错误,否则我们会错过这些错误,而且可能只会在很久以后发现,这当然是一个问题。这些错误包括无效操作、无效成员访问等。

如果我在这一点上是对的,那么我会问:在C#等语言中,强制转换到底意味着什么?假设我有一个方法,它是以Object类型的参数定义的,我将该类型的任何派生(即任何类型)传递给它——在这一点上,在幕后发生了什么?

我倾向于认为,键入还为我提供了在任何给定对象实例中可以访问哪些成员的限制。换句话说,我假设编译器总是查看变量的类型,而不是它接收到的实例,以执行/应用其验证规则,然后激发或不激发错误消息。这是对的吗?在我下面给出的例子中,由于变量类型是Object,编译器将不允许我访问任何实例成员,除非我执行实例类型的强制转换。我想在这里澄清的一点是,无论是否正在执行强制转换,实例过去和将来都将始终保留其类型。根据我的理论,只有当编译器——一个帮助我们工作的工具——以及我们在构建程序的每一步都受到抑制的认可——能够接受这个代码真的是100%可信/"安全"的时候,强制转换才是必要的。

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

最后一点,我假设每个实例都分配一个内存块(我想知道是否一定是连续的)——总的来说,其每个类型成员的内存需求之和(加上更多的元数据/标头信息,等等),并且每个成员定义都会生成一个特定的内存地址,以便在访问实例以访问任何给定成员(无论是变量、方法等)时使用。

上面的任何假设都错了吗?(或者我应该问……他们中有人是对的吗?:)

您的答案显示了对我们在编程语言中使用类型的原因的良好理解。

最新更新