31.类-析构函数
析构函数是在程序结束的时候调用的函数;
~Company() {
Console.WriteLine("Company析构");
}
析构函数一般用来帮助我们释放资源,GC机制并不会在程序结束时立即回收资源,如果需要在程序结束时立即释放资源则可以用析构函数;
32.在一个项目中调用另一个项目的类
①在要调用的项目中添加项目引用(项目右键->添加->项目引用);
②在项目中using 被调用类的命名空间
using ConsoleApp2;
Console.WriteLine("hello");
Console.ReadKey();
Company com = new Company("长春电影制片厂","长春市");
Console.WriteLine("{0}--{1}", com.CompanyName, com.Addr);
33.string
当给一个字符串变量再次赋值的时候,程序会在内存的堆中重新创建一个新的字符串对象,并将引用赋值给字符串变量,这种情况我们称之为字符串的不可变性;
由于gc机制并不会时刻扫描程序,所以频繁修改字符串变量就造成了空间的浪费;
实际开发中如果需要频繁拼接字符串 可以用StringBuilder类,StringBuilder对象对字符串的拼接只在一块内存中,不会频繁开辟内存空间,类似于java的StringBuffer;
Stopwatch sw=new Stopwatch();
StringBuilder sb=new StringBuilder();
sw.Start();
for(int i = 0; i < 100000; i++)
{
sb.Append(i);
}
sw.Stop();
Console.WriteLine(sw.Elapsed);
Console.WriteLine(sb.ToString());
Console.ReadKey();
可以将string类型看成是char类型的只读数组,通过下标获取字符串的某个字符;
string s1 = "HELLO";
Console.WriteLine(s1[2]);
一切方法都可以用toString方法转换成字符串;
34.类-继承
在new子类的时候,子类不会继承父类的构造函数,但是子类会调用父类的无参构造方法创建父类对象,由此子类可以使用父类的属性、方法;
如果父类用有参构造函数重写了无参构造函数,那么子类在创建对象的时候就无法调用父类的无参构造函数,由此会出现程序报错;
解决方法
①父类重写一个无参构造函数;
②子类显示调用父类的有参构造函数,写法:base();
public class LoveMovie:Movie
{
public LoveMovie(string mname) :base(mname)
{
Console.WriteLine("爱情电影");
}
}
35.类的转型
is:判断某个对象是否属于某个类
if (lm is WarMovie)
{
lm.SeeMovie();
}
as :先判断某个对象是否属于某个类,如果是返回一个该类的对象,如果不是返回null
Movie lm=new LoveMovie("爱在黎明破晓前");
WarMovie wm = lm as WarMovie;
if (lm is WarMovie)
{
wm.SeeMovie();
}
36.集合
集合:一堆数据的合集;
集合数据类型相比数组的好处:长度可变,类型随意;
集合的方法:
Add:添加单个元素;
AddRange:将一个集合的每一个元素添加到另一个集合的末尾;
Remove:根据值删除单个元素;
RemoveAt:根据集合下标删除集合元素;
RemoveRange:根据索引删除若干个元素;
Reverse:将元素的顺序反转;
Insert:在集合的指定索引处插入元素;
Contains:判断集合是否某个元素;
LoveMovie lm = new LoveMovie("爱在黎明破晓前");
ArrayList arr=new ArrayList();
arr.Add(123);
arr.Add("aaa");
arr.Add(lm);
int[] iarr = { 2, 3, 56,4, 5 };
arr.AddRange(iarr);
arr.AddRange(arr);
arr.Remove(123);
arr.RemoveAt(0);
arr.RemoveRange(0, 2);
arr.Reverse ();
arr.Insert(0, "插入");
arr.InsertRange(1, new string[] { "bb", "cc", "dd" });
Console.WriteLine(arr.Contains("aaa"));
当给Hashtable存入元素时,Hashtable会先内存申请一个初始容量为4的空间,如果存入的元素的数量超过了当前容量,那么Hashtable就会扩容,扩容系数是2,即Hashtable的容量将扩展为当前容量的2倍;
遍历ArrayList
for(int i=0;i<arr.Length;i++)
{
Console.WriteLine(arr[i]);
}
遍历Hashtable
foreach (var item in arr.Keys)
{
Console.WriteLine(arr[item]);
}
foreach (var item in arr.Values)
{
Console.WriteLine(arr[item]);
}
Hashtable的键是唯一的,值可以是多个相同的;
//hashtable添加元素
if (!arr.ContainsKey("a"))
{
arr.Add("a", "aaaa");
}
//Hashtable通过下标可以修改已经存在的Hashtable的值:
arr.Add(3,"1");
arr[3] = "干掉1";
//删除元素
arr.Remove(3);
37.var类型推断
var类推断:var变量类型会根据变量在赋值的时候推断变量类型;
var n1 = 123;
var n2 = "aaa";
var n3 = true;
var n4 = 3.14;
Console.WriteLine(n1.GetType());
Console.WriteLine(n2.GetType());
Console.WriteLine(n3.GetType());
Console.WriteLine(n4.GetType());
var推断类型缺陷:必须在变量定义的时候对变量进行赋值;
38.Path路径操作类
string str = @"C:\Users\Administrator\Desktop\炉石传说对决卡组\小号与卡组.txt";
//获取文件名
Console.WriteLine(Path.GetFileName(str));
//获取文件名,不包含文件扩展名
Console.WriteLine(Path.GetFileNameWithoutExtension(str));
//获取文件的扩展名
Console.WriteLine(Path.GetExtension(str));
//获取文件夹的名称
Console.WriteLine(Path.GetDirectoryName(str));
//获取全路径
Console.WriteLine(Path.GetFullPath(str));
//组合路径
Console.WriteLine(Path.Combine(@"c:\a\b\" , @"ccc.txt"));
39.File文件操作类
string path = @"C:\Users\Administrator\Desktop\炉石传说对决卡组\aaaa.txt";
//创建文件
//File.Create(path);
//删除文件
//File.Delete(path);
//复制文件
string pathCopy= @"C:\Users\Administrator\Desktop\炉石传说对决卡组\aaaa2.txt";
File.Copy(path, pathCopy);
读取文件
//ReadAllBytes读取文件内容
string path = @"C:\Users\Administrator\Desktop\炉石传说对决卡组\小号与卡组.txt";
byte[] bytesArr= File.ReadAllBytes(path);
string str =Encoding.GetEncoding("UTF-8").GetString(bytesArr);
Console.WriteLine(str);
//ReadAllLines读取文件
string[] strArr= File.ReadAllLines(path, Encoding.UTF8);
foreach(string str in strArr)
{
Console.WriteLine(str);
}
//ReadAllText读取文件
string allText=File.ReadAllText(path);
Console.WriteLine(allText);
ReadAllBytes可以读取图片等字节文件;
ReadAllLines只能读取文本,可以精确到行;
ReadAllText只能读取文本,直接读取文件的所有内容;
覆盖写入文件
//WriteAllBytes写入文件
string poetry = "红豆生南国,春来发几枝";
//先将文本字符串转成字节数组
byte[] byteArr2= Encoding.Default.GetBytes(poetry);
File.WriteAllBytes(@"C:\Users\Administrator\Desktop\炉石传说对决卡组\cccc.txt", byteArr2);
//WriteAllLines写入
File.WriteAllLines(path, new string[]{ "红豆生南国", "春来发几枝","愿君多采撷","此物最相思" });
//WriteAllText写入
File.WriteAllText(path, "红豆生南国, 春来发几枝,愿君多采撷,此物最相思" );
不覆盖(追加)写入文件
File.AppendAllText(path, "春江潮水连海平");
40.List泛型集合
ArrayList的大部分方法都适用于List泛型;
List<string> lst = new List<string>();
lst.Add("英雄");
lst.AddRange(new string[] { "无间道", "神话", "投名状" });
lst.AddRange(lst);
foreach (string item in lst)
{
Console.WriteLine(item);
}
List可以与数组相互转换
//List转数组
string[] arr= lst.ToArray();
//数组转List
int[] intArr = { 33, 65, 71, 21, 1, 5 };
List<int> list2= intArr.ToList();