结束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. Spring的jdbc模板3:完成CURD操作

    测试类代码如下 package zcc.spring_jdbc.demo2; import java.sql.ResultSet; import java.sql.SQLException; impo ...

  2. keepalived 安装篇-个人实践-编译安装

    官网地址:http://www.keepalived.org/官网文档:http://www.keepalived.org/documentation.html Keepalived的作用是检测服务器 ...

  3. [Java] SpringMVC工作原理之二:HandlerMapping和HandlerAdapter

    一.HandlerMapping 作用是根据当前请求的找到对应的 Handler,并将 Handler(执行程序)与一堆 HandlerInterceptor(拦截器)封装到 HandlerExecu ...

  4. C#事件の事件聚合器

    事件聚合器用于集中管理事件的订阅(Subscribe)和处理(Handle),要使用事件聚合器,首先要理解:事件(event)本质上是一个类. 传统的+=和-=不足: 1.管理很麻烦:2.不方便扩展. ...

  5. SpringMVC Controller 返回值几种类型

    SpringMVC Controller 返回值几种类型 2016年06月21日 19:31:14 为who而生 阅读数:4189 标签: Controller 返回值类型spring mvc 更多 ...

  6. 转://如何增加linux根目录的磁盘空间(基于LVM)?

    问题引出: 在测试过程中替换so文件,报磁盘空间不足的错误. ▲问题分析: 由于当时系统部署架构的考虑,把软件和数据库部署在了同一台机器上,并且给了30G的磁盘空间.系统上占用磁盘空间的有2部分,一是 ...

  7. 吴恩达课后作业学习2-week3-tensorflow learning-1-基本概念

    参考:https://blog.csdn.net/u013733326/article/details/79971488 希望大家直接到上面的网址去查看代码,下面是本人的笔记  到目前为止,我们一直在 ...

  8. go标准库的学习-os

    参考https://studygolang.com/pkgdoc 导入方式: import "os" os包提供了操作系统函数的不依赖平台的接口 一开始简单举个例子: packag ...

  9. Redis入门篇(安装与启动)

    一.Redis介绍 Redis是NoSql的一种,在弄清楚Redis是个什么玩意之前,先了解下NoSql是什么.1.什么是NoSql NoSql,全名:Not Only Sql,是一种非关系型数据库, ...

  10. 数组复制的五种方式(遍历循环一一赋值、System.arraycopy、地址赋值、克隆clone()、Arrays.copyof())

    package com.Summer_0424.cn; import java.util.Arrays; import java.util.concurrent.CopyOnWriteArrayLis ...