第六天
蓝色的关键字是c#语言的 大写的都是代表的微软中间语言的
CLR的一个核心功能-----垃圾回收;
目的:提高内存利用率;
垃圾回收器, 只回收托管堆中的内存资源,不回收其他资源(数据库连接, 文件句柄, 网络端口等); 只回收引用类型,不回收值类型
没有变量引用的对象, 没有变量引用的对象,表示可以被回收了(null), 断了线的风筝, 再也回不来了;
例子: 大学食堂(自己收盘子), 大排档(不需要程序员自己收盘子)
回收时间: 不确定, 当程序需要新内存的时候开始执行回收;
GC.Collect(); //手动调用垃圾回收器, 一般不需要手动调用垃圾回收, 由系统自动调用;
最好不要手动调用,因为垃圾回收有一系列的算法,需要移动对象等等, 这时为了达到目的, 需要暂停应用程序的已处理, 这时如果频繁的调用垃圾回收反而影响性能;
什么样的情况下是可以回收的:
垃圾回收: 从0代开始, 当0代满时, 就进行就会回收,并把不需要回收的放入第1 代, 当内存不足时 再次对0代进行回收, 剩余的放入第1 代,当第1代也满是, 才回收第1代,并把幸存者放入第2 代, 再次从第0代开始回收; 越老的对象, 活的越长;
只有这3代;
Dispose 垃圾回收
~Class1()
{
//不能手动调用,所以一般回收其他内存,
}
在c++中叫析构函数, 在c#中叫Finalize ()函数, 中文: 终结函数;
在当前对象呗垃圾回收之前会调用Finalize() 函数, 释放其他资源;
Object pnew = wk .target; //这个可以再次调用若引用中的对象;
若引用
//若引用就是现在不使用的对象, 感觉以后可能使用的,可以使用若引用, 如果系统回收了, 也没有问题的对象;
一般用在, 那些创建时比较耗时的对象;
集合
ArrayList 集合的方法; 集合中可以有任意类型;
ArrayList.count 集合的实际个数, 增加删除时,会随时改变;
.Capacity 属性 ,表示当前集合的容量 翻倍增加的
.capacity 的容量以每次翻倍扩展的;
.Add(object)向集合中增加元素;
.RemoveAt(0) 删除集合中的第0个元素;
这时的s2可以删除, 因为删除前,如果对其进行了重写,则可以删除, 原因是微软内部, 所采用的技术是equals来进行比较的
Hashtable 后面可以用Dictionary来进行代替;
键值对的集合: 键绝对不能重复
键的地址是算出来的, 不是遍历查找出来的, 所以”高性能”;
键中是否包含:
想要遍历键中的所有成员,使用:
单独遍历键
单独遍历值
随机数: 用random产生的随即数都是伪随即数,都是假的, 为随即数就需要一个种子;
只要种子一样,每次产生的随机数都是一样的:
不要讲random写在循环里面;
将集合转换成字符串, 并输出;
StringBuilder sb = new StringBuilder();
for (int i = 0; i <arro.Count; i++)
{
sb.Append(arro[i] + " "); //arro是一个集合;
}
Console.WriteLine(sb.ToString());
泛型集合: 使用泛型集合:
命名空间system. Collections .generic
List<int> list=new list<int>(); int表示当前的类型只能是整型;
Dictionary<k,v>类似于Hashtable, Hashtable的升级版;
通过泛型就可以, 限定集合中存储的数据的类型;
List<int> list = new List<int>();
//增加数据的时候必须是对应的数据类型;
list.Add(10);
list.Add(20);
list.Add(23);
//list.Add("d"); //只能是int类型
for (int i = 0; i <list.Count; i++)
{
Console.WriteLine(list[i]);
}
//返返回值类型变成了整数数组; //list.ToArray();
由于增加的时候都是int类型, 所以取值的时候, 不用类型转换, 直接就是int类型;
微软默认使用泛型集合;
扩展方法,
Console.WriteLine(list.Max());
Console.WriteLine(list.Min());
Console.WriteLine(list.Sum());
这些都是系统为我们准备好的方法, 可以直接使用
Dictionary<string, Person> dict = new Dictionary<string, Person>();
Dictionary<Person, string> dict = new Dictionary<Person, string>();
Person p1 = new Person() { Name = "yjz" };
dict.Add(p1, p1.Name);
Console.WriteLine(dict[p1]);
//键和值是可以相互调换的, 键可以是person类型, 也可以是 string类型
//遍历键
foreach (Person item in dict.Keys)
{
Console.WriteLine(item);
//遍历值
foreach (string item in dict.Values)
{
Console.WriteLine(item);
//即遍历键又遍历值的方法
foreach (KeyValuePair<Person,string> kv in dict)
{
Console.WriteLine("键ü:{0},值μ:{1}",kv.Key,kv.Value);
Var是一个”类型推断”; 在程序的编译的时候就已经换成了对应的数据类型, 所以说var是一个强类型 (指的是在编译的时候已经可以确定数据类型了), 而不是弱类型;
用list可以直接转换成string类型的数组;