流程控制
顺序
- 普通代码
分支
if else
switch case
break
:可以跳出switch-case
循环,或跳出当前循环配合if
使用case
:后面的值必须是常量,不能是变量,且任何两个case
的值不能相同default
:可有可无,若有则只有一个
循环
for
foreach
- 注意:在
foreach
循环中不要对集合进行add
或remove
操作,会引起异常
- 注意:在
do while
while
return
- 将控制返回到出现
return
语句函数成员的调用地方,结束当前方法- 不带表达式的
return
语句只能用在不计算值的函数成员中,如void
方法等 - 带表达式的
return
只能用在计算值的函数成员中,必须存在一个隐式转换,使得表达式兼容于函数的返回类型
- 不带表达式的
运算符
算术运算符
+
-
*
/
%
关系运算符
<
>
<=
>=
==
!=
赋值运算符
=
+=
-=
*=
/=
%=
自运算符
++
--
(分前置和后置)
成员访问运算符
.
[]
逻辑运算符
!
&&
||
运算符重载
operator
语言特点
- C#是托管语言
- 编译为中间语言IL,执行时通过JIT将需要的模块临时编译为本地代码
- 内存管理:采用GAC垃圾回收机制
- 字符串是基本数据类型,比C++对字符串的处理简单
- 库:C#依赖于.NET类库
C#常用对象
隐式类型 Var
- 不会影响性能
- 声明时必须赋值
匿名类型 Anonymous Type
- 提供一种方便的方法,将一组只读属性封装到单个对象中
- 类型名由编译器生成,不能在源代码级使用
- 每个属性的类型由编译器推断
- 在网站开发中,序列化和反序列化JSON对象时很有用
特点
- 不用声明参数
- 方法体内也不用声明字段或方法类型
- 示例:
var obj = new {myTitle = "文字", myOtherParam = new int[] {1,2,3,4}};
object三个可以重写的方法
Equals(object obj)
GetHashCode()
ToString()
值类型 Value
特点
- 存储在内存的栈中
- 栈的执行效率要比堆的执行效率高
结构 struct
- 初始化使用
new
操作符,但对象分配在栈上 - 不能被继承,是
sealed
- 没有构造函数,但可以添加构造函数
- 没有析构函数
- 没有
abstract
和sealed
(因为不能继承) - 默认是
public
修饰,成员默认是private
修饰 - 可以不使用
new
初始化 - 在结构中初始化实例字段是错误的
- 隐式地从类型
system.ValueType
继承,system.ValueType
继承于system.Object
基本数据类型
int
double
bool
char
decimal
枚举 enum
- 每个枚举类型都有一个相应的整型类型,称为基础类型(underlying type)
- 没有显式声明基础类型时,默认为
int
- 默认继承自
System.Enum
,System.Enum
继承于system.ValueType
引用类型 Reference
- 存储在内存的堆中
string
是char
的数组
string 方法
ToString()
:object
对象的方法ToCharArray()
: 返回char
类型的数组StartsWith
EndsWith
Trim()
: 移除前后空格TrimStart()
/TrimEnd()
String.Join()
: 添加字符串形成新字符串的方法Contains()
StringBuilder
: 不断连接字符串,不重新生成字符串
string 特点
- 不变性
- 读共享,写复制
- 字符串驻留技术
数组
- 长度不变,类型单一
- 一维数组
- 多维数组 (
int[,]
) - 交错数组 (
int[][]
)
集合
List
: 泛型,任意类型,变长的array
: 定长的ArrayList
: 变长的
类
定义
- 将相同的属性和方法的对象封装,抽象出“类”
字段
- 用下划线小写开头:
_name
NULL
不占内存空间- 私有的,必须的,用
private
修饰 - 静态字段只标识一个存储位置,无论创建多少个实例,永远只有一个副本
- 初始化时在构造函数里完成
属性
- 保护字段
- 属性赋值,执行
set
方法 - 属性取值,执行
get
方法 - 用
public
修饰
方法
- 签名(signature)由方法的名称、类型参数的数目、方法参数的数目、修饰符、类型组成
NEW 实例化
- 开辟内存空间
- 创建内存对象
- 调用构造函数
- 隐藏从父类中继承的同名成员
静态类
- 只能包括静态成员
- 无法实例化,只能做工具使用
- 在项目中资源共享
- 本身是占内存的
- 静态函数只能访问静态成员,不能访问实例成员
- 静态类是密封的
- 不包含实例构造函数
- 一个类只能有一个静态构造函数
构造函数
- 名称同类名
- 没有返回值,不能用
void
- 必须用
public
修饰符 - 创建对象时执行,可以重载
- 通过
this
重载本类的构造函数
常用类
Stopwatch
Path
File
FileInfo
FileStream
BinaryFormatter
DirectoryInfo
修饰符
private
protected
public
internal
internal protected
其他
partial
: 部分类sealed
: 密封类readonly
: 只读字段abstract
: 抽象类interface
: 接口
装/拆箱
- 装箱:值类型 -> 引用类型
- 拆箱:引用类型 -> 值类型
特点
- 类型系统的基类是
Object
书籍推荐
- WCF技术内幕
- WCF服务编程
- ASP.NET MVC4 web编程
小知识
命名空间
- 解决类的重名问题,可看作类文件夹
GAC(Garbage Collection)
- Garbage Collection
- 只能在程序结束后,才会释放资源
- 自动回收不再使用的对象所占用的内存
异常处理(exception handling)
- 提供了结构化和可扩展的错误检测和恢复方法
throw new Exception("大家来看啊,这里有一个异常啊");
类型安全(type-safe)
- 避免了读取未初始化的变量、数组索引超出边界或执行未经检查的类型强制转换等情形。
编码
- ASCII128 America
- ASCII256 Europe
- GB2312 CHINA
- Big5 HK.TW
- Unicode 解析慢
- UTF-8 web编码格式
内存
- 堆
- 栈
- 静态存储区
类型转换
Convert.ToInt32
int.Parse
int.TryParse
常量
编译时常量
const 数据类型 常量名=值
- 作为类成员时,总是作为
static
成员出现,不允许加static
关键字 - 必须在编译时确定下来,只支持一些基本类型
- 作为类成员时,总是作为
运行时常量
readonly 数据类型 常量名=值
- 可以弥补编译时常量不能定义复杂数据类型的缺点
进程
- 计算机上的一次执行活动,分为系统进程和用户进程
线程
- 线程和进程的区别:子进程和父进程有相同的代码段,不同的数据段,而多个线程则共享数据段
- 每个线程有自己的执行堆栈和程序计数器
特点
- 使程序能够执行并发处理
- .NET system Threading命名空间封装了线程类库
- 线程共享应用程序的资源
辅助线程
- 可以与主线程一起并行执行代码
方法
Sleep
Interrupt
Abort
线程池ThreadPool
- 多用于服务器应用程序
前后台线程区别
- 一旦所有前台线程在托管进程中被停止,系统将停止所有后台线程并终止程序运行
- 使用
Thread.IsBackground
属性判断是后台线程还是前台线程,或更改其状态
多线程
- 目标是解决高并发的吞吐量和响应性问题
- 资源共享问题,如死锁和争用
- 多线程特别适用于不同资源的任务
线程同步
Mutex
Monitor
Interlocked
AutoResetEvent
ManualResetEvent
安全
- 多线程同时访问相同资源,将产生不可预知的数据破坏
- 对于整数类型的简单操作,可以用
Interlocked
类的成员来实现线程同步
PE (Portable Executable)
- Windows PE
- .NET PE
- IL
- MetaData
- JIT编译IL为二进制机器码,然后解释执行,可能缓存二进制数据
CLR (Common Language Runtime)
- 类似java虚拟机
- 负责托管代码的解释、执行
- 负责资源管理(内存分配、垃圾收集)
- 保证应用程序和底层操作系统之间必要的分离
CLS (Common Language Specification)
- 规定所有.NET语言都应遵循的规则和约束
- 生成可与其他不同语言互操作的应用程序
CTS (Common Type System)
- 包含标准数据类型
- 包含操作准则集
CLR Host托管程序类型
- 任意的.NET托管程序
- 控制台、Winform、WPF、WCF、WF
- IE
- ASP.NET
- shell可执行文件
CLR加载器
- 管理应用程序域
JIT (Just in Time)
- 在CLR的作用下,通过JIT形成二进制机器代码
Ngen
- 在应用程序运行之前,而不是在应用程序运行过程中执行从MSIL到本地代码的转换
IL (Intermediate Language)
- 由一组特定的指令组成,指明如何执行代码
.NET编译执行步骤
- 选择编译器
- 生成MSIL代码
- JIT动态编译为本机代码
- CLR运行代码
组件
- COFF (Common Object File Format)
- 元数据Metadata
程序集assembly
- 托管模块,以及资源文件的逻辑组合
全局程序集Global Assembly Cache
- 将程序集放在全局程序集缓存中,可以在多个应用程序之间共享程序集
加载与卸载
- 程序集仅在需要时才加载到内存中
命名空间
using jj = system.ling.expressions;
命名空间的别名
预处理指令
#pragma warning disable xxxx
禁用所有警告信息pragma warning restore xxxx
启用所有警告信息
WinForm
- 客户端 B/S 架构软件
控件
- TextBox
- ScrollBars
- Label
- Timer
- Radio
- Checkedbox
- WebBrowser
- ComboBox
- Control
对象
- Process
- Socket
- 套接字:用于描述IP和端口号
网络协议
- TCP:安全、稳定、效率低
- UDP:快速、高效、不稳定,易丢包
网络类
- IPAddress类
- IPEndPoint类