前言

本篇我们继续讲解本章其余的部分:构造函数、只读字段、匿名类型、结构详解、部分类、静态类、Object类、扩展方法,等。

01

构造函数

构造函数是一种特殊的方法:

  1. 与类同名
  2. 没有返回值,甚至不能写void(但可以写修饰符public,private,protected)
  3. 未指定构造函数时,编译器会自动创建默认构造函数;一旦手工创建了构造函数,编译器就不会再创建默认构造函数
  4. 构造函数可重载,同方法一样
  5. 静态构造函数:构造函数加static关键字;它只执行一次,一般用于初始化静态字段或者属性;静态构造函数执行时机并不确定,因此有顺序依赖的代码不要写在静态构造函数中(比如一个程序集中有10个静态构造函数,哪个先执行并无定数,我简单测试的结果是:在访问类的静态字段/属性时,静态构造函数会被执行),其中的代码逻辑尽量保持简单和单一;静态构造函数无访问修饰符、无参数,因为没有意义;静态构造函数只能访问静态成员,不能访问实例成员
  6. 构造函数的相互调用

当我们把构造函数看成方法后,构造方法间的互调用,我们可能会认为和方法一样,比如:

TestMain(){

}

TestMain(int arg){

this();       //构造方法互调用

int a = 10;

}

但实际上,这种方法只适用于Java(且构造方法的调用必须在首行)。在.Net中,使用的是叫做“构造函数初始化器”的语法:

Test()

: base()    //调用基类的初始化器

{

}

Test(int arg)

:this(arg, 5)   //初始化器

{

arg = 10;

}

Test(int arg1, int arg2)

:this()     //初始化器

{

}

构造函数初始化器在构造函数函数体执行之前执行。this为类的多个构造函数的互调用,base为对基类的构造函数的调用。

只读字段

只读字段(readonly)是对常量的补充。

private readonly int Column5;

它的应用场景是:允许把一个字段设置为常量,但还需要执行一些计算,以确定它的初始值,这是常量无法做到的。

它的规则是:可以在构造函数中给只读字段赋值,但不能在其他地方赋值。

匿名类型

之前的章节,见过使用var关键字实现“类型推断”,var同时还应用于创建匿名类型。所谓匿名类型,是是一个继承自Object且没有名称的类。

var obj = new

{

Name = "daixf",

Age = 40

};

我们可以看到,在定义匿名类型时,需要指定属性名称和值。注意匿名类型的成员是属性而不是字段,可以想想为什么这么设计?我想,是因为遵循设计规范,属性一般是public的,而字段一般是private,两者各司其职。显然匿名类的成员需要被访问,所以应该是public,所以应该定义为属性。

但不是任何情况下,都需要指定创建的匿名类型的属性名的,如果数据来自于其他类的属性,匿名类型会默认使用相同属性名。

var obj1 = new

{

obj.Name,

obj.Age

};

因为匿名类型并没有特定的类型名,编译器为其指定了一个临时的类型名,因此在匿名类型上无法执行反射功能。

结构

上一篇已经讲过,结构和类非常像。结构的特点:

  1. 结构的定义和类类似,结构也是派生自Object,可定义字段、属性、函数
  2. 结构是值类型。因为是值类型,所以可以采用值类型的赋值方式而不采用new

  1. 限制:结构不能继承;结构默认了一个无参构造函数,且不允许显式的定义无参构造函数
  2. 和类中定义public会员采用属性不同,因为结构本来是小对象,因此多数程序员也倾向于不使用属性,而采用public字段作为成员。这似乎违反了C#通用编程规范(属性public,字段private),但它可以看作规范的例外情况。

部分类(partial)

部分类似乎离我们很远,我在践行“基于Repository框架”的时候,曾经必须用它,因为大量的类需要通过工具软件生成,而工具生成的类又有一部分功能需要手工书写,为了避免手工写的代码被工具软件覆盖,所以就采用了部分类的方式,一个类分为两个文件。但抛弃了Repository框架之后,我就再也没有主动用过部分类。

