C#图解教程笔记20170720

全局程序集缓存(GAC),放进GAC的程序集称为共享程序集

  • 只有强命名程序集能被添加到GAC
  • GAC不仅值接受.dll扩展名的文件,也可以添加带.exe扩展名的程序集
  • GAC位置在名称为Assembly的子目录下,在Windows系统目录中。

当试图安装一个程序集到GAC时,CLR的安全组件首先必须检验程序集上的数字签名是否有效。如果无效,系统不会把它安装到GAC。

GAC内的并肩执行
相同文件名的不同程序集(因为他们带有不同的标识符)


image.png

配置文件
配置文件含有关于应用程序的信息,供CLR在运行时使用。
配置文件有XML代码组成,并不包含C#代码。
他们的一种用途是更新一个应用程序集以使用新版本的DLL

image.png

异常

异常是程序中的运行时错误,他违反了一个系统约束或应用程序约束,或出现了在正常操作室未预料的情形。

try语句用来知名被异常保护的代码块,并提供代码以处理异常。

  • try块包含正被异常保护的代码
  • catch子句部分含有一个或多个catch子句。这些是处理异常的代码块。它们也称为异常处理程序。
  • finally块含有在所有情况下都要执行的代码,无论有没有异常发生。


    image.png

当一个异常发生时,CLR:

  • 创建该类型的异常对象。
  • 寻找适当的catch子句已处理它。
    所有异常类都从根本上派生自system.exception类。异常继承层次的一个部分如图


    image.png

异常对象含有只读属性,带有导致该异常的信息。


image.png

catch子句处理异常,它有三种形式,允许不同级别的处理。


image.png

image.png

为异常寻找处理代码


image.png

一般法则


处理异常的一半法则.png

结构

结构有数据成员和函数成员。关键字struct。
结构与类最重要的区别:

  • 类是引用类型而结构是值类型
  • 结构是隐式密封的,而这意味着他们不能被派生。
  • 声明结构的语法与声明类相似


    image.png

结构是值类型和所有值类型一样,结构类型变量含有它自己的数据。从而:

  • 结构类型的变量不能为null;
  • 两个结构变量不能引用同一对象;

类变量赋值和结构变量赋值


image.png

结构可以有实例构造函数和静态构造函数,但不允许有析构函数。

构造函数和析构函数的总结


image.png

在结构中字段初始化是不允许的


image.png

结构是密封的(隐式密封),不能从他们派生其他结构。
不能用于结构的修饰符

  • protected
  • internal
  • abstract
  • virtual

结构作为返回类型和参数。
结构可以作为返回值和参数

  • 返回值:当结构被作为返回值时,一个拷贝被创建并从函数成员返回
  • 值参:当结构被用作值参时,一个实际参数的拷贝被创建。该拷贝被用在方法的执行中。
  • ref和out参数:如果把一个结构用作ref或out参数,一个对该结构的引用被传入方法,这样其他数据成员就能被改变

结构就像类可以实现接口

枚举
枚举是由程序员定义的类型,与类或结构一样。

  • 值类型,直接储存它们的数据
  • 只有一种类型的成员:命名的整数值常量。
    注意成员声明列表是逗号分隔的,在枚举声明中没有分号


    image.png

每个枚举类型都有一个底层证书类型,默认为int


image.png

数组

Rank:返回数组维度数的属性
Length:返回数组长度的属性

数组是引用类型,数组的元素可以是值类型或引用类型
一维数组


image.png

实例化数组


image.png

image.png

访问数组
使用索引值访问

显示初始化一维数组
int[] intArr = new int[] {1,2,3,4}

隐式类型数组


image.png

交错数组


image.png
成 员 类 型 生 存 期 意 义
Rank 属性 实例 获取数组的维度数
Length 属性 实例 获取数组中所有维度的元素总和
GetLength 方法 实例 返回数组的指定维度的长度
Clear 方法 静态 设置元素的范围为0或null
Sort 方法 方法 静态 在一维数组中对元素进行排序
BinarySearch 方法 静态 使用二进制搜索,搜索一维数组中的值
Clone 方法 实例 进行数组的浅复制——复制值类型数组和引用类型数组的元素
IndexOf 方法 静态 返回一维数组中遇到的第一个值
Reverse 方法 方法 静态 将一维数组中的某一范围内的元素顺序倒过来
GerUpperBound 方法 实例 获取指定维度的上限

clone方法

  • 克隆值类型数组会产生两个独立的数组
  • 克隆引用类型数组会产生两个指向相同对象的数组

委托

委托包含具有相同签名和返回类型的有序方法列表

  • 方法的列表称为调用列表
  • 当委托被调用时,他调用列表中的每一个方法
    image.png

    委托与C++的函数指正不同的是委托是面向对象的并且是类型安全的
    调用列表中的方法
    由委托保存的方法可以来自任何类或结构,只要他们同时匹配委托的如下两点:
  • 返回值
  • 签名
    调用列表中的方法可以使实例方法或是静态方法
    委托类型声明和所有类型声明一样,不需要在类内部声明


    image.png

    委托类型声明:

  • 以delegate关键字开头
  • 没有方法主体

