手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>Java技术>列表

Visual Studio:针对 Java 开发人员的 C# 编程语言

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

当这些方法声明为 static 时,如果您运行此程序,您就会得到同前面一样的输出。

委托和事件

.NET 框架也将委托广泛应用于事件处理任务(像 Windows 或 Web 应用程序中的按钮单击事件)。虽然在 Java 中事件处理通常通过实现自定义侦听器类来完成,但是 C# 开发人员可以利用委托来进行事件处理。事件被声明为带有委托类型的字段,只是在事件声明前面加上 event 关键字。通常,事件被声明为公共的,但是任何可访问性修饰符都是允许的。下面的代码显示了委托和事件的声明。

public delegate void CustomEventHandler(object sender, EventArgs e);

public event CustomEventHandler CustomEvent;

事件委托是多路广播的,这意味着它们可以具有对多个事件处理方法的引用。通过维护事件的注册事件处理程序列表,委托可以担当引发事件的类的事件发送程序。下面的示例向您展示了可以如何给多个函数预订事件。类 EventClass 包含委托、事件和调用事件的方法。注意,只能从声明事件的类中调用事件。然后,类 TestClass 就可以使用 =/-= 运算符来预订/取消预订事件。当调用 InvokeEvent() 方法时,它会激发此事件,而已经预订此事件的任何函数都会同步激发,如下面的代码所示:

using System;



class TestClass

{

  static void Main(string[] args)

  {

    EventClass myEventClass = new EventClass();

    // Associate the handler with the events

    myEventClass.CustomEvent  = new EventClass.CustomEventHandler(CustomEvent1); 

    myEventClass.CustomEvent  = new EventClass.CustomEventHandler(CustomEvent2); 

    myEventClass.InvokeEvent();

    myEventClass.CustomEvent -= new EventClass.CustomEventHandler(CustomEvent2);

    myEventClass.InvokeEvent();

  }



  private static void CustomEvent1(object sender, EventArgs e)

  {

    Console.WriteLine("Fire Event 1");

  }



  private static void CustomEvent2(object sender, EventArgs e)

  {

    Console.WriteLine("Fire Event 2");

  }

}



public class EventClass

{

  public delegate void CustomEventHandler(object sender, EventArgs e);



  //Declare the event using the delegate datatype

  public event CustomEventHandler CustomEvent;

 

  public void InvokeEvent()

  {

    CustomEvent(this, EventArgs.Empty);

  }

}

此程序的输出如下:

Fire Event 1

Fire Event 2

Fire Event 1

返回页首

垃圾回收

在 C 和 C 中,许多对象一旦声明,就需要编程人员在对象可以安全使用之前给它们分配资源。在对象使用完资源之后,将这些资源释放回自由内存池也是编程人员的责任。如果资源没有释放,当越来越多的资源被不必要地消耗时,就可以说代码泄漏内存。而在另一方面,如果资源过早地释放,则可能会发生数据丢失、其他内存区域破坏和 null 指针异常。

为了防止这些危险的发生,Java 和 C# 都通过一个应用程序来独立地管理所有对象的生命周期。

在 Java 中,JVM 通过跟踪所分配资源的引用来处理未使用的内存的释放。只要 JVM 检测到一个资源不再被一个有效的引用加以引用,该资源就会被当作垃圾回收。

在 C# 中,通过具有与 JVM 类似功能的公共语言运行库 (CLR) 来处理垃圾回收。CLR 垃圾回收器周期性检查内存堆,以查看是否有未引用的对象,并释放这些对象所占用的资源。有关垃圾回收的更多信息,请参见 Garbage Collection:Automatic Memory Management in the Microsoft .NET Framework, 和 Garbage Collection—Part 2: Automatic Memory Management in the Microsoft .NET Framework。

返回页首

安全代码和不安全代码

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

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!