扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
C# 的一个特别值得注意的特性是它支持非类型安全代码。通常,CLR 负责监视 IL(Intermediate Language,中间语言)代码的行为,并阻止任何有问题的操作。然而,有时我们希望直接访问低级功能(例如 Win32 API 调用),只要我们负责保证这样的代码操作正确,我们就会被允许这样做。这样的代码必须放在源代码的不安全块中。
进行低级 API 调用、使用指针算法、执行一些其他不安全操作的 C# 代码必须放在用 unsafe 关键字标记的块中。下面任何一种情况都可以标记为 unsafe:
一个完整的方法
一段放在括号中的代码块
一个单独的语句
下面的示例演示了上面所有三种情况中 unsafe 的使用:
using System; class UnsafeClass { unsafe static void PointyMethod() { int i=10; int *p = &i; Console.WriteLine("*p = " + *p); string address = "Pointer p = " + int.Format((int) p, "X"); Console.WriteLine(address); } static void StillPointy() { int i=10; unsafe { int *p = &i; Console.WriteLine("*p = " + *p); string address = "Pointer p = " + int.Format((int) p, "X"); Console.WriteLine(address); } } static void Main() { PointyMethod(); StillPointy(); } }
在这段代码中,整个 PointyMethod() 方法被标记为 unsafe,因为该方法声明并使用了指针。与这段代码一样,一旦某个代码块再次使用指针,StillPointy() 方法就将其标记为 unsafe。
有关不安全代码的更多信息,请参见 Unsafe at the Limit。
在安全代码中,垃圾回收器在其生命周期内可以相当自由地移动一个对象,它的任务是组织和压缩可用资源。然而,如果我们的代码使用指针,这种行为就可能很容易导致意外的结果,因此,我们可以使用 fixed 关键字来指示垃圾回收器不要移动特定的对象。
下面的代码展示了如何使用 fixed 关键字来确保在 PointyMethod() 方法中的代码块执行期间系统不会移动数组。注意,fixed 仅仅使用在不安全代码中:
public class FixedClass { public static void PointyMethod(char[] array) { unsafe { fixed (char *p = array) { for (int i=0; i<array.Length; i++) { Console.Write(*(p+i)); } } } } static void Main () { char[] array = { 'H', 'e', 'l', 'l', 'o' }; PointyMethod(array); } }查看本文来源
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者