《Visual C# 2010入门经典》一1.2 C#语言

本节书摘来异步社区《Visual C# 2010入门经典》一书中的第1章,第1.2节,作者: 【美】Scott Dorman
译者: 张劼 责编: 傅道坤,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.2 C#语言

Visual C# 2010入门经典
如果您是C、C++或Java程序员,将很快熟悉C#,因为其语法与这些语言类似。如果您熟悉Visual Basic(运行在.NET Framework上的任何Visual Basic版本,而不是Visual Basic 6.0或更早的版本),可能对C#语法感到陌生,但应熟悉Framework类库。如果您从未使用过上述任何语言,也将发现与众多其他语言相比,使用C#进行编程更容易,因为它语法优雅,类库庞大。


didyoukonw


**
提示:语言灵感**

作为一种语言,C#借鉴了众多不同的语言,以形成其语法和主要功能,这包括Delphi 5、C++和Java 2。

泛型系统(第11章将更详细地介绍)是从Eiffel和Ada那里借鉴而来的;而LINQ和Lambda表达式评估(参见第12章)主要是从Haskell和Lisp那里借鉴而来的。

C#还添加了一些来自动态语言(如Ruby)和函数语言(如F#)的功能。
与众多现代编程语言一样,C#也是一种面向对象的语言,全面支持面向对象编程概念,如继承、多态、封装和抽象。另外,C#还支持面向组件编程,这让您能够指定自带文档的独立功能单元(组件),为此只需提供一个模型,它包含属性、方法、事件以及有关组件的元数据。C#本身就支持这些概念,这使得创建和使用组件的过程非常自然。如果您不熟悉这些概念,请参阅第3章。

C#提供的语言功能让开发人员能够利用CLR的改进。垃圾收集功能自动管理内存;异常处理提供了一种可扩展的结构化方法,让您能够检测错误并从错误中恢复。作为一种类型安全语言,下述情况根本不可能发生:变量未初始化、非法访问内存、将一种类型的数据存储到只能接受另一种类型的地方。

另外,C#的语言功能和语法设计还减少了您需要编写的代码量,这让代码更简单,降低了发生常见错误的可能性。在有些情况下,这种改进不过是改变语法:简化复杂或容易出错的语言功能,让它们更容易使用和理解;在其他情况下,这种改进提供了更高级的功能。

每个新的C#版本都做了改进:新增语言功能、改进语法,致力于让简单的事情容易、让困难的事情变得可能、让糟糕的事情难以发生。随着C#不断新增功能,简单的事情变得更容易了,困难的事情变得容易了,以前不可能的事情变得可能了。

1.2.1 类型

在C#中,类型是对值的描述。每当您需要一个值时,就需要一种类型。正如前面介绍通用类型系统时指出的,类型定义了允许的值以及这些值支持的操作。在C#中,每个值都由其所属的类型全面描述,且是其所属类型的一个实例。所谓全面描述,指的是类型明确地指定了值的表示方式以及可对它执行的操作。

C#类型分两类:值类型和引用类型。值类型描述的值是完全独立的,这包括数值类型、枚举类型和结构;引用类型存储指向值的引用,而不是值本身。


didyoukonw

提示:

第2章更深入地探讨了值类型和引用类型之间的差别。
C#提供了众多预定义的值类型和几种预定义的引用类型,您还可以创建用户定义的类型。在接下来的几章中,将更详细地探讨值类型和引用类型之间的差别以及如何创建用户定义的类型。但就目前而言,只需知道一个最重要的差别:值类型包含实际值,而引用类型包含指向实际数据的引用。

1.2.2 语句和表达式
语句是一条完整的程序指令,必须以分号(;)结尾。每条语句中只能包含一条指令,这看起来限制性很强,但C#还提供了语句块,这是一组用大括号括起的语句。在可以使用单条语句的任何地方都可使用语句块。

由于语句以分号结尾,因此可使用空白(如空格、制表符和换行符)调整代码的排列方式。最佳的方法是采用一种简单而一致的风格(如果您的公司或团队没有这样的风格),让代码更容易阅读和维护。


watchout

警告:空白

