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、序列化只会对类中的字段序列号(只能序列化一些状态信息)

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

  • 相关阅读:
    Linkerd 2.10(Step by Step)—将 GitOps 与 Linkerd 和 Argo CD 结合使用
    Linkerd 2.10(Step by Step)—多集群通信
    Linkerd 2.10(Step by Step)—使用 Kustomize 自定义 Linkerd 的配置
    Linkerd 2.10(Step by Step)—控制平面调试端点
    Linkerd 2.10(Step by Step)—配置超时
    Linkerd 2.10(Step by Step)—配置重试
    Linkerd 2.10(Step by Step)—配置代理并发
    本地正常运行,线上环境诡异异常原因集合
    Need to invoke method 'xxx' declared on target class 'yyy', but not found in any interface(s) of the exposed proxy type
    alpine 安装常用命令
  • 原文地址:https://www.cnblogs.com/Mr-Prince/p/12104607.html
Copyright © 2011-2022 走看看