zoukankan      html  css  js  c++  java
  • DotNet知识点四

    1、枚举:本质是类
    如果为第一个枚举赋了一个int值,那么后面的枚举项依次递增
    可以将枚举强转成他所代表的int值
    C#的枚举项都是常量(可以用Reflector查看literal的IL源码)
    因为枚举项都有对应的int值,所以Switch把他当成int看
    不能定义方法、属性、事件
    多个枚举有相同数值时,数值强转时,会返回其中最后一个枚举项
    2、IEnumerable接口
      只要实现了该接口,就可以使用foreach进行遍历。foreach循环的本质就是调用这个接口返回一个迭代器,调用迭代器的MoveNext()方法就可以实现循环。

      源码:

    复制代码
    {
    IEnumerator GetEnumerator(); //返回一个迭代器
    }

    public interface IEnumerator
    {
    bool MoveNext();
    object Current { get; }
    void Reset();
    }
    复制代码
      以上不难看出:

      IEnumerable接口中主要包括GetEnumerable方法(获取迭代器对象),MoveNext方法(检查是否存在循环的下一个元素),GetCurrent方法(获得当前循环到的元素)

    3、集合
      基本概念
        集合就是能装一堆东西的容器。主要分为非泛型集合和泛型集合

        ArrayList——里面真正存储数据的是一个Object[]数组,它对应的泛型是List<T>

        HashTable——非泛型的键值对集合,它对应的泛型是Dictionary<TKey,TValue>

      动态数组和泛型集合的不同点和优缺点:

          动态数组对元素没有任何约束,想添加什么都可以。其根本原因是因为其内部存储数据的是一个Object类型的数组。

          泛型集合是带元素类型约束的集合(对添加里面的元素有一个约束)

          泛型集合避免了装箱、拆箱操作带来的性能损耗,在添加元素时参数类型进行检查

      常用方法
        add(), AddRange(), Insert(), InsertRange(), remove(), removeAt()

        Reverse()——将集合中的元素反转

    4、哈希表
      内部机制:
        HashTable,键值对集合,其内部是一个结构体数组bucket[]。有三个东西:键、值、键的哈西码

        数据主要存储于:private bucket[] buckets;

    private struct bucket
    {
    public object key;
    public object val;
    public int hash_coll;
    }
      存取操作:

        存储的原理:下标是根据key的hash值算出来的。当我们向HashTable中Add元素时,元素储存在HashTable的数组里的下标是根据添加的Key的hash值算出来的(但因为hash值取模数组长度,所以肯定不会超过当前数组长度)。

        每个对象算出来的Hashcode并不是唯一的。有可能出现多个对象的HashCode相同。解决机制:

          a、再次hash一次

          b、桶装模式,将两个相同hashcode的对象装入统一个位置

          c、当新增时,HashTable里的容器数组已经满了,则以数组的两倍扩容

        取值原理:当我们从HashTable里取元素时(根据key来取),会根据key的hash值算出要取的元素的下标,并比较元素里的key和当前要找的key参数的hash值是否相等,同时还要比较两个key的引用是否一致。如果都满足,则确定找到要取的元素。

    5、泛型集合
      引用名称空间:System.Collections.Generic

      List<T>——T是存储的类型

      Dictionary<K,V>

    6、List<T>和ArrayList的性能比较
      ArrayList存值类型需要装箱猜想,而存储引用类型需要类型转换,而List<T>很明显不需要这些额外的开销,高性能显而易见

    7、try语句块的使用时机
      网络操作(套接字),文件操作(IO相关),数据库操作,除法操作(除数为0的时候),强制类型转换操作

    8、Windows Form程序相关文件
      designer.cs设计类和前台两个类是兄弟类的关系(partial)

    9、Path类
      ChangeExtension(修改文件的后缀,“修改”支持字符串层面的,没有真的给文件改名)

        Combine——将两个路径合成一个路径【自动处理路径分隔符的问题】

        GetDirectoryName——得到文件的路径名

        GetExtension——得到文件的扩展名

        GetFileName——得到文件路径的文件名部分

        GetFileNameWithoutExtension——得到去除扩展名的文件名

        GetFullPath——得到文件的全路径,可以根据相对路径获得绝对路径

        GetTempFileName——得到一个唯一的临时文件名

        GetTempPath——得到临时文件夹的路径

        …………

    10、操作文件夹、目录
      Delete——删除目录【recursive表示是否递归删除】

      Exists——判断目录是否存在

      move——移动

      GetDirectories+得到一个目录下的子目录

      GetFiles——得到一个目录下的文件

      …………

    11、操作文件
      File——操作文件、静态类,对文件整体操作。拷贝、删除。剪切等

      AppendAllText——将文本contents附加到文件path中【如果文件不存在,则创建】

      Exists——判断文件path是否存在

      ReadAllLines——读取文本文件到字符串数组中

      ReadAllText——读取文本文件到字符串中

      WriteAllText——将文本contents保存到文件path中,会覆盖旧内容

      Copy——文件拷贝【true表示当文件存在时“覆盖 ”,如果不加true,文件存在时则报异常】

      Create——创建文件

      Delete——如果文件不存在则报错

      DirectoryInfo——文件夹的一个“类”,用来描述一个文件夹对象

      GetParent——得到目录的父目录

      FileInfo——文件夹,用来描述一个文件夹对象

      需要注意:

        获取当前exe文件执行的路径用 Assembly.GetExecutingAssembly().Location ,不要用Directory.GetCurrentDirectory() ,因为获取的是程序当前工作目录,这个路径可能会变

        修改文本编码通过GetEncoding获得该编码

    12、文件流
      FileStream——任意类型

      StreamWriter——字符串写

      StreamReader——字符串读

    13、using语句的本质
      本质是一个try{……}finally语句块

      所有要使用Using关键字来释放资源的类必须实现IDisposable接口

      Close执行了Dispose()并回收对象

      使用Using语句块并不能抓住异常,因为Using里面只做了 try……finally操作,并没有catch语句块,所以在using语句块中还要自己加上try……catch块来捕捉异常

    14、序列化与反序列化
      Serialization特性

      二进制格式化器

      序列化:二进制格式化器,将对象里的字段及值以“文本”的方式保存成文本

        [Serializable]

        BinaryFormatter类方法

          Serialize——对象graph序列化到stream中

          Deserialize——将对象从stream中发序列化,返回值为反序列化得到的对象

        序列化需要注意的:

          a、呀序列化的类型必须标记为:[Serializable]

          b、该类型的父类也必须标记为:[Serializable],反射的时候有一个参数必须是“是否寻找父类对象”

          c、该类型中的所有成员的类型也必须标记为:[Serializable]

          d、序列化只会对类中的字段序列号(只能序列化一些状态信息)

      反序列化:二进制格式化器,先创建一个相同的对象,然后见“文本”里保存的字段的值设置到字段中。按照文本(字段、字段值、类名)信息里的类名,使用反射技术创建新对象,并将对一个字段的值设置到新的对象中

  • 相关阅读:
    1、远程连接工具
    Restful架构API编码规范
    61、springmvc-异步请求-返回DeferredResult
    60、springmvc-异步请求-返回Callable
    59、servlet3.0-异步请求
    58、springmvc-定制与接管SpringMVC
    HTTP层 —— 响应
    HTTP层 —— 请求
    HTTP层 —— 控制器
    HTTP层 —— CSRF保护
  • 原文地址:https://www.cnblogs.com/Mr-Prince/p/12104607.html
Copyright © 2011-2022 走看看