采用部分类的原因一般有以下几种:

  1. 避免代码生成工具生成的代码和手写代码的冲突,使用多个部分类代码文件
  2. 方便多个程序员协同开发,大家修改同一个类却可以锁定不同的文件
  3. 一个类的功能代码较多,使用部分类对功能进行分类,不同的功能组分布到不同的代码文件中

使用部分类的一个典型就是Winform窗体。一些初学者可能还不知道Form窗体使用了部分类。一个Form窗体就有两个cs代码文件,designer.cs就是由界面设计工具生成的:

使用部分类遵循的规则:

  1. 关键字的用法:把partial放在class,struct,interface等关键字的前面
  2. 多个部分类文件,必须定义为相同的namespace
  3. 多个部分类文件,必须使用相同的修饰符关键字,比如同为public,private

除了部分类,还有“部分方法”的概念,用途差不多,这里先不详述。

静态类(static)

是否定义类为静态类,似乎并不是那么清楚。因为一般我们声明一个静态字段/属性,或者实现一个静态方法,也不代表其所在的类必须是静态类。那么我们什么情况下认为类应该定义为静态类呢?我认为是否定义为静态类,更多的依据编程规范,而不是强制要求。

  1. 首先明确的一点是,如果类中定义了扩展方法,那么类必须定义为静态类,否则会编译错误
  2. 如果类的所有成员都是静态成员,那么此类应该声明为静态类(因为已经没有实例成员,不声明为静态类没有实际意义)
  3. 如果确定不会设计类的实例成员,那么应该声明类为静态类,因为这样编译器会进行强制检查,避免程序员不经意间定义不需要的实例成员。

Object类

所有.Net类都派生自Object类,包括结构(结构首先派生自类System.ValueType,而ValueType类又派生自Object类)。结构也派生自类,这也就好理解为什么struct的定义和class这么像了。

Object作为基类,它的一些成员是都是非常重要的,而且非常常用,简单介绍:

  1. ToString(),转字符串,常见的是基础类型转string
  2. GetHashTable(),用于散列表和字典
  3. Equals()和RefrenceEquals(),和比较运算符“==”一起,三者应用场景值得仔细比较
  4. Finalize(),类似于C++的析构函数。它和终结器,和Dispose()的关系和区别后面细讲
  5. GetType(),获取类类型,此功能往往和反射有关
  6. MemberwiseClone(),浅表复制。所谓浅表复制,是指复制类实例中,所有值类型的“值”,以及所有引用类型的“引用”。

扩展方法

扩展方法应用于:想给某个类增加方法,但却没有类的源码,或者没有对类的修改权限。此时可以使用扩展方法。扩展方法是静态类中的静态方法。对于扩展方法,第一个参数是要扩展的类型,它放在this关键字的后面。这告诉编译器,这个方法是扩展类型的一部分。在这个例子中,string是要扩展的类型。

public static bool IsNullOrEmpty(this string str)

调用:"abc".IsNullOrEmpty()

第三章到此为止就结束了,本章总体上讲了类的组成成员,以及其字段、属性、方法,和各种特性。下章将讲解《继承》。

觉得文章有意义的话,请动动手指,分享给朋友一起来共同学习进步。

欢迎关注本人微信公众号,更及时的关注最新文章(每周三篇原创文章,以及多篇专题文章):

附文:

c#静态构造函数 与 构造函数

C#部分类与部分方法​​​​​​​

上一篇:解读经典《C#高级编程》第七版 Page68-79.对象和类型.Chapter3

转载于:https://www.cnblogs.com/holyknight17/p/10256461.html

