C#学习4

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();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

y_w_x_k

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值