(4)类

来源:互联网 发布:简述数据和信息的区别 编辑:程序博客网 时间:2024/05/18 01:43


*面向对象的特征:封装(访问修饰符)、继承、多态(方法)。

*要用new运算符指示“运行时”为一个类的对象分配内存、实例化对象,并返回对实例化对象的引用。

*垃圾回收器(garage collector):“运行时”会在最后一次访问对象之后,并在应用程序结束之前的某个时候,自动回收内存。

**this:在C#中,为了显示的指出当前访问的字段或方法是包容类的一个实例成员,可以使用关键字this。this在概念上是传给每个实例方法的一个隐式参数,它返回对象本身的一个实例。

1.在类中可以显示的指示字段、方法。

2.使用this来传递当前正在执行的对象的一个引用。

class Employee{    public string FirstName;    public string LastName;    public string Salary;    public void Save()    {     dataStorage.Store(this);    }
}                                                                                                                                  
class DataStorage{  public static void Store(Employee employee){//……}}

 3.将数据持久化存储到一个文件中。

 class DataStorage        {            public static void Store(Employee employee)            {                FileStream stream = new FileStream(employee.FirstName+employee.LastName+".dat",FileMode.Create);                StreamWriter writer = new StreamWriter(stream);                writer.WriteLine(employee.FirstName);                writer.WriteLine(employee.LastName);                writer.WriteLine(employee.Salary);                writer.Close();            }        }

*访问修饰符:public, private, protected, internal,protected internal

 

**属性  与字段类似,直接在属性名后面加{},涉及到的关键字包括 get ;set; value; 

class Employee        {            public string FirstName                       //对Employee employee=new Employe();employee.FirstName="Inigo",对属性    //直接赋值。            {                get                {                    return _FirstName;                }                set                {                    _FirstName=value;                }                }            private string _FirstName;            private String _LastName            {                get                {                    return _LastName;                }                set                {                    _LastName = value;                }                }            private string LastName;            public string Title { get; set; }             //c#3.0以后属性的简化版本              public Employee manage { get; set; }        }

*提供属性验证

 public string FirstName                       //对属性进行验证                                                                  {                get                {                    return _FirstName;                }                set                {                    if (value == null)                    {                        throw new ArgumentNullException();                    }                    else                    {                        value = value.Trim();                        if (value == "")                        {                            throw new ArgumentException("First Name can not be blank.");                        }                        else                        {                            _FirstName = value;                        }                    }                    _FirstName=value;                }     }            private string _FirstName;


*只读和只写属性:只提供属性的get方法,则只读;只提供set方法,则只写。

*为get 、set指定访问修饰符:c#2.0中,在属性的一个实现中,可以为get或set部分指定访问修饰符(但不能为两着同时提供修饰符),从而覆盖为属性声明指定的访问修饰符。并且,这个访问修饰符的“限制性”必须比用于整个属性的访问性更加严格。(比如 外面是public ,里面的get是private,相同也不行)。

public void initialize(int id)            {                _Id=id.ToString();            }            public string id            {                 get                 {                    return id;                }                private  set                 {                    _Id = value;                }            }            private string _Id;

*属性和方法调用不允许作为ref 或out 参数值使用。

*构造器 没有返回值,与类同名

**对象初始化器(object initializer):能初始化一个对象中所有允许访问的字段和属性。在创建对象的构造器调用之后,增加一个大括号,并在其中添加成员初始化列表。每个成员的初始化都做都是赋值操作。

例如:Employee employee1=new Employee("Inigo","Montoya"){Title ="Computer Nerd",Salart="not enough"};

*集合初始化器

List<Employee> employees = new List<Employee>

{

new Employee("Inigo","Montoya");

new Employee("chuck","McAtee");

};

*终结器(finalizer):在一个对象最后一次活动之后,程序结束之前执行。(无实例)

*使用this调用另一个构造器

class Employee        {            public Employee(string  firstName,string lastName)            {                FirstName = firstName;                LastName = lastName;            }            public Employee(int id, string firstName, string lastName)                : this(firstName, lastName)            {                initialize(id);            }         ……}


**编程小技巧:有多个构造器的时候,应该提供一个方法来集中初始化。

*匿名类型:(之前(1)中提到过的)(静态类型)

var varName=

new

{//……

}

*静态成员(static):共享内存

静态字段:为了定义能有多个实例共享的数据,需要使用static关键字。

静态字段同实例字段都可以在声明的同时进行初始化。

与实例字段不同,如果不对静态字段进行初始化,则静态字段将自动获得默认值(0,null,false等),所以即使没有被显示的赋值,也可以被访问。

非静态字段从属于每一个对象,都有一个新值。静态字段不是从属于实例,而是从属于类本身,所以在类外时用类名来访问静态变量。

通常,应该将不需要访问到任何实例的方法声明为静态方法,将需要访问实例数据的方法声明为实例方法。静态字段主要存储的是对应于类的数据,而实例字段主要存储的是与对象相关联的数据。

