C#图解教程第5版(2)

第4 章 类型、存储和变量

C#程序是一组类型声明

对三种编程语言源码的理解

  • C程序是一组函数和数据类型
  • C++程序是一组函数和类
  • C#程序是一组类型声明
    • 类型是一种用来创建数据结构的模板
    • 简单类型只能存储一个数据项,如short,int
    • 类型可以包含不同的成员,数据类型包含数据,函数成员定义类型的行为

预定义类型:16种,包括13种简单类型和3种非简单类型

13种简单类型。
(1)整数类型供8种: 8,16,32,64位的有符号、无符号整数
(2)浮点数共3种: float,精度很多场景都不足;double,常用类型; decimal,高精度浮点数,可以准确地表示分数,常用于货币的计算
(3)bool,只能为 true 或 false, 不能用数值表示
(4)char,Unicode字符类型

3种非简单类型:
(1)string:Unicode字符数组
(2)object:所有其他类型的基类
(3)dynamic:使用动态语言(IronPython,IronRuby之类的脚本语言)编写的程序集时使用

<p>C#图解教程第5版(2)</p>

<p>C#图解教程第5版(2)</p>

用户定义类型:6种

  • ç±» class
  • 结构 struct
  • 数组 array
  • 枚举 enum
  • 委托 delegate
  • 接口 interface

栈和堆

程序运行时,数据必须存储在内存中。运行中的程序使用两个区域存储数据:栈和堆。

栈是一种后进先出结构,存储如下类型的数据:

  • 程序的执行环境
  • 传递给方法的参数
  • 某些类型的变量的值

<p>C#图解教程第5版(2)</p>

堆里的数据能够以任意顺序存入和移除,GC来处理移除工作。

<p>C#图解教程第5版(2)</p>

第5 章 类的基本概念

类是一个能存储数据并执行代码的数据结构。

C#中的类和方法:

  • 没有全局函数、全局方法
  • 方法必须有返回类型或返回void
  • 类是引用类型
    • 声明类的实例实际只分配了保存引用的内存,没有分配保存实际对象的内存。
    • 用new 关键字才会实际分配保存实际对象的内存: new TypeName()
using System;
namespace simple
{
    class Pocker{

    }
    class Program
    {
        static void Main()
        {
            Pocker thePocker; //声明引用变量
            thePocker=new Pocker(); // 使用new 为类对象 Pocker 分配内存,并赋值给变量 thePocker
            //合并上面两步:
            Pocker thePocker2 = new Pocker();
        }
    }
}

访问修饰符:

  • private :只能在类内部访问(默认的访问级别)
  • public
using System;
namespace simple
{
    class TwoInts
    {
        public int i1, i2;
        public double average()
        {
            double d = (i1 + i2) / 2;
            return d;
        }

    }
    class Program
    {
        static void Main()
        {
            TwoInts ti1 = new TwoInts();
            TwoInts ti2 = new TwoInts();

            ti1.i1 = 76; ti1.i2 = 57;
            ti2.i1 = 75; ti2.i2 = 53;

            Console.WriteLine("ti1:{0},{1},{2}", ti1.i1, ti1.i2, ti1.average());
            Console.WriteLine("ti2:{0},{1},{2}", ti2.i1, ti2.i2, ti2.average());
        }
    }
}
/*
ti1:76,57,66
ti2:75,53,64
*/

第6章 方法

var 关键字是句法上的速记,只能用于:

  • 局部变量
  • 只能在包含初始化的变量声明中使用,

变量声明的嵌套:不能在嵌套内声明同名变量

局部常量声明: 使用 const 关键字

值参数:复制值传递给方法。示例:

