C#基础之自定义类型

一.命名空间

1.命名空间是文件夹,类是文件

例如

namespaceOuter.Middle.Inner

{

classClass1 {}

classClass2 {}

 }

命名空间中的点表示嵌套命名空间的层次结构

所以上面的代码可以表示为下面的形式

namespaceOuter {

    namespaceMiddle {

        namespaceInner {

            classClass1 {}

            classClass2 {}

            }

      }

}


2.using指令

using指令导入一个命名空间

例如

using Outer.Middle.Inner;


classTest {

    staticvoidMain(){

        Class1 c; // Don"t need fully qualified name

    }

}


3.名称作用域

在外部命名空间中声明的名称可以在内部命名空间内使用不合格。

在此示例中,名称Middle和Class1被隐式导入Inner:

namespaceOuter

    namespaceMiddle {

        classClass1 {}

        namespaceInner

            classClass2 : Class1 {} 

        }

    }


要引用命名空间层次结构的不同分支中的类型,请使用部分限定名称。

在下面的示例中,我们基于Common.MyBaseMyClass

namespace Outer { 

    namespace Common {

        class MyBase {} 

    } 

    namespace MyNamespace {

        class MyClass : Common.MyBase {} 

    }


4.名称隐藏

如果同一类型名称出现在内部和外部命名空间中,则内部名称将胜出。

要引用外部命名空间中的类型,必须限定其名称。

例如

namespaceOuter {

    classmyMethod { }

    namespaceInner {

        classmyMethod { }

        classTest {

            myMethod f1; // = Outer.Inner.myMethod

            Outer.myMethod f2;// = Outer.myMethod

        }

    }

}


5.重复命名空间

你可以重复命名空间声明,只要命名空间中的类型名称不冲突

例如

namespaceOuter.Middle.Inner {

    classClass1 {}

}

namespaceOuter.Middle.Inner {

    classClass2 {}

}


6.嵌套使用指令

我们可以在命名空间中嵌套一个using指令。

在以下示例中,Class1在一个作用域中可见,但在另一个作用域中不可见

namespace Outer {

    classClass1 {}

}

namespaceN2 {

    using Outer;

    classClass2 : Class1 {}

}

namespaceN2 {

     classClass3 : Class1 {} // Compile-time error

}


7.别名类型和命名空间

导入命名空间可能导致类型名冲突。

我们可以只导入你需要的特定类型,给每个类型一个别名。

例如

using PropertyInfo2 = System.Reflection.PropertyInfo;

classProgram { PropertyInfo2 p; }


整个命名空间可以进行别名,例如

using R = System.Reflection;

classProgram {

R.PropertyInfo p;

}


二.类

1.类是最常见的类型的引用类型。

最简单的类声明如下:

classYourClassName

在关键字类之前,我们可以向类添加属性和类修饰符。

非嵌套类修饰符是public,internal,abstract,sealed,static,unsafe和partial。

遵循YourClassName,我们可以添加通用类型参数,基类和接口。

在大括号类成员中,我们可以定义方法,属性,索引器,事件,字段,构造函数,重载运算符,嵌套类型和终结器。


三.构造函数

1.实例构造函数

构造函数在类或结构体上运行初始化代码

构造函数被定义为一个方法

构造函数具有与类型相同的名称,并且没有返回类型

例如

publicclassPerson {

    string name;// Define field

    publicPerson (stringn){ // Define constructor

        name = n; // Initialization code

    }

}

...

Person p = new Person ("CSS");// Call constructor


实例构造函数允许以下修饰符



2.重载构造函数

类或结构可能重载构造函数。

为了避免代码重复,一个构造函数可以使用this关键字调用另一个构造函数:


当一个构造函数调用另一个时,被调用的构造函数首先执行。

我们可以将表达式传递给另一个构造函数,如下所示



3.隐式无参构造函数

对于类,当且仅当我们没有定义任何构造函数时,C#编译器自动生成一个无参数的公共构造函数。

对于结构体,无参数构造函数是struct的固有的;因此,我们不能定义我们自己的。


4.构造函数和字段初始化顺序

我们之前看到字段可以在它们的声明中用默认值初始化,例如


字段初始化发生在执行构造函数之前,并且在字段的声明顺序中。


5.非公共构造函数

构造函数不需要公开。

有一个非公共构造函数的常见原因是通过静态方法调用来控制实例创建。



6.静态构造函数

静态构造函数对每个类型执行一次,而不是每个实例执行一次。

类型只能定义一个静态构造函数,它必须是无参数的,并且具有与类型相同的名称:


运行时在所使用的类型之前自动调用静态构造函数。

有两件事情触发了:

·实例化类型

·访问类型中的静态成员

静态构造函数允许的唯一修饰符是unsafe和extern。

静态字段初始化器在调用静态构造函数之前运行。





版权声明:本文为Stephanie_0903原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。