05 C# 第五章 类

一,类的声明和实例化

类的声明是通过关键字 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

其中 getset,和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
{

}

他们可以被合并成一个完整的类。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值