DotNET知识点总结四(笔记整合)

1、枚举:本质是类

  1. 如果为第一个枚举赋了一个int值,那么后面的枚举项依次递增
  2. 可以将枚举强转成他所代表的int值
  3. C#的枚举项都是常量(可以用Reflector查看literal的IL源码)
  4. 因为枚举项都有对应的int值,所以Switch把他当成int看
  5. 不能定义方法、属性、事件
  6. 多个枚举有相同数值时,数值强转时,会返回其中最后一个枚举项

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

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

时间: 2024-08-01 22:40:12

DotNET知识点总结四(笔记整合)的相关文章

.NET知识点总结二(笔记整合)

19.什么是类型? 用来定义某一种数据在内存里开辟空间的大小,还可以预置操作此种类型数据的相关方法 20.this关键字在方法中使用时所代表的含义 this指的是当前类的对象,或者父类的类的对象(base只能指向父类的对象) 21.里氏替换原则 子类替换父类所在的位置 22.C#中的数据类型 值类型 简单类型(数字类型(int,short,long,float,double),字符(char),逻辑值(bool)),结构体(struct),枚举(enum) 引用类型 字符串(string),数组

.NET知识点总结一(笔记整合)

1.   .net framework原理简介,C#程序的两次编译 .NET源代码——>语言编译器(第一次编译)——>MSIL+元数据(exe文件)——>CLR(公共语言运行时——类似于jre)——>机器代码(第二次编译)——>代码被执行 2.Main函数是什么?在程序中使用Main函数有什么需要注意的地方? 程序的入口函数!函数名字不能改变:一个程序中有且只有一个Main函数. 3.CLR是什么?程序集是什么?当运行一个程序集的时候,CLR做了什么事情? Common La

学习IOS开发UI篇--UI知识点总结(四) UITabelView/UITableViewCell

UITabelView:常用属性 @property (nonatomic)          CGFloat    rowHeight;             // will return the default value if unset @property (nonatomic)          CGFloat     sectionHeaderHeight;   // will return the default value if unset @property (nonatom

Docker学习教程笔记整合(完整)

Docker学习教程笔记整合(完整) 本文主要是整理了DockerOne组织翻译的Flux7的Docker入门教程,通过markdown记录,方便离线学习.原文地址,http://dockone.io/article/101. 文中一些链接可能会跳转国外的网站,如果没有插件或开VPN的朋友,可以尝试修改一下Hosts文件,如何修改Hosts文件.或者使用XXNet插件,如何使用XXnet 介绍 Docker是一个新的容器化的技术,它轻巧,且易移植,号称"build once, configure

C#容易被忽视的知识点(四)

19.扩展类 例如想给某个类添加一个新方法,但由于某些原因,不能直接修改类的源代码,可以通过扩展类的方法实现. 具体例子如下: 假设有个类Show 1 public class Show 2 { 3 public void MethodOne() 4 { 5 Console.WriteLine("MethodOne"); 6 } 7 } 8 9 //扩展类 10 public static class ShowExtension 11 { 12 public static void M

DotNET知识点总结五(笔记整合)

1.委托:通常指的是 多播委托 通常的说,委托就是一个存放方法指针的容器,是一个安全的函数指针,供程序员安全调用.委托的本质就是一个类,继承于MulticastDelegate——>Delegate,在Delegate类中有一个IntPtr类型的变量来指向该方法的指针. 通常当方法传递的参数为一个方法时,就用委托. 委托能够将方法作为参数传递,(多播委托)调用一个委托,执行N个方法 2.集合排序 1.Reverse()方法直接反转排序 2.冒泡排序 int temp = 0; for(int i

DotNET知识点总结三(笔记整合)

使用接口的注意事项: 接口中的成员不能加访问修饰符 接口中的成员不能有任何实现 实现接口的子类必须实现接口的全部成员 一个类可以同时继承一个类并实现多个接口,如果一个子类同时继承了父类A,并实现了接口IA,那么在语法上A必须写在IA的前面,因为类是单继承的,而而接口可以多实现 显式实现接口和隐式实现接口时需要注意的问题(我们通常是隐式实现的) 类实现接口,可以显式实现接口里的方法,但是注意:一旦使用显式实现接口里的方法,那么该方法只能被接口变量调用 IFlyable fly = new Bird

java中的对象的序列化与反序列化的知识点---IO学习笔记(四)

对象的序列化,反序列化 对象的序列化: 就是将Object转换成byte序列 对象的反序列化: 将byte序列转换成Object 序列化流,反序列化流 序列化流(ObjectOutputStream),是字节的过滤流->主要方法:writeObject() 反序列化流(ObjectInputStream)->主要方法:readObject() 序列化接口(Serializable) 对象必须实现序列化接口,才能进行序列化,否则将出现异常 这个接口,没有任何方法,只是一个标准. 基本的对象序列化

spring(四) 手动整合web项目(SSH)

清楚了spring的IOC 和 AOP,最后一篇就来整合SSH框架把,记录下来,以后应该会用的到. --WH 一.web项目中如何使用spring? 当tomcat启动时,就应该加载spring的配置文件,而不是每次都要手动使用new  ClassPathXmlApplicationContext来加载xml.所以,spring提供了一个ContextLoaderListener.有了它,tomcat启动时,就会加载配置文件. 导入spring.web....jar 1.web.xml中添加监听