unsafe
今天无意中发现C#这种完全面向对象的高级语言中也可以用不安全的指针类型,即要用到unsafe关键字。在公共语言运行库 (CLR) 中,不安全代码是指无法验证的代码。C# 中的不安全代码不一定是危险的,只是其安全性无法由 CLR 进行验证的代码。因此,CLR 只对在完全受信任的程序集中的不安全代码执行操作。如果使用不安全代码,由你负责确保你的代码不会引起安全风险或指针错误。unsafe 关键字表示不安全上下文,该上下文是任何涉及指针的操作所必需的。可以在类型或成员的声明中使用 unsafe 修饰符。因此,类型或成员的整个正文范围均被视为不安全上下文,不安全上下文的范围从参数列表扩展到方法的结尾,因此指针在以下参数列表中也可以使用。例如,用 unsafe 修饰符声明的方法:
unsafe static int Sum(int* p) { return *p * (*p); }
还可以使用不安全块从而能够使用该块内的不安全代码。例如:
unsafe { int a = 5; int* b = &a; }
若要编译不安全代码,必须指定 /unsafe 编译器选项,否则无法通过公共语言运行库验证不安全代码。在 Visual Studio 开发环境中设置此编译器选项
-
打开项目的“属性”页。
-
单击“生成”属性页。
-
选中“允许不安全代码”复选框。
另外:不安全代码具有下列属性:
-
方法、类型和可被定义为不安全的代码块。
-
在某些情况下,通过移除数组界限检查,不安全代码可提高应用程序的性能。
-
当调用需要指针的本机函数时,需要使用不安全代码。
-
使用不安全代码将引起安全风险和稳定性风险。
-
在 C# 中,为了编译不安全代码,必须用 /unsafe 编译应用程序。下面给个完整简单的例子:
unsafe static int Sum(int* p) { return *p * (*p); } unsafe static void Main(string[] args) { int a = 5; Console.WriteLine(Sum(&a)); Console.ReadKey(); }
太过安逸的日子给人未必是幸福,它很有可能毁了一个人的理想,腐蚀一个人的心灵