“类型安全”和“强类型”是同一意思吗?
最佳答案
不需要,不一定-尽管这取决于您对术语的定义,并且没有非常明确和广泛接受的定义。
例如,动态编程语言通常是类型安全的,但不是强类型的。换句话说,没有编译时类型信息来确定您可以对类型做什么和不能做什么,但是在执行时,运行时确保您不会像使用另一种类型那样使用一种类型。
例如,在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/