虽然编译器通常忽略空白,但是类型声明、标识符和其他关键字之间的空白很重要。如果没有空白,编译器将无法识别关键字。
表达式的结果为值。如果将语句视为操作,那么表达式就是计算。结果为布尔值(true或false)的表达式常用于判断条件是否满足,这种表达式称为布尔表达式。

1.2.3 变量和常量
对于变量,最简单的定义是它表示一个存储位置,其中的值可随时间流逝而变化。最常见的变量是局部变量和字段,它们都可通过指定类型、标识符和可选的初值来定义:

int a;
int b = 1;

如果要声明多个类型相同的变量,就可将声明合并在一起,如下所示:

int a, b;

在限定作用域(如方法)内声明的变量称为局部变量,只能在该作用域内通过名称访问它。


bytheway

注意:作用域、声明空间和寿命

可将作用域视为容器,只有在该容器内才能通过非限定名合法地访问变量。这不同于声明空间,在声明空间内,不允许有两个名称相同的标识符。如果说作用域指定了您在哪里能够使用某个名称,那么声明空间就指出了该名称在哪里是唯一的。

变量的寿命与其作用域紧密相连,它决定了变量在多长时间内可用。只要当前执行的代码还位于变量的作用域内,该变量就可用。

第3章将更详细地介绍作用域和声明空间。
字段是在限定作用域内声明的变量,它要么与类型本身相关联,要么与类型的一个实例相关联。在前一种情况下称为静态变量(可将其视为一种全局变量);在后一种情况下则称为实例变量。使用局部变量和字段之前,必须将其初始化;另外,只有在这些变量的声明所属的代码块内才能访问它们。

程序清单1.1是一个名为Color的类型,其中包含私有实例字段red、blue和green,还包含公有静态字段White、Red、Blue和Green。

程序清单1.1 Color类


w6

使用静态字段之前,需要对其进行初始化,但是此后无法保证它们的值不会变化。为了声明初始化后就不能修改的字段,可以创建只读字段。


didyoukonw


提示:

有关只读字段的更详细信息,请参阅第3章。
程序清单1.2列出了Color类中被修改的代码行。

程序清单1.2 使用只读字段的Color类

w5

常量表示在编译阶段可计算的值。常量与类型本身相关联,就像是静态的。与变量一样,常量可在限定作用域内声明,也可以是全局的;与变量不同的是,必须在声明常量时对其进行初始化。


didyoukonw

提示:字面值和魔数

字面值通常是有特殊含义的数值,并在代码中直接指定。随着时间的推移,可能忘记字面值的含义,导致相应的代码难以维护。因此,这些字面值常被称为魔数(magic numbers)。通过使用常量而不是字面值,可将其含义保留下来,让代码的含义不言自明。

对于下述函数中的数字,您花了多长时间才弄明白其含义呢?


w4

如果使用常量重新编写该函数,其中的魔数的含义将非常明显:


w3


在这个示例中,299792458是一个字面值,因此可将其视为一个魔数。您可能猜到了,应使用常量而不是字面值,因为与数字相比,常量的名称可更好地说明其含义,还可确保其值不会变化。
声明变量或常量的语句通常称为声明语句,可位于代码块的任何地方。

1.2.4 标识符和关键字

声明变量、字段或常量时,必须指定数据类型并提供有意义的名称,后者称为标识符。

标识符必须遵循如下规则。

  • 只能包含字母(大写和小写)、数字和下划线。
  • 标识符必须以字母或下划线打头,但对于公有标识符,以一个或多个下划线- 打头是一种糟糕的做法,应避免这样做。
  • 在给定的声明空间内,标识符必须是唯一的。
  • 标识符是区分大小写的。

选择标识符时,还应遵守的其他指导原则如下。

  • 标识符应易于阅读。
  • 标识符应使用缩写。
  • 标识符应提供尽可能丰富的含义。

在C#中,标识符是区分大小写的。推荐的命名约定建议如下:对于变量名和参数名,使用Camel大小写规则,该规则要求除第一个单词外,其他单词的首字母都大写,如bookTitle;对于方法名和其他标识符,使用Pascal大小写规则,该规则要求每个单词的首字母都大写,如BookTitle。


didyoukonw