using System;
namespace simple
{
    class MyClass
    {
        public int V = 20;
    }
    class Program
    {
        static void MyMethod( MyClass f1, int f2){
            f1.V += 5;
            f2 +=5;
            Console.WriteLine($"f1.V:{f1.V},f2:{f2}"); //只改变了局部变量的值
        }
        static void Main()
        {
            MyClass f1 = new MyClass();
            int f2 = 10;

            MyMethod(f1,f2);

            Console.WriteLine($"f1.V:{f1.V},f2:{f2}"); 
        }
    }
}
/*
f1.V:25,f2:15
f1.V:25,f2:10
*/

引用参数,必须在方法的声明中使用关键字 ref

  • 不会为引用参数分配内存(不会复制值)
  • 形参的名字将作为实参的别名,指向实参,对形参的任何改变也会改变实参
using System;
namespace simple
{
    class MyClass
    {
        public int V = 20;
    }
    class Program
    {
        static void MyMethod( MyClass f1, ref int f2){
            f1.V += 5;
            f2 +=5;
            Console.WriteLine($"f1.V:{f1.V},f2:{f2}");
        }
        static void Main()
        {
            MyClass f1 = new MyClass();
            int f2 = 10;

            MyMethod(f1,ref f2);  // 调用时也必须带 ref 关键字

            Console.WriteLine($"f1.V:{f1.V},f2:{f2}");
        }
    }
}
/*
f1.V:25,f2:15
f1.V:25,f2:15
*/
6.1 方法的结构 56
6.2 方法体内部的代码执行 57
6.3 局部变量 58
6.3.1 类型推断和var 关键字 59
6.3.2 嵌套块中的局部变量 59
6.4 局部常量 60
6.5 控制流 61
6.6 方法调用 62
6.7 返回值 63
6.8 返回语句和void 方法 64
6.9 局部函数 66
6.10 参数 66
6.10.1 形参 67
6.10.2 实参 67
6.11 值参数 69
6.12 引用参数 71
6.13 引用类型作为值参数和引用参数 73
6.14 输出参数 76
6.15 参数数组 79
6.15.1 方法调用 80
6.15.2 将数组作为实参 82
6.16 参数类型总结 83
6.17 ref 局部变量和ref 返回 83
6.18 方法重载 86
6.19 命名参数 87
6.20 可选参数 88
6.21 栈帧 91
6.22 递归 93
第7 章 深入理解类 95
7.1 类成员 95
7.2 成员修饰符的顺序 96
7.3 实例类成员 97
7.4 静态字段 98
7.5 从类的外部访问静态成员 98
7.5.1 静态字段示例 99
7.5.2 静态成员的生存期 100
7.6 静态函数成员 101
7.7 其他静态类成员类型 102
7.8 成员常量 102
7.9 常量与静态量 103
7.10 属性 103
7.10.1 属性声明和访问器 104
7.10.2 属性示例 105
7.10.3 使用属性 106
7.10.4 属性和关联字段 106
7.10.5 执行其他计算 107
7.10.6 只读和只写属性 108
7.10.7 属性与公有字段 109
7.10.8 计算只读属性示例 109
7.10.9 自动实现属性 110
7.10.10 静态属性 111
7.11 实例构造函数 112
7.11.1 带参数的构造函数 113
7.11.2 默认构造函数 114
7.12 静态构造函数 114
7.13 对象初始化语句 116
7.14 析构函数 117
7.15 readonly 修饰符 117
7.16 this 关键字 118
7.17 索引器 119
7.17.1 什么是索引器 120
7.17.2 索引器和属性 120
7.17.3 声明索引器 121
7.17.4 索引器的set 访问器 122
7.17.5 索引器的get 访问器 122
7.17.6 关于索引器的更多内容 123
7.17.7 为Employee 示例声明索引器 123
7.17.8 另一个索引器示例 124
7.17.9 索引器重载 125
7.18 访问器的访问修饰符 126
7.19 分部类和分部类型 127
7.20 分部方法 128
第8 章 类和继承 130
8.1 类继承 130
8.2 访问继承的成员 131
8.3 所有类都派生自object 类 132
8.4 屏蔽基类的成员 133
8.5 基类访问 135
8.6 使用基类的引用 135
8.6.1 虚方法和覆写方法 137
8.6.2 覆写标记为override 的方法 139
8.6.3 覆盖其他成员类型 142
8.7 构造函数的执行 142
8.7.1 构造函数初始化语句 144
8.7.2 类访问修饰符 145
8.8 程序集间的继承 146
8.9 成员访问修饰符 148
8.9.1 访问成员的区域 149
8.9.2 公有成员的可访问性 150
8.9.3 私有成员的可访问性 150
8.9.4 受保护成员的可访问性 150
8.9.5 内部成员的可访问性 151
8.9.6 受保护内部成员的可访问性 151
8.9.7 成员访问修饰符小结 152
8.10 抽象成员 153
8.11 抽象类 154
8.11.1 抽象类和抽象方法的示例 154
8.11.2 抽象类的另一个例子 155
8.12 密封类 156
8.13 静态类 156
8.14 扩展方法 157
8.15 命名约定 160
第9 章 表达式和运算符 162
9.1 表达式 162
9.2 字面量 163
9.2.1 整数字面量 164
9.2.2 实数字面量 165
9.2.3 字符字面量 166
9.2.4 字符串字面量 167
9.3 求值顺序 168
9.3.1 优先级 168
9.3.2 结合性 169
9.4 简单算术运算符 170
9.5 求余运算符 170
9.6 关系比较运算符和相等比较运算符 171
9.7 递增运算符和递减运算符 173
9.8 条件逻辑运算符 174
9.9 逻辑运算符 175
9.10 移位运算符 176
9.11 赋值运算符 178
9.12 条件运算符 179
9.13 一元算术运算符 181
9.14 用户定义的类型转换 181
9.15 运算符重载 184
9.15.1 运算符重载的示例 185
9.15.2 运算符重载的限制 186
9.16 typeof 运算符 189
9.17 nameof 运算符 190
9.18 其他运算符 191
第 10 章 语句 192
10.1 什么是语句 192
10.2 表达式语句 193
10.3 控制流语句 194
10.4 if 语句 194
10.5 if else 语句 195
10.6 while 循环 196
10.7 do 循环 197
10.8 for 循环 198
10.8.1 for 语句中变量的作用域 200
10.8.2 初始化和迭代表达式中的多表达式 200
10.9 switch 语句 201
10.9.1 分支示例 203
10.9.2 其他类型的模式表达式 203
10.9.3 switch 语句的补充 205
10.9.4 分支标签 206
10.10 跳转语句 207
10.11 break 语句 207
10.12 continue 语句 208
10.13 标签语句 209
10.13.1 标签 209
10.13.2 标签语句的作用域 209
10.14 goto 语句 210
10.15 using 语句 211
10.15.1 包装资源的使用 212
10.15.2 using 语句的示例 212
10.15.3 多个资源和嵌套 213
10.15.4 using 语句的另一种形式 214
10.16 其他语句 215
第 11 章 结构 216
11.1 什么是结构 216
11.2 结构是值类型 217
11.3 对结构赋值 218
11.4 构造函数和析构函数 219
11.4.1 实例构造函数 219
11.4.2 静态构造函数 220
11.4.3 构造函数和析构函数小结 221
11.5 属性和字段初始化语句 221
11.6 结构是密封的 221
11.7 装箱和拆箱 222
11.8 结构作为返回值和参数 222
11.9 关于结构的更多内容 222
第 12 章 枚举 223
12.1 枚举 223
12.1.1 设置底层类型和显式值 225
12.1.2 隐式成员编号 225
12.2 位标志 226
12.2.1 Flags 特性 229
12.2.2 使用位标志的示例 230
12.3 关于枚举的更多内容 231
第 13 章 数组 234
13.1 数组 234
13.1.1 定义 234
13.1.2 重要细节 235
13.2 数组的类型 235
13.3 数组是对象 236
13.4 一维数组和矩形数组 237
13.5 实例化一维数组或矩形数组 238
13.6 访问数组元素 238
13.7 初始化数组 239
13.7.1 显式初始化一维数组 240
13.7.2 显式初始化矩形数组 240
13.7.3 初始化矩形数组的语法点 241
13.7.4 快捷语法 241
13.7.5 隐式类型数组 241
13.7.6 综合内容 242
13.8 交错数组 242
13.8.1 声明交错数组 243
13.8.2 快捷实例化 243
13.8.3 实例化交错数组 244
13.8.4 交错数组中的子数组 245
13.9 比较矩形数组和交错数组 246
13.10 foreach 语句 247
13.10.1 迭代变量是只读的 248
13.10.2 foreach 语句和多维数组 249
13.11 数组协变 250
13.12 数组继承的有用成员 251
13.13 比较数组类型 254
13.14 数组与ref 返回和ref 局部变量 255
第 14 章 委托 256
14.1 什么是委托 256
14.2 委托概述 258
14.3 声明委托类型 259
14.4 创建委托对象 260
14.5 给委托赋值 261
14.6 组合委托 262
14.7 为委托添加方法 262
14.8 从委托移除方法 263
14.9 调用委托 263
14.10 委托的示例 264
14.11 调用带返回值的委托 265
14.12 调用带引用参数的委托 266
14.13 匿名方法 267
14.13.1 使用匿名方法 268
14.13.2 匿名方法的语法 268
14.13.3 变量和参数的作用域 270
14.14 Lambda 表达式 271
第 15 章 事件 274
15.1 发布者和订阅者 274
15.2 源代码组件概览 276
15.3 声明事件 276
15.4 订阅事件 277
15.5 触发事件 278
15.6 标准事件的用法 280
15.6.1 通过扩展EventArgs 来传递数据 281
15.6.2 移除事件处理程序 283
15.7 事件访问器 284
第 16 章 接口 286
16.1 什么是接口 286
16.2 声明接口 291
16.3 实现接口 292
16.4 接口是引用类型 294
16.5 接口和as 运算符 295
16.6 实现多个接口 295
16.7 实现具有重复成员的接口 296
16.8 多个接口的引用 298
16.9 派生成员作为实现 299
16.10 显式接口成员实现 300
16.11 接口可以继承接口 302
16.12 不同类实现一个接口的示例 303
第 17 章 转换 305
17.1 什么是转换 305
17.2 隐式转换 306
17.3 显式转换和强制转换 307
17.4 转换的类型 308
17.5 数字的转换 309
17.5.1 隐式数字转换 309
17.5.2 溢出检测上下文 310
17.5.3 显式数字转换 311
17.6 引用转换 315
17.6.1 隐式引用转换 316
17.6.2 显式引用转换 317
17.6.3 有效显式引用转换 318
17.7 装箱转换 318
17.7.1 装箱是创建副本 319
17.7.2 装箱转换 320
17.8 拆箱转换 320
17.9 用户自定义转换 321
17.9.1 用户自定义转换的约束 322
17.9.2 用户自定义转换的示例 322
17.9.3 评估用户自定义转换 323
17.9.4 多步用户自定义转换的示例 324
17.10 is 运算符 325
17.11 as 运算符 326
第 18 章 泛型 327
18.1 什么是泛型 327
18.2 C#中的泛型 329
18.3 泛型类 330
18.3.1 声明泛型类 331
18.3.2 创建构造类型 331
18.3.3 创建变量和实例 332
18.3.4 使用泛型的栈的示例 333
18.3.5 比较泛型和非泛型栈 334
18.4 类型参数的约束 335
18.4.1 Where 子句 336
18.4.2 约束类型和次序 337
18.5 泛型方法 337
18.5.1 声明泛型方法 338
18.5.2 调用泛型方法 338
18.5.3 泛型方法的示例 339
18.6 扩展方法和泛型类 340
18.7 泛型结构 341
18.8 泛型委托 342
18.9 泛型接口 344
18.9.1 使用泛型接口的示例 345
18.9.2 泛型接口的实现必须唯一 345
18.10 协变和逆变 346
18.10.1 协变 346
18.10.2 逆变 349
18.10.3 协变和逆变的不同 350
18.10.4 接口的协变和逆变 351
18.10.5 关于可变性的更多内容 352
第 19 章 枚举器和迭代器 354
19.1 枚举器和可枚举类型 354
19.2 IEnumerator 接口 356
19.3 IEnumerable 接口 358
19.4 泛型枚举接口 360
19.5 迭代器 362
19.5.1 迭代器块 362
19.5.2 使用迭代器来创建枚举器 363
19.5.3 使用迭代器来创建可枚举类型 365
19.6 常见迭代器模式 366
19.7 产生多个可枚举类型 367
19.8 将迭代器作为属性 368
19.9 迭代器的实质 369
第 20 章 LINQ 371
20.1 什么是LINQ 371
20.2 LINQ 提供程序 372
20.3 方法语法和查询语法 374
20.4 查询变量 375
20.5 查询表达式的结构 376
20.5.1 from 子句 377
20.5.2 join 子句 378
20.5.3 什么是联结 379
20.5.4 查询主体中的from let where 片段 381
20.5.5 orderby 子句 384
20.5.6 select group 子句 385
20.5.7 查询中的匿名类型 386
20.5.8 group 子句 387
20.5.9 查询延续:into 子句 388
20.6 标准查询运算符 389
20.6.1 标准查询运算符的签名 392
20.6.2 查询表达式和标准查询运算符 393
20.6.3 将委托作为参数 394
20.6.4 LINQ 预定义的委托类型 395
20.6.5 使用委托参数的示例 396
20.6.6 使用Lambda 表达式参数的示例 397
20.7 LINQ to XML 398
20.7.1 标记语言 398
20.7.2 XML 基础 398
20.7.3 XML 类 400
20.7.4 使用XML 特性 406
20.7.5 其他类型的节点 408
20.7.6 使用LINQ to XML 的LINQ 查询 409
第 21 章 异步编程 412
21.1 什么是异步 412
21.2 async/await 特性的结构 416
21.3 什么是异步方法 417
21.3.1 异步方法的控制流 421
21.3.2 取消一个异步操作 427
21.3.3 在调用方法中同步地等待任务 430
21.3.4 在异步方法中异步地等待任务 433
21.3.5 Task.Delay 方法 435
21.4 GUI 程序中的异步操作 436
21.5 使用异步Lambda 表达式 440
21.6 完整的GUI 程序 441
21.7 BackgroundWorker 类 443
21.8 并行循环 447
21.9 其他异步编程模式 450
21.10 BeginInvoke 和EndInvoke 451
21.10.1 等待直到完成模式 452
21.10.2 AsyncResult 类 453
21.10.3 轮询模式 454
21.10.4 回调模式 455
21.11 计时器 458
第 22 章 命名空间和程序集 460
22.1 引用其他程序集 460
22.2 命名空间 464
22.2.1 命名空间名称 467
22.2.2 命名空间的补充 467
22.2.3 命名空间跨文件伸展 468
22.2.4 嵌套命名空间 469
22.3 using 指令 470
22.3.1 using 命名空间指令 470
22.3.2 using 别名指令 471
22.3.3 using static 指令 471
22.4 程序集的结构 472
22.5 程序集标识符 473
22.6 强命名程序集 474
22.7 私有程序集的部署 475
22.8 共享程序集和GAC 476
22.8.1 把程序集安装到GAC 476
22.8.2 GAC 内的并肩执行 477
22.9 配置文件 477
22.10 延迟签名 478
第 23 章 异常 480
23.1 什么是异常 480
23.2 try 语句 481
23.3 异常类 482
23.4 catch 子句 483
23.5 异常过滤器 485
23.6 catch 子句段 485
23.7 finally 块 486
23.8 为异常寻找处理程序 487
23.9 进一步搜索 488
23.9.1 一般法则 489
23.9.2 搜索调用栈的示例 489
23.10 抛出异常 492
23.11 不带异常对象的抛出 493
23.12 throw 表达式 494
第 24 章 预处理指令 495
24.1 什么是预处理指令 495
24.2 基本规则 495
24.3 #define 和#undef 指令 496
24.4 条件编译 497
24.5 条件编译结构 498
24.6 诊断指令 500
24.7 行号指令 501
24.8 区域指令 502
24.9 #pragma warning 指令 503
第 25 章 反射和特性 504
25.1 元数据和反射 504
25.2 Type 类 505
25.3 获取Type 对象 506
25.4 什么是特性 508
25.5 应用特性 509
25.6 预定义的保留特性 509
25.6.1 Obsolete 特性 509
25.6.2 Conditional 特性 510
25.6.3 调用者信息特性 512
25.6.4 DebuggerStepThrough 特性 513
25.6.5 其他预定义特性 514
25.7 关于应用特性的更多内容 514
25.7.1 多个特性 514
25.7.2 其他类型的目标 515
25.7.3 全局特性 515
25.8 自定义特性 516
25.8.1 声明自定义特性 516
25.8.2 使用特性的构造函数 516
25.8.3 指定构造函数 517
25.8.4 使用构造函数 517
25.8.5 构造函数中的位置参数和命名参数 518
25.8.6 限制特性的使用 518
25.8.7 自定义特性的最佳实践 520
25.9 访问特性 520
25.9.1 使用IsDefined 方法 520
25.9.2 使用GetCustomAttributes方法 521
第 26 章 C# 6.0 和C# 7.0 新增的内容 523
26.1 新增内容概述 524
26.2 字符串插值(C# 6.0) 524
26.3 自动属性初始化语句 525
26.4 只读自动属性(C# 6.0) 526
26.5 表达式函数体成员(C# 6.0 和
C# 7.0) 526
26.6 using static(C# 6.0) 527
26.7 空条件运算符(C# 6.0) 528
26.8 在catch 和finally 块中使用await(C# 6.0) 528
26.9 nameof 运算符(C# 6.0) 529
26.10 异常过滤器(C# 6.0) 529
26.11 索引初始化语句(C# 6.0) 530
26.12 集合初始化语句的扩展方法(C# 6.0) 532
26.13 改进的重载决策(C# 6.0) 533
26.14 值元组(C# 7.0) 534
26.15 is 模式匹配(C# 7.0) 534
26.16 switch 模式匹配(C# 7.0) 536
26.17 自定义析构函数(C# 7.0) 538
26.18 二进制字面量和数字分隔符(C# 7.0) 540
26.19 out 变量(C# 7.0) 541
26.20 局部函数(C# 7.0) 542
26.21 ref 局部变量(ref 变量)和
ref 返回(C# 7.0) 544
26.22 表达式函数体成员的扩展(C# 7.0) 544
26.23 throw 表达式(C# 7.0) 545
26.24 扩展的async 返回类型(C# 7.0) 545
第 27 章 其他主题 546
27.1 概述 546
27.2 字符串 546
27.3 StringBuilder 类 548
27.4 把字符串解析为数据值 549
27.5 关于可空类型的更多内容 550
27.5.1 为可空类型赋值 552
27.5.2 使用空接合运算符 552
27.5.3 空条件运算符 553
27.5.4 使用可空用户定义类型 555
27.6 Main 方法 556
27.7 文档注释 558
27.7.1 插入文档注释 558
27.7.2 使用其他XML 标签 559
27.8 嵌套类型 559
27.8.1 嵌套类的示例 560
27.8.2 可见性和嵌套类型 561
27.9 析构函数和dispose 模式 563
27.9.1 标准dispose 模式 564
27.9.2 比较构造函数和析构函数 566
27.10 Tuple 和ValueTuple 566
27.11 和COM 的互操作 568

cn page:16

en page:7

正文完
 
评论(没有评论)