科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件针对 Java 开发人员的 C# 编程语言(25)

针对 Java 开发人员的 C# 编程语言(25)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

针对 Java 开发人员的 C# 编程语言安全代码和不安全代码

来源:MSDN 2007年11月7日

关键字: 编程语言 C# java Linux

  • 评论
  • 分享微博
  • 分享邮件

安全代码和不安全代码

C# 的一个特别值得注意的特性是它支持非类型安全代码。通常,CLR 负责监视 IL(Intermediate Language,中间语言)代码的行为,并阻止任何有问题的操作。然而,有时我们希望直接访问低级功能(例如 Win32 API 调用),只要我们负责保证这样的代码操作正确,我们就会被允许这样做。这样的代码必须放在源代码的不安全块中。

unsafe 关键字

进行低级 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 关键字来指示垃圾回收器不要移动特定的对象。

下面的代码展示了如何使用 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领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章