文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>《C#本质论》读书笔记(十二)构造器 @ Lennon

《C#本质论》读书笔记(十二)构造器 @ Lennon

时间:2010-08-20  来源:张抗

在C#里,很多人可能对属性这个概念很熟悉,平时属性是最常用到的.而我们很少会去用到构造器.而且很多人对构造器的一些概念还不是很熟悉,也有人认为属性等同于构造器.今天在这里谈谈构造器的声明.构造器重载.默认构造器.构造器与属性的区别等..

 

构造器的声明

 

    class Employee
{
public Employee(string firstName, string lastName)
{
FirstName
= firstName;
LastName
= lastName;
}
public string FirstName { get;set;}
public string LastName { get; set;}
public string Salary { get;set;}
}

 

 

         为了定义构造器,要创建一个没有返回类型的方法,而且方法名必须完全和类名相同。

         构造器是用来创建对象实例的方法。在这个例子中,构造器获取员工的名字和姓氏作为参数,允许程序员在实例化Employee对象的时候指定这些参数的值。

 

调用构造器

 

    class Program
{
static void Main()
{
Employee employee;
employee
= new Employee("Inigo","Montoya");
employee.Salary
= "Too Little";
System.Console.WriteLine(
"{0}{1}:{2}",
employee.FirstName, employee.LastName, employee.Salary);
}
}

      构造器返回的是被实例化的对象的类型(虽然在构造器的声明或实现中没有显式地指定返回类型或使用返回语句)。此外,我们已经移除了名字和姓氏的初始化代码,因为现在是在构造器内部进行初始化。

      开发者应注意到既在声明中又在构造器内部进行赋值的情况。假如一个字段在声明时被赋值,那么只有在这个赋值发生之后,构造器内部的赋值才会发生。所以,最终生效的是构造器内部的赋值,它会覆盖声明时的任何赋值。这可能会使一个粗心的人误以为在一个对象实例化之后,字段的值是在声明时赋予的。所以,有必要考虑一种编码风格,避免在同一个类中,既有声明时赋值,又在构造器中赋值。

 

默认构造器

      一旦显式地添加了构造器,那么在Main()中实例化一个Employee时,就必须指定参数的值。

      假如一个类没有显示地定义任何构造器,C#编译器会在编译时自动添加一个。这个构造器不获取参数,所以按照定义来说,它是默认构造器。而一旦为一个类显式添加了一个构造器,C#编译器就不再自动提供默认构造器。因此,在定义了Employee(string firstName,string lastName)之后,编译器不在添加默认构造器employee()。虽然可以显式地添加这样的一个构造器,但这样一来,就会再次允许构造一个没有指定员工姓名的employee对象。

 

对象初始化器

        C#3.0新特性中增加了一个名为“对象初始化器”的特性。它能初始化一个对象中的所有允许访问的字段和属性。具体地说,在创建对象的构造器调用之后,你现在可以增加一对大括号,并在其中添加一个成员初始化列表。每个成员的初始化操作都是一个赋值操作,等号左边是一个允许访问的字段属性,右边则是具体要赋的值。

 

    class Program
{
static void Main()
{
Employee employee
= new Employee("Inigo","Montoya")
{
Title
= "Computer Nerd",Salary = "Not enough"
};
}
}

 

 

        在使用一个对象初始化器的时候,要遵守相同的构造器规则。事实上,这只是一项语法上的改进,最终生成CIL代码和用单独的语句对字段及属性进行赋值无异。在C#语言中,成员初始化器的顺序,决定了在CIL代码的构造器调用之后的语句中,对属性和字段进行赋值的顺序。

 

集合初始化器

       采用和对象初始化器相似的语法,集合初始化器能简化集合的创建。具体地说,使用集合初始化器,可以在集合实例化期间为集合内部的项赋值。借鉴数组的语法,集合初始化器会初始化集合中的每一项。例如,为了初始化一个Employee列表,需要在构造器调用之后添加一对大括号,并在大括号内部指定每一项。

 

    class Program
{
static void Main()
{
List
<Employee> employee = new List<Employee>()
{
new Employee("Inigo","Montoya"),
new Employee("Chuck","McAtee")
};
}
}

 

 

          如果像这样为一个新的集合实例赋值,编译器生成的代码会按顺序实例化每个对象,并通过Add()方法把它们添加到集合中。

 

终结器

      构造器定义了一个类在实例化过程中发生的事情。为了定义对象在销毁过程中发生的事情,C#提供了终结器构造。与C++的析构器不同,终结器不是在对一个对象的所有引用都消失之后就马上运行。相反,终结器是在一个对象最后一次活动之后,并在程序终止之前执行。具体地说,垃圾回收器会在一次垃圾回收过程中识别出带有终结器的对象。之后,它并不是立即回收这些对象,而是将它们添加到一个终结队列中。一个独立的线程遍历终结队列中的每一个对象,调用它们的终结器,然后把它们从队列中删除,使它们再次可供垃圾回收器使用。

 

构造器的重载

      构造器是可以重载的--可以同时存在多个构造器,只要参数的数量和类型有所区别。

 

    class Employee
{
public Employee(string firstName, string lastName)
{
FirstName
= firstName;
LastName
= lastName;
}
public Employee(int id, string firstNmae, string lastName)
{
Id
= id;
FirstName
= firstName;
LastName
= lastName;
}
public Employee(int id)
{
Id
= id;
}
public int Id{get;set;}
public string FirstName { get;set;}
public string LastName { get;set;}
public string Salary { get;set;}
}

 

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载