.net中的types安全是什么?

什么是types安全的?

这是什么意思?为什么这很重要?

如果你问一般的“types安全”是什么意思,代码的特点是允许开发人员确定一个值或对象将performance出某些特性(即某种types),以至于他/她可以以特定的方式使用它,而不用担心意外的或未定义的行为。

例如,在C#中,可以说ArrayList不是types安全的,因为它可以存储任何对象 ,这意味着您可以执行以下操作:

 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 } 

以上将编译,因为值为“3”,即使它是一个string,而不是一个整数,可以合法地添加到ArrayList因为String派生(如Int32 )从Object 。 但是,当您尝试将integer设置为(int)integers[2]时,它将引发InvalidCastException ,因为无法将String转换为Int32

另一方面, List<T>完全相反的原因的types安全的 – 即,如果integers是一个List<int> ,上面的代码将不会编译。 开发人员从types安全的List<int>访问的任何值都可以确定int (或者任何通用List<T>的对应T )。 所以你可以确定你可以执行操作,比如将其转换为int (显然)或者long

C – 你声明一个int,把它强制转换为char,并访问超出int边界的内存

 int i = 10; char *s = (char*)i; print(*(s+10)); 

C# – types是安全的

 int i = 10; char *s //This is invalid unless you are using unsafe context. 

指针并不直接被.NET支持

types安全代码只访问它被授权访问的内存位置。 例如,types安全的代码不能从另一个对象的专用字段读取值。 它只能以明确的,允许的方式访问types。

在即时(JIT)编译期间,可选validation过程检查要被JIT编译为本机机器码的方法的元数据和Microsoft中间语言(MSIL),以validation它们是types安全的。 如果代码具有绕过validation的权限,则跳过此过程

虽然types安全性的validation不是运行托pipe代码所必需的,但types安全性在组件隔离和安全性实施中起着至关重要的作用。 当代码是types安全的,公共语言运行库可以完全隔离程序集彼此。 这种隔离有助于确保组件不会相互影响,并提高应用程序的可靠性。

更多的参考msdn链接

一个好的文章解释它在这里

你的意思是特别是types安全还是一般的types安全?

我不同意接受的答案:ArrayList是types安全的无知(既不是types安全也不是types安全的): https : //stackoverflow.com/a/17984521/1145224

Richter – 通过C#的CLR,第4版(第93页):

types安全是CLR的主要特征。 您可以通过调用System.Object的非虚拟 GetType方法来始终发现对象的确切types。

例如Hero类不能重载GetType方法成为一种SuperHero。

此System.Objectfunction使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 } } 

将DateTimetypes转换为Employeetypes是一个非types安全的转换示例。

.NET中的types安全已被引入,以防止一种types的对象窥探为其他对象分配的内存。

例如和详细的讨论,请访问此链接

我不同意这里的一些答案。 C#的安全级别很低

编辑:types安全有2个层次的意义(如果我们通常讨论编程语言,如在这个线程)

一个是编译时间types安全 ,靠近重构等,编译器捕获拼写错误,错误地赋值给错误的variables(属性),即string到intvariables。 典型的C#代码是types安全的,已知的禁用此function的方式是dynamic关键字,或者非generics容器,像上面这样的错误被延迟到运行时。 例如:非编译的C / C ++代码在编译时(通常)是安全的。 我认为是可能写入(黑客)铸造在C#中隐藏types冲突。

下一级是运行时types安全 ,C#通常是安全的(没有不安全的部分)。 即使dynamic值也会在运行时检查。 相反:C / C ++在运行时不是安全的。 如果编译器接受代码,则在运行时不检查非逻辑分配,从而提供C语言典型的奇怪/奇怪/系统级或迟延错误。

在这个线程中,很less有回答者将C#安全的其他区域(内存安全,范围安全,空指针等)混合在一起。 严格来说,这是不同的安全。

理论: https : //en.wikipedia.org/wiki/Type_safety