S2.1 深入.NET平台和C#编程 个人笔记
深入.NET平台和C#编程
-
第一章,深入.net框架
-
.Net框架
- .Net战略的基础框架
- .Net程序的运行环境
- 强大的类库
-
.Net的两个重要组件:
-
CLR:公共语言运行时
- 提供所有。Net应用运行时的环境
- C# --> MSIL代码—即使编译器(JIT)-平台专用语言—代码被执行
- VB.NET编译器-->
-
CLR(Common Language Runtime)的两个组成部分:
-
CTS:(Common Type System)
- 1.称为通用类型系统
- 2.定义了在IL中的数据类型
-
CLS:(Common Language System)
- 1.称为公用语言规范
- 2.包括集中面向对象的编程语言的通用功能
-
CTS:(Common Type System)
-
FCL(Framework class library):框架类库
- 窗体的类库:Windows.Forms;
- 强大的类库
- 常见的六大类库:
- 使用泛型 Collections.Generic
- 对文件的基本操作 IO
- 对网络协议进行编程 Net
- 对数据库的访问 .Data
- 开发windows应用程序 .windows.Forms
- 对GDI+基本图形的操作 drawing
- 操作系统
-
CLR:公共语言运行时
-
C#编译过程
- C-->
- VB.Net->MSIL->JIT(即时编译器)->平台专用语言->代码被执行
-
封装
-
封装是面向对象的三大特征之一
- 1. 是一个不可分割的独立实体
- 2. 隐藏内部的细节
- 3. 保存对外接口
- 通过访问修饰符授权
- C#程序可以在不同的平台中运行吗?
- C#可以调用VB.NET开发的程序吗
- 类是一个最基本的封装:
- 字段是私有的
- 属性和方法可以是公开的
-
封装-类
- 类是一个最基本的封装
- 类是一个概念
- 定义类
- Classlei{
- }
-
类的属性
- 可读写,只读,只写
- 自动属性
- Public string Name{get;set;}
- 快捷键:prop +tab +tab
-
封装的好处:
- 保证数据的安全
- 提高清晰的对外接口
- 类内部实现可以任意修改,不影响其他类
-
封装的简写:
- Private string name{get;set;}
- 快捷键prop (两下tab)
-
封装是面向对象的三大特征之一
-
面向对象编程:
- 提高软件可复用,可扩展,易维护性,灵活性
- Jsp,asp,php结尾的网站
-
.Net框架
-
第二章,深入C#数据类型
-
-
值类型
- 值类型保存的是值而非引用
- 值类型:不同的变量会分配不同的存储空间
- 存储空间中存储的是该变量的值
- 改变一个变量值不会影响另一个变量值
- 值类型主要包括:int,float,double,short等
-
引用类型
- 引用类型变量储存是指向地址
- 引用类型:赋值是把原对象的
- 引用传递给另一个引用
- 两个引用指向同一块内存空间
- 类,接口,数组
-
结构
- 不建议频繁使用结构,比较费资源
-
结构的好处:
- 查询速度快
- 字段不可以有初始值,如有会报错
- 调用结构时可与不使用new关键词调用 (结构名 J;)即可
-
装箱与拆箱
- 区分装箱与拆箱的方法:有object就是装箱,反之为拆箱,
-
装箱
- 不建议频繁去装箱和拆箱,比较费资源
- 类型需要兼容才可以转换,比如:string就不行
- 自动转换
- object o = i; //装箱,自动转换
- 将值转为?类型
-
拆箱
- int j=(int)o;
- 必须显示转换
- 特殊情况 string值传递
-
不同的参数专递区别
-
UML类图
- 加号(+)表示具有公共可见性。减号(-)表示私有可见性,冒号(:)表示方法返回值类型,*号没出现过
- 特殊情况 string值传递
-
-
第三章,使用集合组织相关数据
-
ArrayList
- ArrayList非常类似于数组
- 这个东西长度可变,当位置不足,它将会自动变大
- 允许重复
- 获取值:集合名[下标]
- 需要using System.Collections;
- //创建容量为0的ArrayList
- ArrayList students =new ArrayList();
- //创建容量为5的ArrayList
- ArrayList students =new ArrayList(5);
- ArrayList添加/删除需要拆箱、装箱。
- Capacity是获取或设置ArrayList可包含的元素数
-
ArrayList的方法
- 键是唯一的
- 集合名[键]获取值;
- .Clear();清空所有元素
- RemoveAt(0); //删除索引为0的元素
- Remove(ela); //删除对象名为ela的元素
- .Count长度
-
不通过Clear清空所有元素
-
Hashtable
- 也属于using System.Collections;空间
- Hashtable名称=new Hashtable();
- 添加方法:
- 名称.Add(索引(数字),“?”);
- 调用:
- 名称[索引]
- Hashtable的remove方法,如果键不存在,不会引发异常
- 需要拆装箱
- 键不允许重复
-
泛型
- 使用泛型时需要引用system.Collections.Gener ic命名空间
- 泛型:操作的数据类型被定义为一个参数
-
泛型的好处:
- 1. 实现代码重用,未来的主流技术
- 2. 性能高,避免繁琐的装箱和拆箱
- 3. 提供了更好的类型安全性
- 4. 提供了更好的类型安全
- 5. .NET支持
- 6. CLR支持泛型
-
泛型类
- Public
- T值类型参数,代表具体的数据类型,可以是类类型,也可以是基本数据类型
-
泛型集合Dictionary<K,V>
-
语法:
- Dictionary <类型,对象> 名称=new Dictionary<类型,对象>();
- Dictionary的remove方法,如果键不存在,不会引发异常
-
添加方法
- dic.Add((键值(数字),“存值”)
- Dictionary类不存在RemoveAt()方法
-
通过key删除元素
- 名称.Remove(“key”);
- 集合的总数
- 名称[名称.Count]
- Dictionary<K,V>无须拆箱和装箱。
-
语法:
-
泛型集合List<T>
- 语法:List<T>对象名=newList<T>();
- T值类型参数,代表具体的数据类型,可以是类类型,也可以是基本数据类型
- 限制数据类型,自动检查类型
- 不需要装箱和拆箱
- 当list里没有值时,不允许调用
-
小知识
- ArrayList和List<T>不是通过键和值组织的,Hashtable和Dictionary是
- ArrayList和Hashtable可以添加任何类型的数据
- Dictionary<K,V>和Hashtable的遍历方法相同,都是通过Key取值
- List<>泛型集合添加/删除无需拆箱、装箱,ArrayList<>泛型集合则需要拆箱、装箱。
-
ArrayList
-
第四章,深入类的方法
-
构造函数
- 1.创建对象时自动调用
- 2.没有编写时构造函数时系统会默认分配一个无参构造函数,但是如果一旦手动编写了构造函数就不会自动分配了,这样的话就会导致使用无参构造函数的时候报错
- 方法与类名相同
- 没有返回值类型
- 主要完成对象的初始化工作
-
无参构造函数|
(每次执行一个类之前都会执行的一个方法)
语法:
访问修饰符 类名(){
//方法体
}- Ctor快捷
-
有参构造函数
|参数列表有一半给类的属性赋值
语法:访问修饰符 类名(参数列表){
//方法体
}
-
方法重载
- 方法重载是指写两个一样名字的方法,想要不报错需要参数个数不一样或是参数类型不一样
- 返回值类型不一样是没有用的,会报错
- 同类,同名,参数不一样(跟返回值是无关的)
- Console类提供多个重载的WriteLine()
-
对象交互
- 对象间交互主要通过参数传递,方法调用以及属性操作等来实现\
-
细节:
- 子类实例化的时候会自动调用父类无参之后再调用子类无参构造函数-
- father f=new son();父类实例化子类的时候会自动调用父类无参之后再调用子类无参
- 使用子类有参时,会先调用父类的无参构造函数
-
构造函数
-
第六章,初始继承和多态
-
继承
- 继承是单根型
-
好处:
- 节省代码量
- 继承是面向对象的一个重要特性
- 在C#中,类可以继承自另一个列
- 子继承父类的方法和数据成员
-
语法:
- class 子类:父类{...}
- 父类就是基类
-
注意:
- 继承需要符合的关系:is-a.如:SE is a Employee (程序员是一个员工)
-
多态: "多种形态"
- 同一个操作用于不同的对象,得到不同的解释,产生不同的结果
- 方法重载也是实现多态性地一种方式.只不过重载的方法都是在同一个类中,而用虚方法实现多态的方法分散在继承关系的多个类中
-
Base
- 语法:
- Base.(父类属性)
-
this和base的用处区别:
- base调用父类对象属性和方法
- this调用当前对象属性和方法
-
访问修饰符
-
ppt图片
-
Public
- 子类继承并可以访问
-
Private
- 子类无法访问
-
Protected
- 只能给子类使用,其他类无法访问
-
构造子类对象,父类做了什么?
- 先调用父类构造函数,再调用子类构造函数
-
隐式调用父类构造函数
- base()
-
显式调用父类的构造函数
- 名字和子类的构造函数一样,类型和父类的一致
- public SE(string id,string name,int age, Gender gender, int popularity): base(id, age, name,gender)
-
ppt图片
-
is a
- 用来进行类型判断
- 布尔类型,如果类型一样返回true反之false
-
巧妙减少判断冗余
-
virtual 虚方法
- 父类虚方法
- 可以有方法实现
-
override 重写
- 重写父类虚方法
- 当子类没有重写时,会去找父类的虚方法
- 方法名,参数列表,返回值一样,提供不同的实现
-
重写和重载的不同:
-
重载
- 同一个类
- 方法名相同
- 参数列表不同
-
重写
- 继承关系中
- 方法名,参数列表,返回值都一样
-
重载
-
抽象方法和虚方法的区别:
-
virtual 虚方法
-
继承
-
第七章,深入理解和多态
-
实现多态
- 1.创建父类变量,实例化子类对象
- 2.把父类类型作为参数类型,该子类及子类对象作为参数传入
-
里式替换原则(LSP)
- 在一个软件系统中子类对象可以替换所有使用父类对象,且程序行为没有变化
-
abstract (抽象的)
- 抽象类里不一定有抽象方法,有抽象类一定会有抽象方法
- abstract修饰符可以和类、方法、属性、索引器、事件一起使用
-
抽象类
- 抽象类不允许实例化 (方法 name=new 方法();
- 抽象类不能使密封的或是静态的
- 抽象类用来列举一个类所需要的行为
- 抽象类不明确提供具体实现方法
- 抽象类必须由其子类实现它的抽象方法(除非子类也具有抽象性)
- 语法:public abstract class
-
抽象方法
- 抽象方法:一个没有实现的方法
- 抽象方法没有方法体
- 子类必须重写抽象父类中所有的抽象方法,除非子类也是抽象类
- 语法:public abstract void ??();
-
使用override实现抽象方法的重写
- [访问修饰符] override 返回类型 方法名() {}
- 将光标放在“:”后的父类名上,按快捷键Shift+Alt+F10,系统会给出抽象方法的默认实现
-
抽象方法和虚方法的区别
- is操作符用于检查对象和指定的类型是否兼容
- as操作符用于两个对象之间的类型转换
-
实现多态
-
第八章,XML
-
XML
- 区分大小写,成对出现
- 用来存储数据的
- Xml文件用xmlReader或xmlTextReader对象读取
-
XmlNode
-
InnerText
- 获取Xml文件某个节点及所有子节点内容的描述
-
InnerText
-
读取步骤
- XmlDocument myXml=new XmlDocument();
- myXml.Load("Engineer.xml"); //读取指定的XML文档
-
XmlNode enginner = myXml.DocumentElement; //读取XML的根节点
-
输出的第一个方法
foreach (XmlNode node in enginner.ChildNodes) //对子节点进行循环
{
//将每个节点的内容显示出来
switch (node.Name)
{
//找到相应的节点
case "ID":
Console.WriteLine("ID:{0}",node.InnerText);
break;
case "Name":
Console.WriteLine("姓名:{0}",node.InnerText);
break;
case "Age":
Console.WriteLine("年龄:{0}", node.InnerText);
break;
}
-
输出的第二个方法
foreach (XmlNode node in xmlRoot.ChildNodes) //对子节点进行循环
{
//按节点名称查找节点对象
Console.WriteLine(node["channelType"].InnerText + "\t" + node["tvChannel"].InnerText + "\t" + node["path"].InnerText);
}
-
输出的第一个方法
-
TreeView 控件重要属性和事件
-
属性
-
Nodes
- TreeView控件中的所有树节点
-
SelectedNode
- 当前TreeView控件中选定的树节点,如果当前没有选定树节点,返回值为null
-
Nodes
-
事件
-
AfterSelect
- 选定树节点之后发生
-
AfterSelect
-
节点对象(TreeNode)的属性
-
Text
- 节点显示的文本
-
Index
- 节点所在集合中的索引
-
Parent
- 节点中的父节点(TreeNode)
-
Tag
- 节点值
-
Nodes
- 节点的所有下一级子节点
-
Level
- 节点在树形菜单中的层级0、1…..
-
Text
-
获取当前选中的节点
- this.tvMenu.SelectedNode
-
为TreeView控件添加根节点(一级节点)
-
方式一:
TreeNode rootNode = new TreeNode("音乐频道");
this.tvMenu.Nodes.Add(rootNode);
-
方式二:
TreeNode rootNode;
rootNode = this.tvMenu.Nodes.Add("音乐频道");
-
方式一:
- 展开所有节点:ExpandOf();
- 树状菜单的清空方法常用在更新树状菜单方法的最前面,这样可以保证节点不被重复加载
- node.Attribute["属性名"].Value; 获取节点的属性值
-
删除节点
- this.tvMenu.SelectedNode.Remove();
-
清空节点
-
this.tvMenu.SelectedNode.Nodes.Clear();
经常用在刷新TreeView显示前
- this.tvMenu.Nodes.Clear(); //清空TreeView控件中所有节点
-
this.tvMenu.SelectedNode.Nodes.Clear();
-
为某选中节点添加子节点
this.tvMenu.SelectedNode.Nodes.Add(node);
-
属性
-
XML
-
第九章
-
静态类与非静态类
-
静态类
- 静态类只包含静态方法,不能被继承及实例化
- 静态方法中只能直接使用静态的成员,实例成员要通过对象进行调用
- 静态方法只能被重载,不能被重写。
-
非静态类
- 都可以有
-
File类是操作文件的类
- FileStream可以创建文件,也可以读取文件
-
写入到textBox
- //创建文件流
- FileStream myfs = new FileStream(path, FileMode.Create);
- //创建写入器
- StreamWriter mySw = new StreamWriter(myfs);
- //将录入的内容写入文件
- mySw.Write(content);
- //关闭写入器
- mySw.Close();
- //关闭文件流
- myfs.Close();
-
AppendText方法
- 无法指定编码格式,默认为UTF-8
-
WriteAllText
- 可以指定编码方式
-
FileMode.CreateNew
- 如果文件不存在,则创建新的文件,如文件存在,则报错
- Directory类提供了操作目录的静态方法,DirectoryInfo类提供了操作目录的实例方法。
- FileInfo类提供了操作文件的实例方法,File类提供了用于操作文件的静态方法
-
StreamWriter
-
可以直接创建文件并且写入数据
- StreamWriter sw = new StreamWriter("路径");
- sw.Write("hello");
- sw.Close();
-
可以直接创建文件并且写入数据
-
静态类
-
静态类与非静态类