什么是类型安全?
它是什么意思,为什么它很重要?
ArrayList
类是不类型安全的,因为它可以存储任何对象,这意味着您可以执行以下操作:var integers = new ArrayList();
integers.Add(1);
integers.Add(2);
integers.Add("3");
for (int i = 0; i < integers.Count; ++i) {
int integer = (int)integers[i];
// do something
}
String
和Int32
都派生自Object
,所以可以合法地将其添加到ArrayList
中。然而,当您尝试将integer
设置为(int)integers[2]
时,它会抛出InvalidCastException
异常,因为String
不能被强制转换为Int32
。
另一方面,List<T>
类恰恰因为相反的原因是类型安全的——即使上述代码不会编译,如果integers
是List<int>
。您作为开发人员从类型安全的List<int>
中访问的任何值都可以确保是一个int
(或者对于任何通用List<T>
,是相应的T
),因此您可以确信您将能够执行操作,例如将其转换为int
(显然)或long
。C - 你声明了一个int,将其强制转换为char,并访问超出int边界的内存
int i = 10;
char *s = (char*)i;
print(*(s+10));
C# - 类型安全
int i = 10;
char *s //This is invalid unless you are using unsafe context.
.NET不直接支持指针
你是指特定的类型安全还是一般的类型安全?
我不同意被接受的答案:ArrayList 是类型安全无知的(既不是类型安全也不是非类型安全):https://dev59.com/zHXYa4cB1Zd3GeqP2ybt#17984521
Richter - CLR via C#,第四版(第93页):
类型安全是CLR的主要特性。您可以通过调用System.Object的非虚拟GetType方法来始终发现对象的确切类型。
例如,Hero类不能重写GetType方法以成为SuperHero类型。
这个System.Object特性使CLR能够在运行时检查对象转换的可能性。例如:
internal class Employee { ... }
public sealed class Program
{
public static Main()
{
DateTime dt = new DateTime(2016, 1, 1);
PromoteEmployee(newYears);
}
public static PromoteEmployee(Object o)
{
Employee e = (Employee)o; //InvalidCastException, runtime error
}
}
我不同意这里的一些答案。 C#有几个级别的安全性。
编辑:类型安全有两个层面的含义(如果我们通常讨论编程语言,就像在本主题中)
一个是编译时类型安全,接近重构等,编译器捕获拼写错误,将值分配给错误变量(属性),即字符串分配给int变量。典型的C#代码是类型安全的,已知禁用此功能的方法是dynamic
关键字或非泛型容器,上述错误被延迟到运行时。例如:非黑客C/C++代码在编译时(通常)是类型安全的。我认为可以在C#中编写(黑客)转换,隐藏类型冲突。
下一个级别是运行时类型安全,C#通常是安全的(没有不安全的部分)。即使动态值也会在运行时进行检查。相比之下:C/C++在运行时不安全。如果编译器接受代码,则不合逻辑的赋值在运行时不会被检查,提供奇怪/奇异/系统级或晚期错误,这是C语言的典型特征。
本主题中的一些回答者混淆了C#安全的其他领域(内存安全、范围安全、空指针等)。严格来说,这些是不同类型的安全。
理论:https://en.wikipedia.org/wiki/Type_safety