C#7

泛型的目的:代码重用。List<T>这里的T就是个占位符。Type Parameters类型参数。
泛型,在.net2.0本本才开始引入的。
泛型类,泛型方法,泛型委托。

自定义泛型类:
1.索引器
public class ClassMyList
{
 int[] arrInt=new int[]{1,2,3,4,5,6,7};
 public int this[int index]
 {
   get{return arrInt[index];}
   set{arrInt[index]=value}
 }
}
2.自定义泛型:
public class ClassMyList<T>
{
 public ClassMyList(int len)
 {
   arrInt=new T[len];
 }
 private T[] arrInt;
 public T this[int index]
 {
   get{return arrInt[index];}
   set{arrInt[index]=value}
 }
}

疑问:子类继承自定义反省类怎么写?

泛型接口:
1.
public interface ITest<T>
{
  void M1(T t);
  T M2();
  void M3(T obj);
  T PValue
  {
    get;
    set;
  }

}
//实现泛型接口的两种类型
//封闭类型
class MyClass:ITest<string>
{...}
//开放类型
class MyClass<TClass>:ITest<TClass>
{...}

泛型方法:
1.
public class Class1
{
  public void SayHi<T>(T msg)
  {Console.Write(msg);}
}

泛型约束:
public class person<T,T1,TC,TK,TV,TU>
    where T1:struct     //约束T1必须是值类型
    where T:class       //约束T必须是引用类型
    where TC:new()      //这个类型必须带有一个无参数构造函数【1.构造函数不能为私有2.类型不能使抽象的】
    where TK:Car        //约束了TK类型必须为Car类型或者其子类。
    where TV:基类名或者接口名如IComparable //约束了TV必须实现了IComparable接口的类型才可以。
    where TU:T          //约束了TU必须是T的子类或者T。
{...}
=================================================================================================================
装箱和拆箱:
1.装箱:将值类型转换为引用类型的过程。注意使用什么类型装箱,拆想的时候应该用对应类型来拆。
2.拆箱:将引用类型转换为值类型的过程

注:值类型和接口间的转换也是装拆箱的过程。
ArrayList() 的.Add(object obj)所以每次传入值类型都会发生装箱。
=================================================================================================================
foreach
任何类型,只要想使用foreach来循环遍历,就必须在当前类型中存在:public IEnumerator GetEnumerator(){},一般通过实现接口IEnumerable来生成这个方法。在这个方法中return new 类a(即返回一个能遍历的对象),在(这个对象中)类a中许实现接口IEnumerator。在这个实现接IEnumerator的类内部,有实现这个接口的成员,这些成员是用来遍历。object Current这个属是需要遍历的集合的当前值(所以类a需要一个构造函数参数为需要遍历的集合的类型,和需要当前对象的索引所以要一个index索引号)。这个索引号index在方法bool MoveNext(){}中实现自增,当index>= 这个遍历集合.Count返回false 否者返回true。
所以foreach内部做了IEnumerator x=需要遍历的类.GetEnumerator(); while(x.MoveNext()){x.Current.ToString},这里的x即为类a的对象。
=================================================================================================================
Path类的操作都是对字符串的操作,和实际的文件没半毛钱关系。
Path.ChangeExtension(sring path,string kzm);path为路径,kzm为扩展名如“.jpg”。
Path.Combine(string path1,string path2);path1为路径1,path2为路径2,这里把两个路径合起来了,可以处理末尾的问题。
Path.GetFileName(string path);获取path中的文件名。
Path.GetDirectoryName(string path);获取path中的目录不包含文件名。
Path.GetFileNameWithoutExtension(string path);获取文件名不包含扩展名。
Path.GetExtension(string path);只获取扩展名。
Path.GetFullPath(string path);path为相对路径,通过这个方法获取其绝对路径。
Path.GetTempPath();获取一个随机的文件名,并且在临时目录下创建这个文件。
Path.GetRandomFileName();获取一个随机的文件名。

================================================================================================================
 Directory类:
1.创建一个目录Directory.CreateDirectory(@"c: est1");
2.获取当前目录下的所有直接子目录string[] dirs=Directory.Getdirectories(@"c:","*I*",SearchOption.TopDirectoryOnly);表示搜索包含I的目录(当前目录的顶级目录不包含子目录)
3.获取当前目录下的所有直接子文件string[] files=Directory.GetFiles("c:");
4.判断是否存在这个目录 Directory.Exists(string path );
5.删除目录(空目录不空则报异常)Directory.Delete(string path);注意:一定要有目录才能删除否者报错,所以要用.Exists(string path)判断下。
6.删除目录及目录中的内容Directory.Delete(string path,bool a)当a为true时候表示删除目录中的内容及目录本身。
7.Directory.Move(string patha,string pathb)把patha这个路径的文件移动到pathb这里。注意:重命名也用这个方法。
8.DirectoryInfo dirinfo=new DirectoryInfo

=================================================================================================================
 在程序中使用相对路径有时候可能出错,如用户打开了OpenFileDialog对话框。

所以用绝对路径:
1.先获取当前exe文件执行的路径
string exePath=Assembly.GetExecutingAssembly().Location.ToString();
2.去绝对路径的目录加上相对路径
string txtPath=Path.Combine(Path.GetDirectoryName(exePath),"1.txt");
=================================================================================================================
File类:文件操作
产生乱码的原因(只有文本文件才会乱码):文本文件存储时采用的编码,与读取时采用的编码不一致,就会造成乱码问题。解决:采用统一的编码。
1.判断文件是否存在File.Exists(string path);
2.删除文件File.Delete(string path);文件不存在不会报错这个和Directory类的不一样...
3.文件拷贝File.Copy(string patha,string pathb);把文件从patha考到pathb。文件拷贝File.Copy(string patha,string pathb,true);当pathb已经存在了true表示覆盖了。
4.文件移动File.Move(string patha,string pathb);把文件从patha剪切到pathb。3
5.File.Creat(string path);创建文件。
6.File.ReadAllBytes(string path)返回一个byte[]数组。
=================================================================================================================
文件流:
1.创建一个文件流
FileStream fs=new FileStream(string source,FileMode.Open);
2.读或者写
byte[] byts=new byte[fs.Length];
int r=fs.Read(byts,0,byts.Length);第一个参数表示要将文件中的字节读取到数组中,第二个参数表示冲文件中读取出的字节要放到byts数组中。要从第几个索引开始放。第三个参数表示这次最多去多少个字节。返回值r表示本次实际读取到了多少个字节。
3.文件流使用完毕以后,记得关闭,并且释放非托管资源。调用Dispose();
fs.Close();fs.Dispose();
================================================================================================================
byte[]和字符串的相互转换:?

原文地址:https://www.cnblogs.com/holong2003/p/3265717.html