C Sharp(一)
發佈於 2018-10-15
之前本来想学习一下 NodeJS,考虑到最近一直在使用 C#(主要使用 .Net Core 的 MVC 和 API),并且之前也仔细地研究过一段时间的 C#,.Net 平台的发展也有上升趋势,最近微软收购 Github,打算整合自己的平台,还有 Visual Studio 这一个宇宙第一 IDE 加持,所以就打算把后台技术栈先放在 .Net 上。 目前的打算是将 C# 的知识都过一遍,再逐渐学习一些常用类库,最后把 ASP.Net Core MVC 和 API 都好好看看。 这次我打算边复习边将 C# 中的概念与其他语言做一下对比,以方便有其他语言基础的同学可以更好地理解在 C# 中的相似概念。
概述
要注意在使用 .Net 进行开发时,我们要知道 Solution 和 Project 的区别:
- Solution 是针对需求的一个总的解决方案
- Project 则用来解决具体的某个问题
各类 C# 可编写的程序
- Console
- WinForm(old)
- WPF
- WebForm(old)
- WebMVC
- WCF
- WF
- UWP
我们可以使用 C# 写出上述各种类型的应用,有的已经过时了,现在主流使用技术是: WebMVC、WebAPI 以及 WCF。
类型和命名空间
C# 程序的本质是由多个类型声明组成。命名空间则是与某个名称相关联的一组类型声明。(在写 Objective-C 或者 Swift 时,是没有命名空间的概念,所以官方给出的最佳实践是使用前缀的方式来区分不同类型。)
标识符
C# 中标识符规则:
- 字母和下划线可以出现在任意位置
- 数字可以放在除了首位的任意位置
- @字符只可以出现在首位,但不推荐
C# 语言的标识符是大小写敏感的,这一点跟 Objective-C,Swift,JavaScript 都一样。
语句
C# 中的语句必须以分号作为结束标志。 块是由成对的大括号包围的 0 条或多条语句序列,在语法上,相当于一条语句。
- 在语法上只需要一条语句,而一条语句无法表达时,就需要使用块
- 某些特定的程序结构只能使用块
- 虽然简单语句以号结尾,但块后面不跟分号(这样会多解析一条空语句)
字符串插值
新版 C# 可以使用字符串插值,类似 JavaScript 中的字符串插值:
var a = 10; var b = 20; var str = $"a b= {a b}"; |
---|
注释
C# 允许三种注释:
- 单行注释 //
- 多行注释 /**/
- 文档注释 ///
类型,存储和变量
如果要描述程序代码特征的话,我们可以说 C 程序就是一组函数和数据类型,C 程序就是一组函数和类,而 C# 则是一组类型声明。
namespace MyProgram { DeclarationOfTypeA DeclarationOfTypeB class C { static void Main() { } } } |
---|
类型是一种模板
我们学习 C#,其实就是学习如何创建和使用类型,所以我们需要了解什么是类型。 我们可以把类型想象成创建数据结构的模板,模板本身不是数据结构,但可以描述由改模板构造的对象特征。 类型由下面元素定义:
- 名称
- 保存数据成员的结构
- 一些行为和约束
比如,int 类型:
- 名称: int
- 结构: 4 字节
- 行为: 32 位整数
实例化类型
从模板创建实际对象的过程,就称为实例化该类型。
- 通过实例化类型创建的对象,可以称为对象,也可以称为实例
- C# 中,每个数据项都是某种类型的实例
数据成员和函数成员
像 short,long 等这样的类型称为简单类型,只能存储一个数据项。
其他的类型可以存储多个数据项,如数组类型就可以存储多个相同类型的数据项。这些数据项称为数组元素,通过索引来获取每个数组元素。C# 数组这一特征与 Objective-C 相同,与 JavaScript 的特征不同。
然而,另外一些类型可以包含不同类型的数据项,这些类型中的数据项个体称为 成员。 有两种成员:
- 数据成员
- 函数成员
预定义类型
C# 提供了 16 种预定义类型,包括 13 种简单类型和 3 种非简单类型。 所有预定义类型由全小写字母组成,预定义的简单类型包括以下 3 种:
- 11 种数值类型:
- 不同长度的有符号和无符号整数类型
- 浮点数类型: float 和 double
- 高精度小数类型: decimal
- 1 种 Unicode 字符类型: char
- 1 种布尔类型: bool
与 Objective-C 或 JavaScript 不同,C# 中的数值类型不具有布尔含义。
3 种非简单类型:
- string: Unicode 字符数组
- object: 所有其他类型的基类
- dynamic
注意: 在 C# 程序中,应使用小写的 C# 类型名称而不是大写的 .Net 类型名称。
用户定义类型
有 6 种类型可以由用户自己创建:
- class 类型
- struct 类型
- array 类型
- enum 类型
- delegate 类型
- interface 类型
类型通过类型声明创建,类型声明包含以下信息:
- 要创建的类型种类
- 新类型名称
- 对每个成员的声明(array 和 delegate 除外,他们没有命名成员)
一旦声明了类型,就可以像预定义类型一样使用了。
预定义类型已经由系统创建好了,我们直接使用即可,而用户定义类型,我们使用前需要先进行声明,再使用。
值类型和引用类型
对于非成员数据的存储(如函数中的局部变量):
- 值类型存储于栈内存
- 引用类型的 数据部分 存储于堆内存,引用部分 存放在栈内存
对于成员数据,存储有些不同:
- 引用类型的 数据部分 始终存放在堆内存
- 值类型的对象,或者引用类型的 引用部分,可能存储在栈内存,也可能存储在堆内存,取决于执行环境
C# 类型分类
- 预定义类型: 对于简单类型都是值类型,非简单类型都是引用类型
- 用户定义类型: struct 和 enum 类型是值类型,其他 4 种是引用类型
变量
C# 提供了 4 中变量:
- 本地变量
- 字段
- 参数
- 数组元素
变量在使用前必须声明。变量声明完成了两件事:
- 给变量命名,并关联了一种类型
- 让编译器为它分配了一块内存
我们还可以直接在声明时初始化变量。 一些类型的变量如果在声明时没有初始化,那么会被自动设置为默认值。 注意: 本地变量和参数不会被自动初始化,类字段,结构字段和数组元素会被自动初始化。