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

在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;}
}

 

转载于:https://www.cnblogs.com/aipeiyi/archive/2010/08/20/1804628.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/435481.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

a byte of python中文版_面试官问 Python 版 “垃圾回收”机制,我没答上来

点击“开发者技术前线”&#xff0c;选择“星标?”13&#xff1a;21 在看|星标|留言, 真爱选自《萌萌哒的柯基》 作者&#xff1a;heroyfhttps://www.heroyf.club/2019/10/23/python_gc/前言对于python来说&#xff0c;一切皆为对象&#xff0c;所有的变量赋值都遵循着对象引…

漫谈 Linux,Windows 和 Mac

好了&#xff0c;现在来一点技术性的。这段时间收到很多人的来信&#xff08;大部分自称是菜鸟&#xff09;。他们看了我很早以前写的推崇 Linux 的文章&#xff0c;想知道如何“抛弃 Windows&#xff0c;学习 Linux”。天知道他们在哪里找到那么老的文章&#xff0c;真是好事不…

AspNet2.0页面生命周期

AspNet2.0页面生命周期 页面框架通过如下过程处理aspx文件请求: 1&#xff1a;解析aspx文件,并创建一个控件树&#xff1b; 2&#xff1a;使用控件树动态实现一个继承自Page类的类或者控件 &#xff1b; 3&#xff1a;动态编译类&#xff1b; 4&#xff1a;缓存编…

数字时钟设计verilog_数字IC设计基本概念之创建时钟

来自微信公众号 “数字芯片实验室”时序分析的一个重要部分是准确地指定时钟和相关属性&#xff0c;例如延迟&#xff08;latency&#xff09;和不确定性&#xff08;uncertainty&#xff09;。 EDA工具可以分析以下类型的时钟信息&#xff1a;时钟网络latency和 skew&#xff…

软件开发模式对比(瀑布、迭代、螺旋、敏捷)

1、瀑布模型是由W.W.Royce在1970年最初提出的软件开发模型&#xff0c; 瀑布式开发是一种老旧的计算机软件开发方法。 瀑布模型式是最典型的预见性的方法&#xff0c;严格遵循预先计划的需求分析、设计、编码、集成、测试、维护的步骤顺序进行。 步骤成果作为衡量进度的方法&a…

photoshop script

http://www.adobe.com/devnet/photoshop/scripting/转载于:https://www.cnblogs.com/275095923/archive/2010/08/23/1806871.html

敏捷开发流程的8个步骤_敏捷开发——个体和互动高于流程和工具

敏捷开发是软件公司主流的项目管理方法&#xff0c;敏捷方法论有许多种&#xff0c;包括Scrum、极限编程(XP)以及精益(Lean)方法&#xff0c;但是它们都具有一个共同点&#xff1a;遵循敏捷宣言和敏捷原则。透明性。每一个敏捷项目成员都知道即将做什么以及项目进展如何。经常性…

瀑布开发

提到“瀑布开发”的时候&#xff0c;大部分人们可能会联想到尼亚加拉瀑布下要进行房地产开发&#xff0c;然后&#xff0c;设想一下&#xff0c;当您告诉他们实际上瀑布开发是一种包含多个阶段的反复叠代的软件开发模型时&#xff0c;他们会多么惊讶。这篇文章将为您提供一份关…

ArcGis Desktop10 注册机授权方法与安装步骤

今天&#xff0c;由于需要处理一些空间数据&#xff0c;安装ArcGIS Desktop10&#xff0c;所以就把注册机的授权方法与安装过程&#xff0c;写成Blog与大家一起分享&#xff01; 第一步&#xff1a;安装 ArcGIS许可管理器。如图所示&#xff1a; 第二步&#xff1a;打开注册机&…

【转】在C#中使用SQLite

SQLite 是一个嵌入式的关系数据库系统&#xff0c;使用十分广泛。在一些数据量不大的应用程序中&#xff0c;如果使用SQLite可以极大的减少部署时的工作量。 要在C#中使用SQLite也很简单&#xff0c;只要找一个C#的wrapper就可以了&#xff0c;例如&#xff0c;我使用的就是来自…