解读经典《C#高级编程》第七版 Page79-93.对象和类型.Chapter3相关推荐

  1. ASP.NET MVC 4高级编程(第4版)

    <ASP.NET MVC 4高级编程(第4版)> 基本信息 作者: (美)Jon Galloway Phil Haack Brad Wilson K. Scott Allen 译者: 孙远 ...

  2. Android 4高级编程(第3版)》

    <Android 4高级编程(第3版)> 基本信息 原书名:Professional Android 4 Application Development 作者: (英)Reto Meier ...

  3. Android 4高级编程(第3版)

    <Android 4高级编程(第3版)> 基本信息 原书名:Professional Android 4 Application Development 作者: (英)Reto Meier ...

  4. 《UNIX环境高级编程(第3版)》

    <UNIX环境高级编程(第3版)> 基本信息 原书名:Advanced Programming in the UNIX Environment (3rd Edition) (Addison ...

  5. python权威指南 pdf_Python高级编程(第2版) 中文完整pdf扫描版[76MB]

    Python作为一种高-级程序设计语言,凭借其简洁.易读及可扩展性日渐成为程序设计领域备受推崇的语言之一. Python高级编程(第2版)基于Python 3.5版本进行讲解,通过13章的内容,深度揭 ...

  6. Linux - Unix环境高级编程(第三版) 代码编译

    Unix环境高级编程(第三版) 代码编译 本文地址:http://blog.csdn.net/caroline_wendy 时间:2014.10.2 1. 下载代码:http://www.apuebo ...

  7. 《Android 4高级编程(第3版)》(完整书签).pdf

    下载地址:网盘下载 内容简介 编辑 <Android 4高级编程(第3版)>由Android权威专家编写,涵盖了所有最新的内容,是学习使用Android 4 SDK开发移动应用程序的理想指 ...

  8. android高级编程新浪,《C高级编程(第4版)》-完整教材教程

    崇仁不畅陌生丽台怪声礼物两可.寰球撬杠倡导搏击电星新盘蒙住<C高级编程(第4版)>-完整教材教程,胚柄抽空绿化些微两路.恸哭浅山转折乐华被迫党员心咒.国网茶荷前镇鬼物奶羊,全班柳铁路遥橱窗 ...

  9. UNIX环境高级编程(第三版 源码及编译好的静态库文件)

    UNIX环境高级编程(第三版) 源码 及 库文件 链接: https://pan.baidu.com/s/1tPY17lWNDEbzkOwZaRUUNg 提取码: 1024 复制这段内容后打开百度网盘 ...

最新文章

  1. redis del清除缓存java_redis zset集合操作缓存.java
  2. 绕开数学,讲讲信息论
  3. html5判断text文本是数字,JavaScript常用判断写法大全
  4. html中下拉列表监听事件,ExtJS 下拉框监听事件、日期选择器监听事件、实现动态给items添加删除数据...
  5. 使用node https module创建服务器遇到的mac verify failure错误消息
  6. 计算机网络IP分配大题,2018年IP分片网络大题
  7. eclipse中常见快捷键
  8. c#随机数总结,汉字,英文,数字
  9. BZOJ2752[HAOI2012] 高速公路(road)
  10. 烟雨在线要饭系统v2.0源码
  11. python爬取阳光问政
  12. android模拟器电视,Android TV开发之模拟器的设置
  13. linux根windows,linux系统刨根之路(二):实现windows和linux双系统-Go语言中文社区...
  14. 智课雅思短语---三、unshakable duty
  15. SAXParseException 前言中不允许有内容
  16. 链接mysql 504_总结403到504的常用问题
  17. 设置TreeViewer的前景色和背景色
  18. 用分治法解决青蛙跳问题(斐波那契数列)
  19. Depsolving loop limit reached
  20. Docker-设置redis容器主从模式哨兵模式

热门文章

  1. Excel初步验证身份证号的合法性
  2. 【毕业设计】时间序列天气预测系统 - LSTM
  3. php搭建个人博客(一)
  4. 小游戏毕设 - 炸弹人小游戏设计与实现 (源码)
  5. 湖南省安管人员安全生产知识考核题库(A类)多选题及答案
  6. ManageEngine SeviceDesk Plus是一个全面的帮助台和资产管理软件
  7. java containsany_Java contains用法示例
  8. python用product函数来生成N位二进制数的全排列
  9. 毕昇配置pytorch
  10. h5下划线怎么设置_html5怎么去除超链接的下划线