提示:Camel和Pascal大小写规则

采用Camel大小写规则时,标识符中的大写字母看起来向驼峰,这种大小写规则因此而得名。Pascal大小写规则因其被Pascal编程语言广泛采用而得名(Turbo Pascal语言最初是由Anders设计的)。

Microsoft不再推荐使用Hungarian表示法,也不推荐使用下划线分隔单词,这两种表示法在其他语言中很常用。
如果您熟悉其他区分大小写的语言,如C、C++或Java,就会觉得这很正常;如果您以前使用的是不区分大小写的语言,如Visual Basic,可能需要一段时间才能适应。所幸的是,Visual Studio 2010代码编辑器提供的功能可让这种过渡更容易。

由于标识符定义了特定元素的名称,因此C#也需要使用标识符向编译器和您表示特殊含义,它保留了一些标识符供自己使用,这些标识符称为关键字。

在C#中,有77个标识符在任何情况下都属于关键字,如表1.2所示。

w2


另外,还有24个关键字称为上下文关键字,它们仅在特定情况(上下文)中有特殊含义。离开该上下文后,这些关键字就可供您使用,但为避免混淆,应尽量避免使用。表1.3列出了这些上下文关键字。

w1

此为完整版去密码锁定版,可自由编辑打印,共三部分,此为I部分 原书名: Microsoft Visual C# 2010 Step by Step 原出版社: Microsoft Press 作者: (英)John Sharp 译者: 周靖 丛书名: 微软技术丛书 出版社:清华大学出版社 ISBN:9787302234289 上架时间:2010-9-6 出版日期:2010 年8月 开本:16开 页码:652 版次:1-1 所属分类:计算机 > 软件与程序设计 > C# 内容简介 书籍 计算机书籍   c#作为微软的旗舰编程语言,深受程序员喜爱,是他们编写高效应用程序的首选语言visual c# 2010新增了大量可圈可点的丰富特性,本书围绕着基础知识和这些新特性全面介绍了如何利用visual studio 2010.net framework 4.0编写应用程序。书中沿袭深受读者欢迎的step by step风格,通过丰富的练习引导读者逐步构建windows应用程序,访问sql server数据库,开发asp.net web应用程序,创建并使用web服务等。   全书共29章,结构清晰,叙述清楚。所有练习均在visual studio 2010简体中文版上进行过全面演练。无论是刚开始接触面向对象编程的新手,还是打算转移到c#的具有c,c++或者java基础的程序员,都可以从本书中吸取到新的知识。 作译者 john sharp,content master首席技术专家。content master隶属于cm集团,cm集团是英国家从事技术文档创作和咨询的专业公司。john sharp是负责net framework和互操作性问题的专家,已经针对分布式系统、web服务和c#语言发布了大量相关的教程、白皮书和演示文档。他具有丰富 目录 第i部分 visual c#visual studio 2010概述 第1章 欢迎进入c#编程世界 3 1.1 开始在visual studio 2010环境中编程 3 1.2 编写第个程序 8 1.3 使用命名空间 12 1.4 创建图形应用程序 15 第1章快速参考 222章 使用变量、操作符和表达式 25 2.1 理解语句 25 2.2 使用标识符 26 2.3 使用变量 27 2.3.1 命名变量 27 2.3.2 声明变量 28 2.4 使用基本数据类型 28 2.4.1 未赋值的局部变量 29 2.4.2 显示基本数据类型值 29 2.5 使用算术操作符 33 2.5.1 操作符和数据类型 33 2.5.2 深入了解算术操作符 35 2.5.3 控制优先级 37 .2.5.4 使用结合性对表达式进行求值 38 2.5.5 结合性和赋值操作符 38 2.6 变量的递增和递减 39 2.7 声明隐式类型的局部变量 40 第2章快速参考 42 第3章 方法和作用域 43 3.1 创建方法 43 3.1.1 声明方法 43 3.1.2 从方法返回数据 44 3.1.3 调用方法 46 3.2 使用作用域 48 3.2.1 定义局部作用域 48 3.2.2 定义类的作用域 49 3.2.3 重载方法 50 3.3 编写方法 50 3.4 使用可选参数和命名参数 57 3.4.1 定义可选参数 58 3.4.2 传递命名参数 58 3.4.3 消除可选参数和命名参数的歧义 59 第3章快速参考 63 第4章 使用决策语句 65 4.1 声明布尔变量 65 4.2 使用布尔操作符 66 4.2.1 理解相等和关系操作符 66 4.2.2 理解条件逻辑操作符 66 4.2.3 短路求值 67 4.2.4 操作符的优先级和结合性总结 68 4.3 使用if语句来做出决策 68 4.3.1 理解if语句的语法 69 4.3.2 使用代码块来对语句进行分组 70 4.3.3 嵌套if语句 70 4.4 使用switch语句 75 4.4.1 理解switch语句的语法 75 4.4.2 遵守switch语句的规则 76 第4章快速参考 79 第5章 使用复合赋值和循环语句 81 5.1 使用复合赋值操作符 81 5.2 使用while语句 82 5.3 编写for语句 86 5.4 编写do语句 88 第5章快速参考 95 第6章 管理错误和异常 97 6.1 处理错误 97 6.2 尝试执行代码和捕捉异常 98 6.2.1 未处理的异常 99 6.2.2 使用多个catch处理程序 100 6.2.3 捕捉多个异常 100 6.3 使用checked和unchecked整数运算 104 6.3.1 编写checked语句 105 6.3.2 编写checked表达式 106 6.4 抛出异常 107 6.5 使用finally块 111 第6章快速参考 112 第ii部分 理解c#语言 第7章 创建并管理类和对象 117 7.1 理解分类 117 7.2 封装的目的 118 7.3 定义并使用类 118 7.4 控制可访问性 119 7.4.1 使用构造器 120 7.4.2 重载构造器 121 7.5 理解静态方法和数据 128 7.5.1 创建共享字段 129 7.5.2 使用const关键字创建静态字段 130 7.5.3 静态类 130 7.5.4 匿名类 132 第7章快速参考 134 第8章 理解值和引用 135 8.1 复制值类型的变量和类 135 8.2 理解null值和可空类型 139 8.2.1 使用可空类型 140 8.2.2 理解可为空类型的属性 141 8.3 使用ref和out参数 142 8.3.1 创建ref参数 142 8.3.2 创建out参数 143 8.4 计算机内存的组织方式 145 8.5 system.object类 147 8.6 装箱 147 8.7 拆箱 148 8.8 数据类型的安全转换 149 8.8.1 is操作符 150 8.8.2 as操作符 150 第8章快速参考 152 第9章 使用枚举和结构来创建值类型 155 9.1 使用枚举 155 9.1.1 声明枚举 155 9.1.2 使用枚举 156 9.1.3 选择枚举文字常量值 157 9.1.4 选择枚举的基本类型 157 9.2 使用结构 159 9.2.1 声明结构 161 9.2.2 理解结构和类的区别 162 9.2.3 声明结构变量 163 9.2.4 理解结构的初始化 164 9.2.5 复制结构变量 167 第9章快速参考 170 第10章 使用数组和集合 171 10.1 什么是数组 171 10.1.1 声明数组变量 171 10.1.2 创建数组实例 172 10.1.3 初始化数组变量 173 10.1.4 创建隐式类型的数组 173 10.1.5 访问单独的数组元素 174 10.1.6 遍历数组 175 10.1.7 复制数组 176 10.1.8 使用多维数组 177 10.1.9 使用数组来玩牌 178 10.2 什么是集合类 184 10.2.1 arraylist集合类 185 10.2.2 queue集合类 187 10.2.3 stack集合类 188 10.2.4 hashtable集合类 189 10.2.5 sortedlist集合类 190 10.2.6 使用集合初始化器 191 10.2.7 比较数组和集合 192 10.2.8 使用集合类来玩牌 19210章快速参考 195 第11章 理解参数数组 197 11.1 使用数组参数 199 11.1.1 声明params数组 200 11.1.2 使用params object[] 201 11.1.3 使用params数组 203 11.2 比较参数数组和可选参数 205 第11章快速参考 207 第12章 使用继承 207 12.1 什么是继承 207 12.2 使用继承 208 12.2.1 调用基类构造器 209 12.2.2 类的赋值 210 12.2.3 声明new方法 212 12.2.4 声明virtual方法 213 12.2.5 声明override方法 214 12.2.6 理解protected访问 217 12.3 理解扩展方法 22212章快速参考 225 第13章 创建接口和定义抽象类 227 13.1 理解接口 227 13.1.1 定义接口 228 13.1.2 实现接口 228 13.1.3 通过接口来引用个类 230 13.1.4 使用多个接口 230 13.1.5 显式实现接口 230 13.1.6 接口的限制 232 13.1.7 定义和使用接口 233 13.2 抽象类 241 13.3 密封类 243 13.3.1 密封方法 243 13.3.2 实现并使用个抽象类 243 第13章快速参考 248 第14章 使用垃圾回收和资源管理 251 14.1 对象的生存期 251 14.1.1 编写析构器 252 14.1.2 为什么要使用垃圾回收器 254 14.1.3 垃圾回收器的工作机理 255 14.1.4 慎用析构器 255 14.2 资源管理 256 14.2.1 disposal方法 256 14.2.2 异常安全的disposal方法 257 14.2.3 using语句 257 14.2.4 从析构器中调用dispose方法 259 14.3 实现异常安全的disposal 260 第14章快速参考 263 第iii部分 创 建 组 件 第15章 实现属性以访问字段 267 15.1 使用方法来实现封装 267 15.2 什么是属性 269 15.2.1 使用属性 271 15.2.2 只读属性 271 15.2.3 只写属性 272 15.2.4 属性的可访问性 272 15.3 理解属性的局限性 273 15.4 在接口中声明属性 275 15.5 生成自动属性 277 15.6 使用属性来初始化对象 279 第15章快速参考 283 第16章 使用索引器 285 16.1 什么是索引器 285 16.1.1 没有使用索引器的例子 285 16.1.2 使用索引器的同个例子 287 16.1.3 理解索引器的accessor 289 16.1.4 对比索引器和数组 290 16.2 接口中的索引器 292 16.3 在windows应用程序中使用索引器 293 第16章快速参考 297 第17章 中断程序流程并处理事件 299 17.1 声明和使用委托 299 17.1.1 自动化工厂的例子 300 17.1.2 不使用委托来实现工厂 300 17.1.3 使用委托来实现工厂 301 17.1.4 使用委托 303 17.2 lambda表达式和委托 308 17.2.1 创建方法适配器 308 17.2.2 将lambda表达式作为适配器使用 309 17.2.3 lambda表达式的形式 309 17.3 启用事件通知 311 17.3.1 声明事件 311 17.3.2 订阅事件 312 17.3.3 取消订阅事件 313 17.3.4 引发事件 313 17.4 理解wpf用户界面事件 313 第17章快速参考 319 第18章 泛型概述 321 18.1 object存在的问题 321 18.2 泛型解决方案 323 18.2.1 对比泛型类与泛化类 325 18.2.2 泛型和约束 325 18.3 创建泛型类 325 18.3.1 二叉树理论 325 18.3.2 使用泛型构造二叉树类 328 18.4 创建泛型方法 337 18.5 可变性和泛型接口 340 18.5.1 协变接口 341 18.5.2 逆变接口 343 第18章快速参考 345 第19章 枚举集合 347 19.1 枚举集合中的元素 347 19.1.1 手动实现枚举器 348 19.1.2 实现ienumerable接口 352 19.2 使用迭代器来实现枚举器 354 19.2.1 个简单的迭代器 354 19.2.2 使用迭代器为tree(titem) 类定义枚举器 356 第19章快速参考 358 第20章 使用查询表达式来查询内存中的数据 361 20.1 什么是语言集成查询 361 20.2c#应用程序中使用linq 362 20.2.1 选择数据 363 20.2.2 筛选数据 366 20.2.3 排序、分组和聚合数据 366 20.2.4 联接数据 368 20.2.5 使用查询操作符 370 20.2.6 查询tree(titem)对象中的数据 372 20.2.7 linq和推迟求值 377 第20章快速参考 380 第21章 操作符重载 383 21.1 理解操作符 383 21.1.1 操作符的限制 384 21.1.2 重载的操作符 384 21.1.3 创建对称操作符 385 21.2 理解复合赋值 387 21.3 声明递增操作符和递减操作符 388 21.4 比较结构和类中的操作符 389 21.5 定义操作符对 390 21.6 实现操作符 391 21.7 理解转换操作符 397 21.7.1 提供内建转换 397 21.7.2 实现用户自定义的转换操作符 398 21.7.3 再论创建对称操作符 399 21.7.4 添加隐式转换操作符 399 第21章快速参考 402 第iv部分 操纵windows应用程序 第22章 windows presentation foundation概述 405 22.1 创建wpf应用程序 405 22.2 在窗体上添加控件 418 22.2.1 使用wpf控件 418 22.2.2 动态更改属性 425 22.3 处理wpf窗体中的事件 429 第22章快速参考 434 第23章 收集用户输入 437 23.1 菜单设计原则和样式 437 23.2 菜单和菜单事件 438 23.2.1 创建菜单 438 23.2.2 处理菜单事件 443 23.3 快捷菜单 449 23.4 windows通用对话框 453 23.5 增强wpf应用程序的响应能力 456 第23章快速参考 464 第24章 执行校验 467 24.1 验证数据 467 用户输入验证策略 467 24.2 示例:订票系统 468 24.2.1 使用数据绑定执行校验 469 24.2.2 改变校验时机 484 第24章快速参考 487 第v部分 管 理 数 据 第25章 查询数据库中的信息 491 25.1 使用ado.net查询数据库 491 25.1.1 northwind数据库 492 25.1.2 创建数据库 492 25.1.3 使用ado.net查询订单信息 494 25.2 使用linq to sql查询数据库 503 25.2.1 定义实体类 503 25.2.2 创建并运行linq to sql查询 505 25.2.3 推迟取回和立即取回 507 25.2.4 联接表和创建关系 507 25.2.5 再论推迟取回和立即取回 511 25.2.6 定义自定义的datacontxt类 512 25.2.7 用linq to sql查询订单信息 513 第25章快速参考 517 第26章 使用实体框架和数据绑定显示和编辑数据 519 26.1 通过实体框架进行数据绑定 520 26.2 通过数据绑定修改数据 534 26.2.1 更新现有数据 534 26.2.2 处理冲突的更新 535 26.2.3 添加和删除数据 537 第26章快速参考 545 第vi部分 使用visual studio 2010构建专业解决方案 第27章 任务并行库入门 549 27.1 为何使用并行处理来执行多任务处理 550 27.2 在桌面应用程序中实现多任务处理 551 27.2.1 任务、线程和线程池 552 27.2.2 创建、运行和控制任务 553 27.2.3 使用task类实现并行处理 557 27.2.4 使用parallel类对任务进行抽象 564 27.2.5 什么时候不使用parallel类 568 27.2.6 从任务返回值 571 27.3 任务和ui线程起使用 574 27.4 取消任务和处理异常 578 27.4.1 协作式取消的原理 578 27.4.2 使用aggregateexception类处理任务异常 586 27.4.3 为canceled和faulted任务使用延续任务 589 第27章快速参考 590 第28章 执行并行数据访问 593 28.1 用plinq并行进行声明式 数据访问 593 28.1.1 用plinq增强遍历集合时的性能 594 28.1.2 指定plinq查询选项 598 28.1.3 取消plinq查询 598 28.2 同步并发的命令式数据访问 599 28.2.1 锁定数据 602 28.2.2 tpl提供的同步基元 603 28.2.3 取消和同步基元 609 28.2.4 并发集合类 609 28.2.5 使用并发集合和锁来实现线程安全的数据访问 61128章快速参考 620 第29章 创建和使用web服务 623 29.1 web服务的定义 623 29.2 web服务架构 624 29.2.1 soap web服务 625 29.2.2 rest web服务 627 29.3 构建web服务 628 29.3.1 创建productinformation soap web服务 628 29.3.2 soap web服务、客户端 和代理 635 29.3.3 消费productinformation soap web服务 636 29.3.4 创建productdetails rest web服务 641 28.3.5 使用productdetails rest web服务 647 第29章快速参考 651
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值