从通常情况下来看,为了保持类型安全,默认情况C# 不支持指针算法。
不过,当你需要使用指针的时候,请通过使用 unsafe 关键字,可以定义可使用指针的不安全上下文。 有关指针的更多信息,请参见主题指针类型。
说明 |
---|
在公共语言运行时 (CLR) 中,不安全代码是指无法验证的代码。 C# 中的不安全代码不一定是危险的;只是其安全性无法由 CLR 进行验证的代码。 因此,CLR 只对在完全受信任的程序集中的不安全代码执行操作。 如果使用不安全代码,由您负责确保您的代码不会引起安全风险或指针错 |
不安全代码具有下列属性:
-
方法、类型和可被定义为不安全的代码块。
-
在某些情况下,通过移除数组界限检查,不安全代码可提高应用程序的性能。
-
当调用需要指针的本机函数时,需要使用不安全代码。
-
使用不安全代码将引起安全风险和稳定性风险。
-
在 C# 中,为了编译不安全代码,必须用 /unsafe 编译应用程序。
unsafe 关键字表示不安全上下文,该上下文是任何涉及指针的操作所必需的。 有关更多信息,请参见 不安全代码和指针(C# 编程指南)。
可以在类型或成员的声明中使用 unsafe 修饰符。 因此,类型或成员的整个正文范围均被视为不安全上下文。 例如,以下是用 unsafe 修饰符声明的方法:
unsafe static void FastCopy(byte[] src, byte[] dst, int count) { // Unsafe context: can use pointers here. }
不安全上下文的范围从参数列表扩展到方法的结尾,因此指针在以下参数列表中也可以使用:
unsafe static void FastCopy ( byte* ps, byte* pd, int count ) {...}
还可以使用不安全块从而能够使用该块内的不安全代码。 例如:
unsafe { // Unsafe context: can use pointers here. }
若要编译不安全代码,必须指定 /unsafe 编译器选项。 无法通过公共语言运行时验证不安全代码。
在 Visual Studio 开发环境中设置此编译器选项
-
打开项目的“属性”页。
-
单击“生成”属性页。
-
选中“允许不安全代码”复选框。
有关如何以编程方式设置此编译器选项的信息,请参见 AllowUnsafeBlocks。
编译不安全模式的 in.cs:
csc /unsafe in.cs
class UnsafeTest { // Unsafe method: takes pointer to int: unsafe static void SquarePtrParam(int* p) { *p *= *p; } unsafe static void Main() { int i = 5; // Unsafe method: uses address-of operator (&): SquarePtrParam(&i); Console.WriteLine(i); } } // Output: 25