zoukankan      html  css  js  c++  java
  • 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[]和字符串的相互转换:?

  • 相关阅读:
    Spring配置文件beans标签报错问题解决
    数据库中日期格式与字符串的转换
    Java回调
    [目录]hybrid app 开发实战(基于ionic,cordova,angularjs)
    基于CommonKADS方法论实现知识库系统
    git常用命令--持续更新
    在Spark shell中基于HDFS文件系统进行wordcount交互式分析
    在Spark shell中基于Alluxio进行wordcount交互式分析
    how to use Sqoop to import/ export data
    Hadoop Ecosytem
  • 原文地址:https://www.cnblogs.com/holong2003/p/3265717.html
Copyright © 2011-2022 走看看