一,类的声明和实例化
类的声明是通过关键字 class 来完成的。
而实例化则是通过 new 来完成的。
class A
{
}
static main()
{
A a = new A();
}
二,实例字段,实例方法和访问修饰符
实例字段:在类的级别上声明的变量,用于存储与对象关联的数据。
实例方法:在类的级别上声明的方法,可以控制类的行为,访问类的实例字段等。
访问修饰符:用于将类的信息隐藏起来,提供访问控制,主要包括 public,private,protected,internal和protected internal。
如果类的成员不添加访问修饰符默认为 private。
public:指定可以从外部访问的类的成员,是公共的,不受限的访问。
private:被private修饰的成员只能在类的内部进行访问,不能从外部访问。
protected:被修饰的成员能被类的派生类进行访问,但无法从外部进行访问。
internal:只有在同一程序集的文件中,内部类型或成员才是可访问的。简单的说就是当前项目中可以访问。
程序集:(来自微软) 程序集是任何 .NET Framework 应用程序的基本构造块。例如,在生成简单的 C# 应用程序时,
Visual Studio 创建一个单个可移植可执行 (PE) 文件形式的程序集,明确地说就是一个 EXE 或 DLL。
protected internal:被修饰的成员,可以被其他的程序集中的派生类中使用。
三,属性
为了提高可编程性,C#提供了一种新的语法:属性。
一个简单的例子来说明属性存在的意义。
例如:在一个C++的程序中,程序会提供 两个 private成员变量访问的方法。
Class A
{
private string m_name;
public string getName()
{ return m_name; };
public void setName(string name)
{ m_name = name; };
}
int main()
{
A a;
a.setName("hello");
cout << a.getName() << endl;
}
在来看看 C#使用属性的程序,区别一目了然。
Class A
{
private string m_name;
public string Name
{
get{return m_name;};
set{m_name = value;};
}
}
int main()
{
A a;
a.Name = "hello";
cout << a.Name << endl;
}
属性的关键特点在于: 它提供了一个从编程角度看类似于字段的API。
其中 get,set,和value是他的关键字。
属性和方法调用是不允许作为 ref 和 out 参数使用的。
因为属性有时候是只读的,有时候使用的是没有实际字段支持的虚字段,无法给ref 和 out 提供一个有效的地址。
C#的属性为程序员提供了更好的可编程的特性,但实质上它只是隐藏了人定义getName 和 setName的过程,从人定义变成了
有机器进行转换。
在 CIL的代码中我们还是可以找到get_Name() 和 set_Name() 的函数形式。
四,构造器和终结器
在类创建时指定我们所需要的数据,构造器正是提供了我们想要的功能。
构造器是一个函数,与类的名字相同,没有返回值。如果没有给类显示的添加一个构造函数,系统会自动添加一没有任何参数的默认构造函数。
构造器定义了一个类在实例化过程中发生的事情。
new 操作符从内存管理器中取得内存,然后调用类的构造器,将初始化好的内存传递给构造器。接着构造器会执行剩余的部分。
构造器是可以被重载的:
Class A
{
public A()
{}
public A(string name)
{
m_name = name;
}
private string m_name;
private int m_id;
public string Name
{
get{return m_name;};
set{m_name = value;};
}
}
构造器也可以调用另一个构造器,语法如下:
Class A
{
public A()
{}
public A(string name)
{
m_name = name;
}
public A(int id, string name) : this(name)
{
m_id = id;
}
private string m_name;
private int m_id;
public string Name
{
get{return m_name;};
set{m_name = value;};
}
}
终结器与构造器相反,定义了对象在销毁时需要做的操作。
与构造器相反,终结器不是在一个对象消失之后马上运行的。终结器是在对象最后一次运行之后,在程序结束之前运行的。
垃圾回收器会在一次垃圾回收过程中识别出带有终结器的对象,之后并不是马上回收他们,而是把他们添加到一个队列中。
一个线程会遍历队列中的每一个对象,并且调用他们的回收器,再把他们从队列中删除。
五,特殊类
嵌套类:一个类中除了定义方法外还可以定义另一个类。原则是这两个类在逻辑上关系存在着嵌套的关系。
Class A
{
public A()
{}
public A(string name)
{
m_name = name;
}
public A(int id, string name) : this(name)
{
m_id = id;
}
private string m_name;
private int m_id;
public string Name
{
get{return m_name;};
set{m_name = value;};
}
private class Aa
{
public Aa(){};
private int m_nid;
}
}
分部类:分部类是一个类的多个部分,把它们合起来就是一个完整的类。使用关键字:partial
使用部分类的目的就是将一个类的定义划分到多个文件中。
部分类对于代码生成或修改工具意义重大,这样可以使人正在编码的文件和工具操作的文件相互独立开。
test_part_1.cs
partial class Test
{
}
test_part_2.cs
partial class Test
{
}
他们可以被合并成一个完整的类。