委托是引用类型,因此有引用和对象
委托类型的变量的声明:


image.png

两种创建委托对象的方式:


使用带new运算符

快捷语法
image.png

由于委托是引用类型,可以通过给他赋值来改变包含在委托变量中的引用,就得委托对象会被垃圾回收期回收

组合委托
例:第三个委托有前两个委托组合

image.png

为委托增加方法
可以通过使用+=运算符来为委托增加方法或另一个委托

image.png

反之-=从委托移除方法

调用方法

image.png

image.png

调用带返回值的委托
如果委托有返回值并且在调用列表中有一个以上的方法,会发生下面的情况:

  • 调用列表中最后一个方法返回的值就是委托调用返回的值。
  • 调用列表中所有其他方法的返回值都会被忽略。
namespace weituo
{
    delegate int MyDel();
    public class MyClass
    {
        int result = 5;
        public int Add2()
        {
            result += 2;
            return result;
        }
        public int Add3()
        {
            result += 3;
            return result;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            MyClass mc = new MyClass();
            MyDel md = mc.Add2;
            md += mc.Add3;
            md += mc.Add2;
            Console.WriteLine(md());
            Console.ReadKey();
        }
    }
}

返回结果:
12


匿名方法
匿名方法允许我们避免使用独立的具体方法。
匿名方法是在初始化委托时内联声明的方法

命名方法

匿名方法

上图两组代码的输出结果为:
25
26


可以在如下地方使用匿名方法:

  • 声明委托变量时作为初始化表达式;
  • 组合委托时在赋值语句的右边;
  • 为委托增加事件时在赋值语句的右边。

匿名方法表达式的语法包含如下组成部分:

  • delegate类型关键字;;
  • 参数列表,如果语句块没有使用任何参数则可以省略。
  • 语句块,它包含了匿名方法的代码


    image.png

    返回类型需与委托的返回类型相同。
    参数
    除了数组参数,匿名方法的参数列表必须在如下三方面匹配委托:

  • 参数类型
  • 参数数量
  • 修饰符
    当下列两个条件都满足的时候,可以省略匿名方法的参数列表:
  • 委托的参数列表不包含任何out参数
  • 匿名方法不使用任何参数

params参数
如果委托声明的参数列表包含了params参数,那么params关键字就会被匿名方法的参数列表忽略。
变量和参数的作用域
参数以及声明在匿名方法内部的局部变量的作用域限制在实现方法的主体之内

变量和参数的作用域

匿名方法可以访问它们在外围作用域的局部变量和环境
外围作用域的变量叫做外部变量
用在匿名方法实现代码中的外部变量称为被方法捕获


在匿名方法中捕获的变量

Lambda表达式
匿名方法转换成Lambda

image.png

image.png

image.png

事件

事件就好像被简化的针对特殊用途的委托

image.png

事件是成员

  • 由于事件不是类型,我们不能使用对象创建表达式(new表达式)来创建它的对象
  • 由于事件是成员
  • 他必须声明在类或结构中,和其他成员一样;
  • 不能在一段可执行代码中声明事件
  • 事件成员被隐式自动初始化null

触发事件

  • 在触发事件之前和null进行比较,查看是否包含事件处理程序,如果事件为null,则表示没有’
  • 触发事件本身看起来像调用函数一样
  • 使用事件名称,后面跟的参数列表包含在圆括号中。
  • 参数列表必须匹配事件的委托类型。
    image.png

    订阅事件
    要为事件添加事件处理程序,处理程序必须有和事件委托一致的返回类型和签名
    下列代码为事件增加了三个方法:第一个使用方法形式的实例方法,第二个是使用方法形式的静态方法,第三个是使用委托形式的实例方法。
    image.png

使用匿名方法和lambda表达式增加事件处理程序


image.png

eventhandler委托类型


image.png

通过扩展eventargs来传递数据


image.png

事件访问器

  • 有两个访问器;add和remove。
  • 声明事件的访问器看上去和声明一个属性差不多


    image.png

接口

接口是表示一组函数成员而不实现成员的引用类型。
其他类型——类和结构可以实现接口。


image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,311评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,339评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,671评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,252评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,253评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,031评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,340评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,973评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,466评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,937评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,039评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,701评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,254评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,259评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,497评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,786评论 2 345

推荐阅读更多精彩内容

  • 前言 人生苦多,快来 Kotlin ,快速学习Kotlin! 什么是Kotlin? Kotlin 是种静态类型编程...
    任半生嚣狂阅读 26,146评论 9 118
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,599评论 18 139
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,869评论 6 13
  • 你们都比我坚强! 我像是蒙蔽了眼睛,卑微到尘土。 从前一样,现在一样。 就这样吧,我放下了,因为太累了。
    辰辰辰辰辰ii阅读 261评论 0 0
  • 影绰风摇,日落霞丹。蒹葭里、好鸟关关。放歌有度,纵目无边。赏一扁舟,一江水,一重天。 雕栏夜薄,澄怀偕友。鼓瑟中、...
    深蓝色木鱼阅读 312评论 3 11