C#学习笔记(六)

6 篇文章 1 订阅
1、Path类

    在System.IO命名空间中,是一个静态类。用来对路径信息进行操作的类。尤其当我们处理文件的时候非常有用。

string str=@"C:\Users\Administrator\Desktop\1.txt";
Path.GetFileName(str);//获得文件名1.txt
Path.GetFileNameWithoutExtention(str);//获得没有扩展名的文件名,1
Path.GetExtention(str);
Path.GetDirectoryName(str);
Path.Combine(@"C:\","b.txt");//合成文件路径
Path.GetFullPath(str);
2、编码

    将字符串以什么样的形式保存为二进制,这个就是编码,常用的有UTF-8(主要用于Web应用中)、ASCII、Unicode(比较通用的一种编码格式)、gbk。

    产生乱码的原因:保存文件所使用的编码格式,与打开文件所使用的编码格式不一致。

3、File类

    也在System.IO类中,是一个静态类。

File.Create(@"C:\Users\Administrator\Desktop\1.txt");
File.Delete(@"C:\Users\Administrator\Desktop\1.txt");
File.Copy();

//文件读取
byte[] buffer=File.ReadAllBytes(@"");//将文件一次性读到buffer中
string s=Encodeing.Default.GetString(buffer);//将buffer中的字符数组按照默认的编码格式转换为String字符串
//文件写入
string str="你好";//待写入字符串
byte[] buffer=Encoding.Default.GetBytes(str);//按照默认的编码格式将字符串转换为byte数组
File.WriteAllBytes(@"",buffer);//将buffer中的数组写入指定文件中
//以每一行读取文件
string[] contents=File.ReadAllLines(@"",Encoding.Default);
foreach(string item in contents)
{
   Console.WriteLine(item);
}
//读入全文本
string str=File.ReadAllText(@"",Encoding.Default);
//与此对应的是
File.WriteAllLines();
File.WriteAllText();

注:以字节byte数组读写数据的方式可以读写任何类型的文件,因为所有文件的存储都是以字节的方式存储的,而后面几种方式只能读取文本文件。

注:File只能读取小文件,因为其每次都是一次性把所有数据都读进来,这种方式对内存来说负荷很大,所以应付小文件还OK。对于大文件还是推荐使用文件流

4、文件流

    文件流包括三种:FileStream、StreamReader、StreamWriter。其中FileStream是操作字节的,而后两个是操作字符的,因此FileStream可以用来操作任何类型的文件,而StreamReader和StreamWriter只能用来操作文本文件。

//读数据
FileStram fsread=new FileStream(@"",FileMode.方式,FileAccess.Read);//按照指定的方式打开指定的文件
byte[] buffer=new byte[1024*1024*5];//开辟一块5M的buffer用来读取数据
int r=fsread.Read(buffer,0,buffer.Length);//从指定的文件中把0到buffer.Length字节长度的数据读到buffer中
string s=Encoding.Default.GetString(buffer,0,r);//将buffer中实际长度的数据按照默认的编码格式转换为string
fsread.Close();//关闭流
fsread.Dispose();//释放流所占用的资源

//在上述过程中,最后我们需要关闭流并且释放流所占用的资源,我们可以使用using语句来帮助我们做这件事
//只要把开辟流以及使用流的过程都放到using语句中,就不用每次都要Close和Dispose了
//写入数据
using(FileStream fswrite=new FileStream(@"",FileMode.OpenOrCreate,FileAccess.Write))
{
     string str="你好";
     byte[] buffer=Encoding.Default.GetBytes(str);
     fswrite.Write(buffer,0,buffer.Length);
}
//这里就不用再Close和Dispose了
注意:在读取和写入文件时的编码格式一定要统一,否则会乱码。
5、装箱和拆箱

    装箱:将值类型转换为引用类型;

    拆箱:将引用类型转换为值类型;

ArrayList list=new ArrayList();
for(int i=0;i<1000000;i++)
{
    list.Add(i);
}
//上述就发生了1000000次装箱过程,每一次装箱过程都会降低程序效率,因此在程序中一般尽量避免发生装箱和拆箱行为

注:看两种类型是否发生装箱或拆箱,要看这两种类型是否存在继承关系,若没有继承,则有可能发生装箱和拆箱,若没有继承,则一定没有发生装箱和拆箱,两种类型有继承关系,说明他们的内存有可能有交集。因此我们较少使用ArrayList集合,而是使用List泛型集合

6、List泛型集合
List<int> list=new List<int>();
list.Add(1);
list.Add(3);
list.Add(5);
....
for(int i=0;i<list.Count;i++)
{
   Console.WriteLine(list[i]);
}
    由于在定义时已经指定了类型,因此在上述for循环中并没有进行装箱或拆箱操作。

   注:List泛型集合可以和数组相互转换,利用ToArray,ToList。

7、字典:Dictionary

    List集合对应的是ArrayList,Dictionary对应的就是键值对集合。

Dictionary<int,string> dic=new Dictionary<int,string>();
dic.Add(1,"张三");
dic[1]="李四";//可利用这种访问方式修改值
foreach(var item in dic.Keys)    //根据键遍历值
{}
foreach(KeyValuePair<int,string> kv in dic)    //同时遍历键和值
{kv.value;   kv.Key;}
8、多态

    让一个对象表现出多种类型。实现多态有三种方式:

  • 虚方法

    将父类的方法标记为虚方法:virtual,然后子类重写该方法:override。

  • 抽象类

    当父类中的方法不知道如何去实现的时候,可以考虑将父类写成抽象类,方法写成抽象方法,使用关键字abstract,子类也是用override来修饰,表示重写。

注:抽象类不允许创建对象,只能放子类对象。

抽象类和虚方法的区别:抽象类中的方法没有实现,虚方法中有实现。

    如果子类继承的是抽象类,那么子类必须要实现父类当中所有抽象成员。抽象成员只能出现在抽象类中,不能出现在非抽象类中,抽象成员的访问修饰符不能使private。抽象类是有构造函数的,虽然不能被实例化。

NOTE:如果父类中的方法有默认的实现,并且父类需要被实例化,这时可以考虑将父类定义成一个普通类,用虚方法实现;如果父类中的方法没有默认实现,父类也不需要被实例化,则可以将该类定义为抽象类。

9、C#中的修饰符

    C#中只有五种修饰符:public、private、protected、internal、protected internal。

其中internal只能在当前项目中访问,在当前项目中,internal和public的权限是一样的。

注:

1)、class的默认修饰符是internal,能够修饰类的只有两个:internal和public

2)、子类的访问权限不能高于父类的访问权限,否则会暴露父类的成员。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值