c#学习笔记
异常处理的机制
1.异常处理的基本语法
int x=0;
try
{
int y=100/x;
}
catch(Exception e) //捕获异常 Ststem.Exception
{
Console.Writeline(e.Message); //打印异常消息 或者处理异常的操作
}
finally // 不管是否捕捉到异常 都要执行
{
Console.Writeline("不管怎么样,都打印");
}
// 放在finally后不执行
throw new NullReferenceException().//扔出异常
2.异常类
System.IO.IOException //处理I/O错误
System.IndexOutOfRangeException //处理当方法只想超出范围的数组索引时生成的错误
System.ArrayTypeMismatchException //处理当数组类型不匹配时生成的错误
System.NullReferenceException //报空
System.DivideByZeroException //处理当除以零是生成的错误
System.InvalidCastException // 处理在类型转换期间生成的错误
System.OutOfMemoryException // 处理空闲内存不足生成的错误
System.StackOverflowException // 处理栈溢出生成的错误
3.创建用户自定义异常
用户自定义的异常类需要继承 ApplicationException
class TestTemperature
{
static void Main(string[] args)
{
Temperature temp = new Temperature(); // 实例化一个温度类
try
{
temp.showTemp();//温度类中 当温度为零 会出现异常TempIsZeroException
}
catch(TempIsZeroException e) // 捕捉到异常
{
Console.WriteLine("TempIsZeroException: {0}", e.Message); // 打印异常信息
}
Console.ReadKey();
}
}
public class TempIsZeroException : ApplicationException // 继承 ApplicationException
{
public TempIsZeroException (string message):base (message) // 构造方法
{
}
}
public class Temperature
{
int temperature = 0;
public void showTemp()
{
if(temperature==0)
{
throw (new TempIsZeroException("Zero is found"));
}
else
{
Console.WriteLine("Temperature:{0}",temperature);
}
}
}
文件的输入与输出
这里普及一个知识 流:通过通信路径传递的字节序列。有两个主要的流:输入流和输出流。输入流用于从文件从文件读取数据(读操作),输出流用于向文件写入数据(写操作)。
I/O类
BinaryReader 从二进制流读取原始数据
BinaryWriter 以二进制格式写入原始数据
BufferedStream 字节流的临时存储
Directory 有助于操作目录结构
Directoryinfo 用于对目录执行操作
Driveinfo 提供驱动器的信息
Fire 有助于处理文件
FileInfo 用于对文件执行操作
FileStream 用于文件中任何位置的读写
MemoryStream 用于随机访问存储再内存中的数据流
Path 对路径信息执行操作
StreamReader 用于从字节流中读取字符
StringWriter 用于写入字符串缓冲区
FileStream 类
System.IO命名空间中的FileStream类有助于文件的读写与关闭。这个类派生自抽象给类Stream。
FileStream F = new FileStream("sample.txt",FileMode.Open,FileAccess.Read,FileShare.Read);
参数 | 描述 |
---|---|
FileMode | Append:打开一个已有的文件,并将光标防止在文件的末尾。如果文件不存在,则创建文件。 Create:创建一个新的文件。如果文件已存在,则删除就文件,然后创建新文件。 CreateNew:指定操作系统应该床i教案一个新的文件,如果文件已存在,则抛出异常。 Open:打开一个已有的文件。如果文件不存在,则抛出异常 OpenOrCreate:指定操作系统应打开一个已有文件。如果文件不存在,则用指定的名称创建一个新的文件打开。 Truncate: 打开一个已有文件,文件一旦打开,就将被截断为零字节大小。然后我们可以向文件写入全新的数据,但是保留文件的初始创建日期。如果文件不存在,则抛出异常。 |
FileAccess | FileAccess枚举的成员有:Read、ReadWrite和Write、Write |
FileShare | Inheritable:允许文件句柄可由子进程继承。Win32 不直接支持此功能。 None:谢绝共享当前文件。文件关闭前,打开该文件的任何请求(由此进程或另一进程发出的请求)都将失败。 Read:允许随后打开文件读取。如果未指定此标志,则文件关闭前,任何打开该文件以进行读取的请求(由此进程或另一进程发出的请求)都将失败。但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。 ReadWrite:允许随后打开文件读取或写入。如果未指定此标志,则文件关闭前,任何打开该文件以进行读取或写入的请求(由此进程或另一进程发出)都将失败。但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。 Write:允许随后打开文件写入。如果未指定此标志,则文件关闭前,任何打开该文件以进行写入的请求(由此进程或另一进过程发出的请求)都将失败。但是,即使指定了此标志,仍可能需要附加权限才能够访问该文件。 Delete:允许随后删除文件。 |
类的深入理解
类有 定义与声明 字段与属性(属性的好处再后面代码量上去才能体会)
编程规范上 定义类时 习惯把所有的字段设置为 private 只可以在类内部访问,你不可以通过对象访问
为字段提供 set 方法,来设置字段的值 这便是通过属性来访问字段
pubilic int Age{get ;set} 属性的简写形式 自动生成age的字段。
匿名类型
var age=100;这里再给age赋值的时候 将age的类型确定为 int 类型 后面给age赋其他类型的值就会报错
如果如果var age ; 不赋值 则可以赋任何类型的值。
这里 var list=List(){1,2,3}; 泛型列表 就是匿名类型 一开始并不知道他的类型
GC Garbage Collector 垃圾回收器
值类型和引用类型在内存中的储存形式 值入栈 引用类型 的声明放在栈中 存内存地址 值放在堆中 当在堆中 申请的内存没有引用了 GC就会回收内存。
装箱与拆箱
装箱必要条件时 两类有继承关系 int i =100;obj a= i; 这个a时装箱后的int类型 string s =i.ToString(); 这string类型还是string类型 他们之间没有继承关系 所以不是装箱。
装箱 字面意思 把栈里的值类型 copy到堆里装起来 然后返回内存地址 给栈中的obj引用
拆箱(有装箱操作之后才会有拆箱操作) 字面意思 把堆里的东西copy一份 拆出来直接放进栈里
抽象类
抽象类可以包含抽象方法 也可以包含非抽象方法
抽象方法不实现 都是子类来实现
虚方法
virtual 子类 用 override重写 覆盖虚方法
用 new 重写的话就是隐藏虚方法 申明父类调用父类的virtual方法 如 People p= new Sudent;
这里和类里的变量不一样 声明父类A a= new 子类B();这里存在一个向上转型 就是这里只能调用父类的成员变量。
泛型
通过参数化类型来实现在同一份代码上操作多种数据类型。利用“参数化类型”将类型抽象化,从而实现灵活的复用。
泛型类的定义
class ClassA<T>{//T代表一个数据类型,当使用ClassA进行构造的时候,需要制定T的类型
private T a;
private T b;
public ClassA(T a,T b){
this.a=a;
this.b=b;
}
public string GetSum(){
return a+""+b;//a+b 类型不确定 所以直接给他转成string
}
}
泛型方法
public static string GetSum<T>(T a,T b){
return a+""+b;
}