第一章:深入.NET框架
Microsoft.NET介绍:.NET框架它是开发.NET应用程序的核心基础。
.NET框架的魅力
1.提供一个面向对象的编程环境,完全支持面向对象编程。.NET提高了软件可复用性,可扩展性,可维护性和灵活性。
2.对Web应用的强大支持。
3.对Web service(Web服务)的支持。Web service是.NET非常重要的内容,他可以实现不同应用程序之间的通信。
4…NET框架运行在操作系统之上,是.NET最基础的框架,他提供了创建,部署和运行.NET应用的环境。主要包括公共语言运行时(CLR)和框架类库(.NET Framework FCL)并且支持多种开发语言。也就是我们所说的跨语言。
.NET框架具有主要的两个主要组件:CLR和FCL,CLR是.NET框架的基础。 CLR(公共语言运行时)的两个组件:
CLS(Common Language Specification)公共语言规范
CTS(Common Type System)通用类型系统
面向对象回顾
类和对象:类定义了一组概念的 模型,而对象是真实的实体由对象归纳为类,是归纳对象共性的过程在类的基础上,将状态和行为实体化为对象的过程称为实例化类和属性通过get和set访问器进行访问和设置,用来保障类中数据的安全。
属性访问器分以下三种:
只写属性:只包含set访问器
只读属性:只包含get访问器
读写属性:同时包含get和set访问器
例子:
private string _name;
public string Name
{
get{return _name;}
set{_name=value;}
}
封装
封装又称为信息隐藏是指利用抽象数据类型将数据和数据的操作结合在一起,使其构成一个不可分割的独立体尽可能隐藏内部的细节,只保留一些对外的接口,(与我们将来学习的interface 并不相同,可以理解为公开的属性和放法),使之与外部发生联系。
封装的好处:
- 保证数据的安全性
- 提供清晰的对外接口
- 类内部实现可以任意修改,不影响其他类
将字段封装为 属性是封装的一种方式,类的私有方法也是一种封装。
第二章:深入C#数据类型
值类型和引用类型
C#数据类型和Java数据类型非常相似:
常用数据类型 | Java | C# |
---|---|---|
整型 | int | int |
浮点型 | float | float |
双精度浮点 | double | double |
字符串 | String | string |
布尔值 | boolean | bool |
枚举类型 | enum | enum |
1、值类型
每个值类型的对象都有一个独立的内存区域用于保存自己的值,值类型所在的内存区域成为栈,值类型主要包括基本数据类型(int float double…)和枚举类型等。
对于值类型,不同的变量会分配不同的空间,并且存储空间中储存的该是变量的值,赋值操作传递是变量值,改变一个变量的值是不会影响另一个变量的值。
值类型举例:
class Program
{
static void Main(string[] args)
{
int heightZhang = 170;
int heightLi = heightZhang;
Console.WriteLine("去年张浩的身高是:"+heightZhang+",李明的身高是:"+heightLi);
heightLi = 180;
Console.WriteLine("今年张浩的身高是:"+heightZhang+", 李明的身高是:"+heightLi);
}
}
2.引用类型
在C#中引用类型主要包括数组,类和接口。
对引用类型,赋值是把原对象的引用传递给另一个应用。对数组而言,当一个数组引用赋值给另一个数组引用后,这两个引用指向同一个数组,也就是指向同一块存储空间
3.拆箱和装箱
拆箱:拆箱是引用类型转化为基本类型
装箱:装箱是基本类型转化为引用类型
举例:
static void Main(string[] args)
{
int i = 123;
object o = i;//装箱
i = 456;//改变i的内容
Console.WriteLine("值类型的值为{0}",i);
Console.WriteLine("引用类型的值为{0}", o);
}
static void Main(string[] args)
{
int i = 123;
object o = i;//拆箱
int j = (int)o;
Console.WriteLine("j的值现在为:" + j);
Console.ReadLine();
}
2.不同类型的参数传递
1.概述
(1)使用值传递,在方法中对参数值的更改在调用后不保留。
(2)使用ref方式传递,可以保留对参数值的更改。
2.值方式传递参数
在值方式传递参数时,参数可以是引用类型,也可以是值类型。
class Program
{
public void Vote(StructSE se)
{
//人气值增加1
se.Popularity++;
}
static void Main(string[] args)
{
StructSE zhang = new StructSE();
zhang.Age = 25;
zhang.Name = "张靓";
zhang.Gender = "1201";
zhang.Popularity = 10;
//投票前
MessageBox.Show(zhang.SayHi());
Program voter = new Program();
voter.Vote(zhang);//值类型做参数
//投票后
MessageBox.Show(zhang.SayHi());
}
}
第三章:使用集合组织相关的数据
1.集合的概述
ArrayList
1.ArrayList非常类似于数组,也有人称它为数组列表,ArrayList可以动态维护。ArrayList类属于System.Coolections命名空间,使用它使一定要导入命名空间。
using System.Coolections;
//创建容量为0的ArrayList对象
ArrayList stu = new ArrayList();
//创建容量为5的ArrayList对象
ArrayList stu1 = new ArrayList(5);
2.ArrayList常用属性和方法
返回值 | 方法名称 | 说明 |
---|---|---|
int | Add(Object value) | 将对象添加到ArrayList的结尾处 |
void | Remove(int index) | 移除ArrayList指定索引处的元素 |
void | RemoveAt(Object vaule) | 从ArrayList中移除特定元素 |
void | Clear() | 从ArrayList中移除所有元素 |
count 获得ArrayList中实际包含得元素数
3.ArrayList得遍历:
for:借助下标
for(int i = 0; i < ArrayList.Count; i++)
{
cw(ArrayList[i]);
}
foreach:借助中间变量
foreach(Object obj in ArrayList)
{
cw(obj);
}
2.HasHtable
ashtable的数据结构统称为哈希表,也有人称它为“字典”,Hashtable的数据时通过键(Key)和值(Value)来组织的。Hashtable属于System.Coolections命名空间,它的每一个元素都是键\值对。
using System.Coolections;
//创建对象
Hashtable ht = new Hashtable();
Hashtable的常用属性和方法:
属性名称 | 说明 |
---|---|
Count | 获取包含在Hashtable中的键/值对的数目 |
Keys | 获取包含在Hashtable中键的集合 |
Values | 获取包含在Hashtable中值的集合 |
返回值类型 | 方法名称 | 说明 |
---|---|---|
void | Add(Object key,Object values) | 将带有指定键和值的元素添加到Hashtable中 |
void | Remove(Object key) | 从Hashtable移除带有特定键的元素 |
void | Clear() | 从Hashtable中移除所有元素 |
Hashtable的遍历:
//得到所有的Value
foreach (Object cvb in ht.Values)
{
Console.WriteLine(cvb);
}
//得到所有的key
foreach (int item in ht.Keys)
{
Console.WriteLine(item);
}
3.泛型和泛型集合
泛型
泛型是C#2.0中的一个新特性。通过泛型可以最大限度地重用代码,保护类型的安全和提高性能。泛型集合可以约束它所储存的对象类型,List和Dictionary<K,V>访问元素无需进行类型转换。
泛型集合List
List:
List<T> 对象名 = new List<T>();
表示任意数据类型,对集合元素类型进行约束。
List的属性和方法。
属性名称 | 说明 |
---|---|
Count | 获取List中实际包含的元素数 |
返回值 | 方法名称 | 说明 |
---|---|---|
int | Add(T value) | 将对象添加到List的结尾处 |
void | Remove(int index) | 移除List指定索引处的元素 |
void | RemoveAt(T vaule) | 从List中移除特定元素 |
void | Clear() | 从List中移除所有元素 |
List的遍历
for(int i = 0; i < list.Count;i++)
{
list[i];
}
foreach(T item in list)
{
cw(item);
}
泛型list和非泛型Arraylist的区别
异同点 | List | ArrayList |
---|---|---|
不同点 | 对所保存元素进行类型约束。添加/读取值类型元素无需拆箱和装箱。 | 可以增加任何类型。添加/读取值类型元素需拆箱和装箱。 |
相同点 | 通过索引访问集合的元素。添加元素方法相同。 | 删除元素方法相同。 |
4.泛型集合Dictionary<K,V>
返回值类型 | 方法名称 | 说明 |
---|---|---|
void | Add(Object key,Object values) | 将带有指定键和值的元素添加到Dictionary中 |
void | Remove(Object key) | 从Dictionary移除带有特定键的元素 |
void | Clear() | 从Dictionary中移除所有元素 |
Dictionary<K,V>的遍历
//得到所有的Value
foreach (Object cvb in dic.Values)
{
Console.WriteLine(cvb);
}
//得到所有的key
foreach (int item in dic.Keys)
{
Console.WriteLine(item);
}
泛型Dictionary<K,V>与非泛型Hashtable的区别
异同点 | Dictionary<K,V> | Hashtable |
---|---|---|
不同点 | 对所保存元素进行类型约束。添加/读取值类型元素无需拆箱和装箱。 | 可以增加任何类型。添加/读取值类型元素需拆箱和装箱。 |
相同点 | 通过Key获取Values。添加元素方法相同。 | 删除元素方法相同。b遍历方法相同。 |
泛型类
1.语法
public class 类名<T>
{
//.........
}
//T是类型参数,代表具体的数据类型,可以是类参数,也可以是基本数据类型
2.泛型的优点:**
1、性能高:泛型无需进行类型的转换操作。
2、类型安全:泛型集合对它所存储的对象进行了类型的约束。
3、实现代码的重用:泛型相当于模板,它支持任何数据类型。
第四章:深入类的方法
1.构造函数
构造函数分无参构造函数和有参构造函数
构造函数的特点:方法名与类名相同,没有返回值类型。
访问修饰符 类名()
{
//方法体
}
有参构造函数:
访问修饰符 类名(参数列表)
{
//方法体
}
构造函数的重载
重载的特点:
1.在同一个类中,相同的方法名,不同的参数。
第六章:初始继承和多态
类的三大特性封装,继承,多态。
1.继承:子类继承父类
2.封装:将某个写类的内部信息私有化
3.多态:一个事务多种形态
public SE{}//子类
public PM:SE{}//父类
一旦产生继承关系,子类里面可以直接使用父类里面所有非private成员
只有public成员,在本类以外new对象可以直接调用
一旦继承了,new子类对象时,父类里面的成员的使用规则跟本类成员的使用规则是一样。
关键字:base:调动父类的成员。this:调用本类的成员
修饰符 | 类内部 | 子类 | 其他类 |
---|---|---|---|
public | 可以 | 可以 | 可以 |
protected | 可以 | 可以 | 不可以 |
private | 可以 | 不可以 | 不可以 |
子类构造函数
1.隐式调用父类构造函数
创建子类对象时会首先调用父类的构造函数,然后才会调用子类本身的构造函数,如果没有指明要调用父类的哪一个构造函数,系统默认调用父类的无参构造函数。
public class School{
public School(){
Console.WriteLine("姓名:"+Name);
}
public string Name{get;set;}
public string Number{get;set;}
}
public class Student:School{
base.Name = "小明同学";
base.Number = "SS7";
public Student(){
Console.WriteLine("学号:"+base.Number);
}
}
显示调用父类构造函数
只要在子类的构造函数后添加“base(参数列表)”,就可以指定该子类的构造函数调用父类的哪一个构造函数了。
public class School{
public string Name{get;set;}
public string Number{get;set;}
public School(string name,string number){
Console.WriteLine("姓名:" + Name + "学号:" + Number);
}
}
public class Student:School{
public Student(string name,string number):base(name,number){ //调用父类含两个参数的构造函数
this.Name = name;
this.Number = number;
}
}
继承
1.继承的单根性
在C#中明确规定一个子类不能同时继承多个父类。
is a的应用
is关键字用来判断对象是否属于给定的类型,如果属于返回true,否则返回false。
继承实现了代码的重用性。
多态
多态按字面的意思就是“多种形态”,指同一操作作用于不同的对象时,可以有不同的解释,产生不同的执行结果。
重写
前提是两个类存在继承关系
不同类多态的实现方式。
特点:在不同类中,相同的方法名,参数的个数、类型不同。
1.虚方法
访问修饰符 virtual 返回类型 方法名(){
//方法体;
}
//在父类中用virtual
访问修饰符 override 返回类型 方法名(){
//方法体;
}
//在子类中用override
2.抽象方法
抽象方法是一个没有实现的方法
关键字:abstract
虚方法 | 抽象方法 |
---|---|
用virtual修饰 | 用abstract修饰 |
要有方法体,即使是一个分号 | 不允许有方法体 |
可以被子类override | 必须被子类override |
除了密封类外都可以定义 | 只能在抽象类中定义 |
特点:不能用sealed和static修饰。sealed表示禁止继承,C#中静态方法只能通过类名去点,static类中只能有static方法。
不能new对象,抽象类可以有抽象方法,也可以没有。