软件开发模式有哪些

软件开发模式有哪些? 快速原型模型&#xff1a;&#xff08;需要迅速造一个可以运行的软件原型&#xff0c;以便理解和澄清问题&#xff09; 快速原型模型允许在需求分析阶段对软件的需求进行初步的非完全的分析和定义&#xff0c;快速设计开发出软件系统的原型&#xff08;…

利用ArcGIS将经纬度数据转化成平面坐标数据

经度是指某点与两极的连线与0度经线所在平面的夹角&#xff0c;国际上规定以通过英国伦敦近郊的格林尼治天文台旧址的经线作为计算经度的起点&#xff0c;即经度零度零分零秒&#xff0c;也称“本初子午线”。它东面的为东经&#xff0c;记为E&#xff0c;共180度&#xff0c;西…

电脑连接电视方法详解_笔记本连接电视方法有哪些?分享两种笔记本连接电视方法...

在如今这个快节奏的时代中,大多数年轻人的手中都会有个笔记本电脑,并且将笔记本电脑作为休闲娱乐或办公的一种设备。相比于电视屏幕尺寸,笔记本电脑的屏幕还真是小了很多。为了提高视觉上的体验,很多小伙伴会选择笔记本连接电视的方式,将笔记本中的内容转换到电视屏幕上。下面我…

美国团购网站Groupon的盈利模式

GroupOn 一种模式&#xff0c;一个奇迹。用户每天疯狂在网站上抢购推出的餐饮、SPA、运动、游戏这样的商品或服务机会。 很难相信&#xff0c;这个网站在2008年11月份上线&#xff0c;在7个月后就实现了盈亏平衡&#xff0c;利润更是高达了30%以上。据报道&#xff0c;2010年销…

完整的连接器设计手册_减速齿轮箱的设计 用一整套完整流程来说明(附PDF手册)...

减速箱减速齿轮箱设计手册获取见文章末尾图片在通用的产品设计中&#xff0c;齿轮减速箱的设计是最简单成熟的一种设计&#xff0c;因为设计流程十分清晰&#xff0c;这已经是一种很成熟的产品了&#xff0c;下面我就来说一说如何做减速齿轮箱的设计&#xff0c;以及设计的一般…

WAMP Server 无法启动的解决方法

今天安装WAMP Server用来发布PHPMySQL做的网站&#xff0c;安装之后发现Apache服务无法启动&#xff0c;尝试用如下的方法进行解决。 首先利用WAMP自带的 Apache->Service->Test Port 80 功能&#xff0c;检测80端口是否被其他软件占用。 检测结果显示&#xff1a; You…

在 WinCe 平台读写 ini 文件

在上篇文章开发 windows mobile 上的今日插件时&#xff0c;我发现 wince 平台上不支持例如 GetPrivateProfileString 等相关 API 函数。在网络上我并没有找到令我满意的相应代码&#xff0c;因此我手工自己写了相应的方法。命名规则是&#xff0c;在 PC API 函数的名称前面加上…

SQL Server 兼容模式

近期一个老系统改用SQL Server 2005数据库, 从原来的2000改为2005, 默认情况下启动出错&#xff1a; Incorrect syntax near Index. If this is intended as a part of a table hint, A WITH keyword and parenthesis are now required. SQL 语句中的table hint 中缺少with 关键…

孩子学python用什么教材比较好-python大学里用哪本教材比较好?

看这本 英文好的话&#xff0c;不需要买书&#xff0c;看该书的英文电子版&#xff0c;免费的。 《How to Think Like a Computer Scientist- Learning with Python 3》 下载地址&#xff1a;https://github.com/pythonpeixun/article/blob/master/books/How%20to%20Think%20Li…

通过VisualSVN的POST-COMMIT钩子自动部署代码

这段时间我们一直规划LSGO Group的学习网络平台&#xff0c;需求部分已经规划完毕&#xff0c;说做就做&#xff0c;开始搭建环境&#xff0c;由于利用PHPMYSQL技术&#xff0c;在服务器端首先安装了WAMPServer&#xff0c;以便提供Apache服务与MYSQL服务&#xff01; 在代码的…