结束C#2的内容:最后一些新性

这是本章要讲的内容:

  • 分部类型:可以在多个源文件中为 一个类型编写代码。 特别适用于部分代码是自动生成, 而其他部分的代码为手写的类型。
  • 静态类:对工具类进行整理, 以便编译器能明白你是否在不恰当地使用它们, 并使你的意图更清晰。
  • 独立取值方法/ 赋值方法属性:属性终于有了公有取值方法和私有赋值方法了!( 这不是唯一的组合, 不过这是最常见的组合。)
  • 访问器
  • 命名空间别名:在类型名称不唯一的情况下的一种解决方式。
  • pragma指令:用于 操作 的 特定 编译器 指令, 如 禁止 对 某一 特殊 代码 段 使用 特定 的 警告 信息。
  • 固定大小的缓冲区:在非安全代码中, 可以更多地控制结构处理数组的方式。
  • 友元程序集:跨越语言、框架和运行时的一个特性, 在需要时能对选定的程序集进行更多的访问。

分部类型

简单来说就是C#2允许用多个文件来表示一个类型。用partial关键字来指定一个类是分部类型。

分部类型的规则:

  • 不能在文件中编写成员的一半代码,而在另一个文件中编写成员的另一半,成员的代码必须完整的放在一个文件中。有一个例外是分部类型能够嵌套另一个分部类型。
  • 任何文件都能指定要实现的接口(不过不必在那个文件中实现) 基类型以及类型参数约束。 然而, 如果多个文件都设定了基类型, 那么它们必须是相同的, 并且如果多个文件都设定了类型参数约束, 那么约束必须是一致的。
  • 必须具有相同的访问修饰符。如果有的话。
  • ”单文件“类型中,成员和静态变量的初始化一定会按照固定的顺序来进行。但是在分部类型中,就不一定了。

分部类型主要是和代码生成器一起配合使用,比如在Winform中的Form类。

分部类型还有一种稍微不同的用法, 就是辅助进行重构。 某些时候, 一个类型变得太大, 担当了太多职责, 就应对其进行重构。 重构的第一步就是要把这种臃肿的类型分成较小的类, 很多关联的内容首先就可以分割为在两个或多个文件上存放的分部类型。 接着, 我们在文件之间移动方法直到每个文件只处理一种特定的内容, 这个工作可以以一种毫无风险的实验方式来完成。

分部类型-->分部方法

分布方法与抽象方法的声明方式相同:用一个partial关键字来声明就行,不需要有方法体。当然,实现的方法同样也需要有partial修饰。

由于方法可能不存在,比如我在一个分部类中声明一个分部方法,但没有具体的去实现它,那么它在编译好的IL代码中将被清除掉,包括任何参数计算,所以,如果你的一些分部方法如果不确定是否要进行加载,那么就要用 分部方法(实例化后的参数)这样的形式来进行加载,以避免不必要的负荷。

同样由于方法可能不存在,分部方法的返回值必须是void,并且不允许有out修饰的参数。必须是私有的,但可以是静态或泛型的。

概括来说, C# 3的分部方法让生成代码可以和手写代码以一种丰富的方式进行交互, 而在无须这种交互的情况下不会产生任何性能损失。 C# 2分部类型可以让代码生成工具和开发人员之间的关系更富有成效, 而分部方法是对分部类型的一种自然延续。

静态类型

我们编写静态类型的主要目的就是编写一些工具类。工具类的主要特征如下:

  • 所有的成员都是静态的( 除了私有构造函数);
  • 类直接从object 派生; 一般情况下不应该有状态,
  • 除非涉及高速缓存或单例;
  • 不能存在任何可见的构造函数;
  • 类可以是密封的( 添加sealed修饰符), 当然要开发人员记得这样做。

在C#1中是不能创建一个静态类的,因为没有语法上面的支持。如果我们要创建一个类似概念的东西,就得在类里面创建一个私有的构造方法,然后给类打上一个sealed的标签。添加一个私有的构造方法显得很搞笑,既然不能调用这个构造方法,为什么要添加它呢?问题在于如果没有显式的添加一个构造方法,编译器会为你免费的赠送一个public的无参的构造函数。

C#2可以创建静态类,也不用显式的添加一个私有的构造方法,因为编译器知道它是一个静态的类,不会给他提供默认的无参的构造函数。

应当注意的是静态类中的所有成员必须都是静态的。而且还有显式的声明为静态,除了嵌套类型和常量。

实际上,编译器在类定义上执行了大量的约束:

  • 类不能声明为abstract或sealed, 虽然两者都是隐含声明的;
  • 类不能设定任何要实现的接口;
  • 类不能设定基类型;
  • 类不能包含任何非静态成员, 包括构造函数;
  • 类不能包含任何操作符;
  • 类不能包含任何protected或protected internal成员。

独立的取值方法/ 赋值方法属性访问器

这个标题在C#1中是不成立的,取值和赋值必须拥有相同的访问修饰符。

这个呼声很高的特性最终在C#2被添加了上来,很明显这是一个常见的需求,在类的外部,我们的取值是可见的,但赋值的话要经过一些验证才能被赋值,这是大多数程序的逻辑。在类内,我们可以对传入的参数进行验证并最终给属性进行赋值的操作。这个实现了更好的封装。

你不能吧属性设置为私有而把取值和赋值设置成共有----这个就搞笑了。编译器也不会同意。

C#2依然没有组织内部的代码绕过属性直接访问字段,现在也没有实现。这都C#7了。

命名空间别名

