当这些方法声明为 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
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




