C# 指南

1. C# 中的类

字段,属性,方法,构造器,析构器,类
静态字段,静态属性,静态方法,静态构造器,静态类

2. C# 面向对象编程

  • 封装——把客观事物封装成类,并将类内部的实现隐藏,以保证数据的完整性;
  • 继承——通过继承可以复用父类的代码;
  • 多态——允许将子对象赋值给父对象的一种能力。

派生类继承了除构造器和析构器之外的所有基类成员。但是,继承并不意味着一定能访问。

单继承

3. 接口

C#中不允许多重继承,为了解决这个问题,C#提出了接口的方式,作为“替代版”的多重继承。

接口可以理解为对一组方法声明进行的统一命名,但这些方法没有提供任何实现。也就是说,把一组方法声明在一个接口中,然后继承于该接口的类都需要实现这些方法。

4. 委托

C#中的委托可以理解为函数的一个包装,它使得C#中的函数可以作为参数来被传递,这在作用上相当于C++中的函数指针。C++用函数指针获取函数的入口地址,然后通过这个指针来实现对函数的操作。

委托链

C#中的委托也同样可以封装多个方法。

C#中把封装多个方法的委托称作委托链或多路广播委托。

5. 事件

事件涉及两类角色——事件发布者和事件订阅者。

C#中的事件是一个特殊的多路广播委托,事件默认含有一个私有的委托类型变量,该变量用于保存对事件处理方法的引用,且该委托类型的变量为私有,只能从定义该事件的类中进行访问。

6. 类型

C#中的类型可以分为两种——值类型和引用类型。

什么是值类型和引用类型

值类型主要包括简单类型、枚举类型和结构体类型等。
值类型的实例通常被分配在线程的堆栈上,变量保存的内容就是实例数据本身。

引用类型主要包括类类型、接口类型、委托类型和字符串类型等。
引用类型的实例则被分配在托管堆上,变量保存的是实例数据的内存地址。

值类型与引用类型的区别

值类型通常被分配到线程的堆栈上,而引用类型则被分配到托管堆上。不同的分配位置导致了不同的管理机制,值类型的管理由操作系统负责,而引用类型的管理则由垃圾回收器(又称为Garbage Collection,GC)负责。

值类型实例不一定总会被分配到线程栈上。在引用类型中嵌套值类型时,或者在值类型装箱的情况下,值类型的实例就会被分配到托管堆中。

值类型实例总会被分配到它声明的地方,声明的是局部变量时,将被分配到栈上,而声明为引用类型成员时,则被分配到托管堆上;而引用类型实例总是分配到托管堆上。

值类型的内存不受GC(垃圾回收器)控制,作用域结束时,值类型会被操作系统自行释放,从而减少了托管堆的压力;而引用类型的内存管理则由GC来完成。所以与引用类型相比,值类型在性能方面更具优势。

值类型不能为null值,它会被默认初始化为数值0;而引用类型在默认情况下会初始化为null值,表示不指向托管堆中的任何地址。对值为null的引用类型的任何操作,都会引发NullReferenceExcption异常。

类型转换

  • 隐式类型转换。由低级别类型向高级类型的转换过程。例如,派生类可以隐式地转换为它的父类,装箱过程就属于这种隐式类型转换。
  • 显式类型转换。也叫强制类型转换。但是这种转换可能会导致精度损失或者出现运行时异常。格式为“(type)(变量、或函数)”。其中,“type”是你希望转换的类型,“变量”是需要被转换的原始类型。
  • 通过is和as运算符进行安全的类型转换。
  • 通过.NET类库中的Convert类来完成类型转换。

装箱和拆箱

装箱指的是将值类型转换为引用类型的过程,而拆箱指的是将引用类型转换为值类型。

装箱过程中,系统会在托管堆中生成一份堆栈中值类型对象的副本;而拆箱则是从托管堆中将引用类型所指向的已装箱数据复制回值类型对象的过程。

装箱操作可以具体化分为以下3个步骤。

  1. 内存分配:在托管堆中分配好内存空间以存放复制的实际数据。
  2. 完成实际数据的复制:将值类型实例的实际数据复制到新分配的内存中。
  3. 地址返回:将托管堆中的对象地址返回给引用类型变量。

拆箱过程也可以化分为具体的3个步骤。

  1. 检查实例:首先检查要进行拆箱操作的引用类型变量是否为null,如果为null则抛出NullReferenceException异常;如果不为null则继续检查变量是否和拆箱后的类型是同一类型,若结果为否,会导致InvalidCastException异常。
  2. 地址返回:返回已装箱变量的实际数据部分的地址。
  3. 数据复制:将托管堆中的实际数据复制到栈中。

参数传递问题剖析

在默认情况下,C#方法中的参数传递都是按值进行的,但实际上参数传递的方式共有4种不同的情况,它们分别为:

  • 值类型参数的按值传递
  • 引用类型参数的按值传递
  • 值类型参数的按引用传递
  • 引用类型参数的按引用传递

猜你喜欢

转载自www.cnblogs.com/yongwu/p/9115985.html