命名空间的主要意图是将多个类型组织成一个有用的层级。我们有时会遇到两个非限定名相同的类型,比如一个是System.Windows.Form.Button,另一个是System.Web.UI.WebControls.Button。它们都叫Button。我们不可能一直用这种全限定名来使用一个类型,不论是可读性还是什么的都很糟糕,可以使用C#的using指令:using shit=System.Windows.Form.Button.我们在使用的时候,就用shit这个名称来代替System.Windows.Form.Button。

后面几个书上将的特性我根本没遇到,不往上面写了。

C#复习笔记(3)--C#2:解决C#1的问题(结束C#2的内容:最后一些特性)的更多相关文章

  1. Java基础复习笔记系列 八 多线程编程

    Java基础复习笔记系列之 多线程编程 参考地址: http://blog.csdn.net/xuweilinjijis/article/details/8878649 今天的故事,让我们从上面这个图 ...

  2. Angular复习笔记7-路由(下)

    Angular复习笔记7-路由(下) 这是angular路由的第二篇,也是最后一篇.继续上一章的内容 路由跳转 Web应用中的页面跳转,指的是应用响应某个事件,从一个页面跳转到另一个页面的行为.对于使 ...

  3. Angular复习笔记7-路由(上)

    Angular复习笔记7-路由(上) 关于Angular路由的部分将分为上下两篇来介绍.这是第一篇. 概述 路由所要解决的核心问题是通过建立URL和页面的对应关系,使得不同的页面可以用不同的URL来表 ...

  4. Angular复习笔记6-依赖注入

    Angular复习笔记6-依赖注入 依赖注入(DependencyInjection)是Angular实现重要功能的一种设计模式.一个大型应用的开发通常会涉及很多组件和服务,这些组件和服务之间有着错综 ...

  5. tarjan复习笔记

    tarjan复习笔记 (关于tarjan读法,优雅一点读塔洋,接地气一点读塔尖) 0. 连通分量 有向图: 强连通分量(SCC)是个啥 就是一张图里面两个点能互相达到,那么这两个点在同一个强连通分量里 ...

  6. 树的直径,LCA复习笔记

    前言 复习笔记第6篇. 求直径的两种方法 树形DP: dfs(y); ans=max( ans,d[x]+d[y]+w[i] ); d[x]=max( d[x],d[y]+w[i] ); int di ...

  7. 状压DP复习笔记

    前言 复习笔记第4篇.CSP RP++. 引用部分为总结性内容. 0--P1433 吃奶酪 题目链接 luogu 题意 房间里放着 \(n\) 块奶酪,要把它们都吃掉,问至少要跑多少距离?一开始在 \ ...

  8. 斜率优化DP复习笔记

    前言 复习笔记2nd. Warning:鉴于摆渡车是普及组题目,本文的难度定位在普及+至省选-. 参照洛谷的题目难度评分(不过感觉部分有虚高,提高组建议全部掌握,普及组可以选择性阅读.) 引用部分(如 ...

  9. Java基础复习笔记系列 九 网络编程

    Java基础复习笔记系列之 网络编程 学习资料参考: 1.http://www.icoolxue.com/ 2. 1.网络编程的基础概念. TCP/IP协议:Socket编程:IP地址. 中国和美国之 ...

随机推荐

  1. C语言 矩阵的转置及矩阵的乘法

    C语言 矩阵的转置及矩阵的乘法 //凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1.矩阵的转置 #include<stdio.h> #defi ...

  2. MY Views on Doctor-patient relationship 英语医患关系议论文

    MY Views on Doctor-patient relationship Author:Pleiades_Antares(www.cnblogs.com/irischen) 1. In rece ...

  3. mysql 数据备份与数据导入到出

    一.数据备份 #1. 物理备份: 直接复制数据库文件,适用于大型数据库环境.但不能恢复到异构系统中如Windows. #2. 逻辑备份: 备份的是建表.建库.插入等操作所执行SQL语句,适用于中小型数 ...

  4. Kafka consumer group位移0ffset重设

    本文阐述如何使用Kafka自带的kafka-consumer-groups.sh脚本随意设置消费者组(consumer group)的位移.需要特别强调的是, 这是0.11.0.0版本提供的新功能且只 ...

  5. (转)Spring Boot (十九):使用 Spring Boot Actuator 监控应用

    http://www.ityouknow.com/springboot/2018/02/06/spring-boot-actuator.html 微服务的特点决定了功能模块的部署是分布式的,大部分功能 ...

  6. (转)Spring Boot(十二):Spring Boot 如何测试打包部署

    http://www.ityouknow.com/springboot/2017/05/09/spring-boot-deploy.html 有很多网友会时不时的问我, Spring Boot 项目如 ...

  7. Java面试知识点之数据库篇(一)

    前言:数据库的相关知识,在面试中也经常出现,笔者认为非常有必要对此类知识进行相关总结. 1.索引 索引是对数据库表中一列或多列的值进行排序的结构,是帮助数据库高效获取数据的数据结构. 通俗理解:索引就 ...

  8. Java学习笔记(二)——类和对象

    [1]类是模子,确定对象将会拥有的特征(属性)和行为(方法). [2]类的特点:类是对象的类型: 具有相同属性和方法的一组对象的集合. [3]属性:对象具有的各种特征(每个对象的每个属性都拥有特定值) ...

  9. 彻底理解js中的&&和||

    阅读代码时对一行代码很困惑 step > max_step && (step = min_step); 查阅资料后发现它等价于 if (step > max_step) { ...

  10. 小a的轰炸游戏 (差分)

    我是看题解的! 这道题还是有很多细节,当然,是一道差分的好题! 题意:有2种飞机,一种是只炸上半菱形,一种是炸整个菱形.问所有区域内的所有格子的异或和. 思路:用前缀和思路: 这样遍历过去就完成了一次 ...