C# 中的声明域

C#程序通过命名空间(Namespace)来组织声明,包含类型声明和嵌套声明。类型声明用于定义类,结构,接口和委托。类型定义中可以声明的成员种类是类型声明来决定的,比如,类的声明可以包含构造方法,析构方法,静态构造方法,常量,字段,属性,方法,事件,索引,操作符等等。

一个声明就是在它所属的声明域定义了一个名称,在类中,除了重载构造方法、重载方法、重载索引、重载操作符之外,在一个声明域中声明两个或更多拥有相同名称的成员是错误的。在一个声明域中包含不同相同名称的不同种类的成员也是不可能的,比如相同名称的字段和方法。下面讨论几种声明域:

命名空间声明域

程序所包含的所有源文件中,命名空间成员声明相同的是一个单独的组合声明域。

如下所示,有两个具有全名相同的命名空间的类将放到相同的命名空间中,他们属于一个声明域。

namespace A.B
{
    public class Man
    {

    }
}

namespace A.B
{
    public class Woman
    {

    }
}

在类前指定partial是c#的一个特性,他可以将两个类进行合并

namespace A.B
{
    public partial class Man
    {

    }
}

namespace A.B
{
    public partial class Man
    {

    }
}

 

类,结构,接口声明域

每个类、接口或结构都会创建一个新的声明域,在这个声明域中可以加入成员声明、接口成员声明或结构成员声明。除了重载构造方法声明和重载静态构造方法声明,一个类或结构的成员声明不能引入与类或结构名称相同的成员,一个类、结构、接口允许方法和索引的重载。例如,方法名相同,但方法的签名不同。基类不会影响到子类的声明域,如下面代码所示:

class Female : IFuckable
    {
        public void DoFuck()
        {
            Console.WriteLine("fuck a female");
        }
    }

    class Girl : Female, IFuckable
    {
        public void DoFuck()
        {
            Console.WriteLine("fuck a girl");
        }

        public void Female()
        {

        }
    }

  

枚举声明域

每个枚举声明创建了一个新的声明域,在这个声明域中可以声明枚举的成员

局部声明域

每个块为局部变量创建了一个分立的声明域。如果这个块是构造方法或方法的主体,在形参列表中声明的参数将会引入到这个声明域中。在块中定义嵌套块,在嵌套块中不能声明与块中局部变量相同名称的变量。如下面代码所示:

方法F和G有错误,因为i已经在块中声明过了。在H和I中,由于两个i是在分立的嵌套块中声明的,所以H和I是正确的。

class A
{
    void F()
    {
        int i = 0;
        if (true)
        {
            int i = 1;  // 错误
        }
    }

    void G()
    {
        if (true)
        {
            int i = 1;  // 错误
        }

        int i = 0;
    }

    void H()
    {
        if (true)
        {
            int i = 0;
        }

        if (true)
        {
            int i = 1;
        }
    }

    void I()
    {
        for (int i = 0; i < 10; i++)
        {
            H();
        }

        for (int i = 0; i < 10; i++)
        {
            H();
        }
    }
}

 

声明顺序:

一般情况下声明的顺序并不重要,尤其对于命名空间、类、常量、方法、属性、时间、索引、操作符、构造方法、析构方法、静态构造方法来说一点关系都没有,但是在下面的几种情况中,声明顺序是非常重要的:

① 局部变量必须在它使用前被定义

② 当枚举没有指定值时,枚举成员的顺序

posted on 2016-03-28 23:08  code_play  阅读(348)  评论(0)    收藏  举报