“类型安全”和“强类型”是同一意思吗?

最佳答案

不需要,不一定-尽管这取决于您对术语的定义,并且没有非常明确和广泛接受的定义。

例如,动态编程语言通常是类型安全的,但不是强类型的。换句话说,没有编译时类型信息来确定您可以对类型做什么和不能做什么,但是在执行时,运行时确保您不会像使用另一种类型那样使用一种类型。

例如,在C#4.0中,您可以执行以下操作:

dynamic foo = "hello";
dynamic length = foo.Length; // Uses String.Length at execution time
foo = new int[] { 10, 20, 30 };
length = foo.Length; // Uses Array.Length at execution time
dynamic bar = (FileStream) foo; // Fails!

最后一行是确保类型安全的关键:没有从int数组安全转换为FileStream的操作,因此操作失败-而不是将数组对象的字节视为FileStream

编辑:C#通常既是“强类型”(作为一种语言)又是安全类型:编译器不会让您尝试对对象进行任意调用,并且运行时不会让您执行不正确的转换。

我不太确定不安全的代码适合哪里-恐怕我对其注释的了解不多。

如上所示,C#4中的动态键入允许使用弱类型但仍然是类型安全的代码。

注意foreach执行隐式转换,使其成为一种混合:
ArrayList list = new ArrayList();
list.Add("foo");

foreach (FileStream stream in list)
{
    ...
}

这将编译(最近有another question),但在执行时将失败。具有讽刺意味的是,这是因为您要针对stream变量进行强类型化,这意味着您必须对迭代器的结果执行强制类型转换。

关于c# - “type-safe”和 “strongly typed”表示同一意思吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/969088/

10-09 00:40