 class Employee        {            public Employee(string  firstName,string lastName)            {                FirstName = firstName;                LastName = lastName;                Id=NextId;                NextId++;            }            public int Id {get ;set;}            public string FirstName{ get; set; }             //c#3.0以后属性的简化版本              public string LastName { get; set; }            public static int NextId;        }


*静态方法 :直接在类名之后访问,不需要实例。

静态方法不是通过一个特定的实例来引用的,所以this 关键字在静态方法中是无效的。

要在静态方法的内部直接访问一个实例字段或实例方法,必须先获得对字段或方法所从属的那个特定的实例的引用。 

*静态构造器(static constructor):静态构造器用来对类进行初始化。在类名前加static。(最好在声明的时候完成静态初始化,而不要用静态构造器)

静态构造器不是显示调用的;相反,“运行时”会在首次访问累世自动调用静态构造器。

首次访问是指:可能是访问类的一个静态方法或字段或者调用一个普通的构造器。

使用静态构造器将类中的静态数据初始化成一个特定的值,尤其是在无法通过在声明时的一次简单的赋值来获得初值的时候。

在静态构造器中的赋值优先于声明字段时进行的赋值。

*静态属性 :比公共的静态字段好,提供了一定的封装。public static int NextId{ get;set;}

*静态类:用static修饰,不包含任何实例字段或方法,无法被实例化。并且不可扩展。

***扩展方法(extension method):c#3.0  能为任何类添加实例方法(尽量不用)。

扩展方法要求:

第一个参数是要扩展或者要操作的类型。成为“被扩展的类型”。

为了制定扩展方法,要在被扩展的类型名称前面附加this修饰符。

要将方法作为一个扩展方法来使用,要用using指令导入扩展类型的命名空间或者使扩展类型和调用代码在同一个命名空间。

namespace EX02{    class Program    {        static void Main(string[] args)        {            string s = "Hello Extension Methods";            int i = s.WordCount();        }           }    public static class MyExtensions    {        public static int WordCount(this String str)        {            return str.Split(new char[] { ' ', '.', '?' },                             StringSplitOptions.RemoveEmptyEntries).Length;        }    }}

*封装数据

const:常量字段,在编译时候确定一个值,它不可以在运行时改变(pi)。自动成为静态字段,但显式声明为static,会报错。

readonly:只能用于字段(不能用于局部变量),它指出字段值只能从构造器中更改,或者直接在声明时指定。4既可以是实例字段也可以是静态字段。

                   将readonly用于数组,只会冻结数组的元素数量,数组中的元素是可写的。

*嵌套类(nested class) 

嵌套类中的this指的是嵌套类的实例,而不是包容类的实例。

要想访问包容类的实例,一个是显示传递包容类的实例,比如通过一个构造器或者方法参数。嵌套类能够访问包容类的任何成员,但是包容类不能访问嵌套类的私有成员。

使用private访问修饰符,可以限定类的作用域,防止从类的外部访问。警惕public嵌套类。

*分部类(partial class):可以在一个文件中定义两个或者更多的分部类。

//file:Program1.cs

partial class Program

{

}

//file :Program2.cs

partial class Program

{

}

*分部方法(partial method):也使用关键字partial 。分部方法必须返回void的。不能使用out,可以使用ref。