什么是.net中的类型安全?

Sur*_*har 56 .net c#

什么是类型安全的?

它意味着什么,为什么重要?

Dan*_*Tao 74

如果你问的是"类型安全"的概念通常意味着什么,那么代码的特征就是允许开发人员确定某个值或对象将展示某些属性(即,属于某种类型),以便他/她可以以特定方式使用它而不用担心意外或未定义的行为.

例如,在C#中,您可以说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
}
Run Code Online (Sandbox Code Playgroud)

以上将编译,因为值"3",即使它是一个字符串而不是一个整数,可以合法地添加到ArrayList自从String派生(如Int32)Object.但是,InvalidCastException当你尝试设置为时,它会抛出一个integer,(int)integers[2]因为String无法强制转换为Int32.

另一方面,由于完全相反的原因,List<T>类型安全的 - 即,如果是a ,上面的代码将无法编译.您从类型安全内的显影剂访问的任何值可以是一定的是一个(或任何相应为任何通用); 因此,您可以确定您将能够执行诸如转换(显然)或等等的操作.integersList<int>List<int>intTList<T>intlong

  • 他只是想解释类型检查的重要性,他并不是要解释数组列表的特征. (4认同)

A9S*_*9S6 15

C - 您声明一个int,将其强制转换为char并访问超出int边界的内存

int i = 10;
char *s = (char*)i;
print(*(s+10));
Run Code Online (Sandbox Code Playgroud)

C# - 类型是安全的

int i = 10;
char *s //This is invalid unless you are using unsafe context. 
Run Code Online (Sandbox Code Playgroud)

.NET不直接支持指针


Hot*_*ter 10

类型安全代码仅访问其有权访问的内存位置.例如,类型安全代码无法从另一个对象的私有字段读取值.它仅以明确定义的允许方式访问类型.

在即时(JIT)编译期间,可选的验证过程检查要将JIT编译为本机机器代码的方法的元数据和Microsoft中间语言(MSIL),以验证它们是类型安全的.如果代码有权绕过验证,则会跳过此过程

虽然运行托管代码并不强制验证类型安全,但类型安全在程序集隔离和安全实施中起着至关重要的作用.当代码是类型安全的时,公共语言运行库可以完全隔离组件.这种隔离有助于确保组件不会相互产生不利影响,并提高应用可靠性.

有关更多参考msdn链接

这里有一篇很好的文章解释它

  • 最后一个链接坏了. (2认同)