一、c#的值类型和引用类型

    1、值类型有:结构体(数值类型,如int之类;bool型,用户定义的结构体),枚举类型,可控类型。值类型存在栈上。

    2、引用类型:数组,用户定义的类,接口,委托,object,字符串。引用类型存在堆上。

(内存块分为栈,堆,静态存储区)

    3、几点说明:

        (1)结构体中即使包含了引用类型的成员,也依然是值类型。

        (2)数组的元素,不管是引用类型的还是值类型的,都存在托管堆上。

        (3)值类型总是分配在申明它的地方,作为字段时,跟随其所属的变量(实例)存储,作为局部变量时存储在栈上。

        (4)值类型在内存管理上具有更好的效率,并且不支持多态,适合做存储内型载体;引用类型支持多态,适合用于定义应用程序的行为。

二、c#类的访问控制:

    public ,protect ,private ,internal,protect internal
    public 公共的,任何其他的对象都能访问,子类继承了,其他对象子类该属性的访问性由子类的访问性决定
    protect 受保护的,子类能继承,其他类不能直接访问
    private,子类继承了,但是子类里面是不可访问的,其他对象也不能访问
    internal,是说在同一个程序集中可以访问
    protect internal同一个程序集内部的子类可以继承,其他类不能访问

系统默认是私有的。

 

三、类的字段,方法,和属性

类是面向对象编程的基本单位,类的成员包括事件、字段、嵌套类型、方法和属性作为初学者,我们首先得了解类的成员中的字段,方法和属性。

1、类的字段。类的字段准确地说应该是类的数据成员,其定义是:用于存储类和类的实例相关数据的变量

2、类的方法。方法也称行为,是类的函数成员,是一个为实现类的某一个特定功能的函数。

3、类的属性。所谓“属性”,很大程度可以看作是对“字段”的一种封装,它利用一种被称为“get/set访问器”分别控制对字段的读写操作,并暴露一个属性值

下面我们举一个例子来说明属性的作用。

Class Student

{

 //数据成员或者字段的定义
    public string name ;

private string accnumber;//这里,我们本来把学生的帐号定义为私有     

                         //的,是不能被继承和访问的。

//属性的定义
    public string Accnumber

{                     

    Get                  

{                    

return name;      

Set                   

{

accnumber = value;

}

  }

...

        //这里,我们利用属性,通过get访问器,外界就可以读到accumber的值;通过set访问器,我们就可以给accumber赋新值。在子类和其他类中我们可以把Accnumber看作是accnumber的替身,如: Student std = std.Accnumber = s001”,我们就成功的给accnumber赋了值“s001”。

当然属性里不是get和set都要用的,当我只要读accnumber的值而不要改变其值的时候,只要用get访问器就可以了。以后我们会介绍readonly访问修饰符,它控制变量只能被读而不能被写。

 

上面这个例子中,get就是取值,set就是设值。在set里,我们还可以加一些限制、选择条件什么的,比如if(value.Length==4){accnumber = value};

        字段是一个用于存储数据的变量,属性是一个方法或者说是一个函数成员。那么既然属性是一个方法,那么他和方法的区别是什么呢?从定义就可以看出来,属性其实本身就是方法。但既然把属性和方法定义成为两个概念,那么他们之间肯定有不同地地方。个人感觉,他们最大的区别首先是属性没有参数列表,而方法必须要有参数列表,哪怕没有参数,也要放一个空括号在那。其次,属性定义里要有set和get两个访问器,用于获得属性的值和设定属性的值其余的地方没有发现不同之处,属性里也可以判定数据的合法性,和方法没有什么两样。