论坛首页 编程语言技术论坛

C# 语法书 <3> 静态类,别名等等

浏览 3735 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-06-30  
最近比较忙,所以先跳过第二章委托,先介绍一些林林总总的小更新。

静态类

适用范围: C# 2.0以以后版本

在C# 2.0之前的版本里,你是无法将一个类声明成静态的。如果我们希望一个类是静态的,也就是希望强制要求这个类中的所有成员都应该为静态的,就无能为力了,唯一能做的就是自己注意将所有的成员声明为static。

当我们忘记对一个本应是静态的成员使用static修饰符(尽管这是一个“低级错误”,但仍有可能发生)时,将会产生难以预料的错误。最重要的是,对于一个逻辑上的静态类(所有成员均使用static修饰符进行声明的类),我们甚至可以声明该类的一个变量并使用new操作符产生该类的实例!这显然不是我们所期望的。


在C#2.0中,则提供了静态类这一概念,允许static修饰符对类进行修饰。如果一个类声明中包含了static修饰符,那么这个类中的所有成员将被强制要求声明为静态的。这时,如果我们故意在类中声明实例成员或是不小心忘记了成员声明中的static修饰符,则编译器会报告错误:

error CS0708: '<some field>': cannot declare instance members in a static class

同时,如果我们声明该类的变量或是试图建立该类的一个实例时,如下面的代码:
则会得到下面的两个编译错误:
error CS0723: Cannot declare variable of static type '<some class>'
error CS0712: Cannot create an instance of the static class '<some class>'


名称空间别名

在C#中,通过使用using指令,我们可以向编译器指定一系列命名空间,当程序中出现了类名字时,编译器会自动到这些命名空间中查找这个类。

但是两个命名空间中很可能具有同名的类,而我们恰好需要用到这些同名的类。这种情况会经常发生。

譬如在.net框架类库中就存在有三个Timer类:System.Timer.Timer、System.Threading.Timer和System.Windows.Forms.Timer。

这时,尽管我们使用了using指令,我们仍然需要在这些类出现时加上名称空间:

using System.Timer;
using System.Windows.Forms;
// ......
public class MainForm : Form {
    System.Timer.Timer CheckTimer;
    System.Windows.Forms.Timer AnimateTimer;
    // ......
}


在C#2.0中,我们可以使用using指令来为名称空间指定一个别名。当我们需要引用这个命名空间时,可以简单地使用它的别名。

为命名空间创建一个别名时,我们使用using指令的扩展用法:using Alias = Namespace,即可为命名空间Namespace指定一个别名Alias。

当我们引用一个名称空间中的类型的时候,只需要在命名空间后面加一个圆点“.”再跟上类型名称即可:

using SysTimer = System.Timer;
using WinForm = System.Windows.Forms;
// ......
public class MainForm : WinForm.Form {
    SysTimer.Timer CheckTimer; // 与命名空间的使用完全相同
    WinForm.Timer AnimateTimer;
    // ......
}


论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics