C#教程
C# 结构体(Struct) | 菜鸟教程C# 结构体(Struct) 在 C# 中,结构体(struct)是一种值类型(value type),用于组织和存储相关数据。 在 C# 中,结构体是值类型数据结构,这样使得一个单一变量可以存储各种数据类型的相关数据。 struct 关键字用于创建结构体。 结构体是用来代表一个记录,假设您想跟踪图书馆中书的动态,您可能想跟踪每本书的以下属性: Title Author Subject Book ID 定义结构体 为了定义一..https://www.runoob.com/csharp/csharp-struct.html
C#常用的快捷键
对齐代码:ctrl+k+d 注意代码不能出现语法错误
弹出智能提示:ctrl+j
光标最前/最后切换选中状态:shift+end;shift+home 上/下
注释选中代码:ctrl+k+c
取消注释选中代码:ctrl+k+u
折叠冗余代码:#region 后面写说明 #endregion
查看源代码:F12
高亮查询:ctrl+shift+上/下
查看方法都在哪使用了:shift+F12
一次修改多个变量的名称:F2
构建代码:F6
运行代码:F5
逐行调试:F10
逐过程调试:F11(可以进入方法体)
移动代码:alt+上/下
多行修改:alt+鼠标拖动
删除整行:shift+del
选中部分代码自动生成方法:ctrl+R+M
快速生成构造函数:ctor tab
快速引入命名空间:alt+shift+F10
ctrl+R+G清理未使用的命名空间
ctrl+L 删除整行代码
region的用法:
选中想要折叠的代码,ctrl+K+S
值类型和引用类型区别
值类型:int、double、bool、char、decimal、struct、enum
引用类型:string(不可变)、自定义类、数组
存储:
值类型的值是存储在内存的栈当中。
引用类型的值是存储在内存的堆中。
字符串的使用
- 可以将string类型,看做是char类型的一个只读数组,如str[索引]值为一个字符类型
- 字符串转字符数组:char[] chs = str.ToCharArray();
- 字符数组转字符串:string str=new string(chs);
- 比较2个字符串(可忽略大小写):str1.Equals(str2,StringComparison.OrdinalIgnoreCase);
- 分割字符串(返回字符串类型的数组):str.Splite(字符数组,StringSplitOptions.RemoveEmptyEntries);//第二个参数可以去除空格字符串数组
- 截取指定字符串:str.Substring(index,要截取的个数);
- 判断字符串出现的位置:str.IndexOf();
- 判断字符串以....开始:str.StartsWith();
- 替换字符串:str.Replace(old,new);
- 去除前后空格:str.Trim();
- 去除开始/结束空格:str.TrimStart()/str.TrimEnd();
- 判断是否包含某个字符串:str.Contains();
- string.IsNullOrEmpty():判断一个字符串是否为空或者为null
- string.Join("连接符字符串",数组):将数组按照指定的字符串连接,返回一个字符串。
string类型的常用方法
ToCharArray()——将字符串转换为char数组
new string(char[] chs)——能够将char数组转换为字符串
Length——获得当前字符串中字符的个数
ToUpper()——将字符转换成大写形式
ToLower()——将字符串转换成小写形式
Equals(lessonTwo,StringComparison.OrdinalIgnoreCase)——比较两个字符串,可以忽略大小写
Split()——分割字符串,返回字符串类型的数组。
Substring()——解决字符串。在截取的时候包含要截取的那个位置。
IndexOf()——判断某个字符串在字符串中第一次出现的位置,如果没有返回-1、值类型和引用类型在内存上存储的地方不一样。
LastIndexOf()——判断某个字符串在字符串中最后一次出现的位置,如果没有同样返回-1
StartsWith()——判断以....开始
EndsWith()——判断以...结束
Replace(old,new)——将字符串中某个字符串替换成一个新的字符串
Contains()——判断某个字符串是否包含指定的字符串
Trim()——去掉字符串中前后的空格
TrimEnd()——去掉字符串中结尾的空格
TrimStart()——去掉字符串中前面的空格
string.IsNullOrEmpty()——判断一个字符串是否为空或者为null
string.Join()——将数组按照指定的字符串连接,返回一个字符串。
字节数组---字符串
Encoding.Default.GetString(字节数组)
字符串--->字节数组
Encoding.Default.GetBytes(字符串)
ArrayList
类似于数组,为可变长度的存储空间,可以存放任意类型的数据
用法:
ArrayList list = new ArrayList();
list.Count //长度
list.Add(数据);//添加数据
list.AddRange(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 });//把1,2...数据依次添加
list.AddRange(list);//把list里面的数据依次添加
list.Clear();//清空所有元素
list.Remove(数据);//删除单个元素 写谁就删谁
list.RemoveAt(索引);//根据下标去删除元素
list.RemoveRange(index, count);//根据下标去移除一定范围的元素
list.Sort();//升序排列
list.Reverse();//反转
list.Insert(index, "插入的");//在指定的位置插入一个元素
list.InsertRange(0, new string[] { "张三", "李四" });//在指定的位置插入一个集合
list.Contains(元素);//判断是否包含某个指定的元素
装箱、拆箱的概念
装箱:就是将值类型转换为引用类型。
拆箱:将引用类型转换为值类型。
看两种类型是否发生了装箱或者拆箱,要看,这两种类型是否存在继承关系
注意:使用泛型集合而不使用ArrayList集合的目的是防止拆装箱。
Path类的用法
获得文件名:Path.GetFileName(str);获得文件名但是不包含扩展名:Path.GetFileNameWithoutExtension(str);获得文件的扩展名:Path.GetExtension(str);获得文件所在的文件夹的名称:Path.GetDirectoryName(str);获得文件所在的全路径:Path.GetFullPath(str);连接两个字符串作为路径:Path.Combine(@"c:\a" , "b.txt");
File类的用法
创建一个文件:File.Create(@"C:\Users\SpringRain\Desktop\new.txt");删除一个文件:File.Delete(@"C:\Users\SpringRain\Desktop\new.txt");
复制一个文件:File.Copy(@"C:\Users\SpringRain\Desktop\code.txt", @"C:\Users\SpringRain\Desktop\new.txt");
剪切一个文件:File.Move(@"C:\Users\SpringRain\Desktop\code.txt", @"C:\Users\SpringRain\Desktop\newnew.txt");
用File类操作文件的数据
//将文件读取到字节数组中 byte[] buffer = File.ReadAllBytes(@"C:\Users\SpringRain\Desktop\1.txt");//将字节数组转换成字符串string s = Encoding.UTF8.GetString(buffer);//将字符串写入到指定文件中string s="今天天气好晴朗,处处好风光";//将字符串转换成字节数组byte[] buffer= Encoding.Default.GetBytes(s);File.WriteAllBytes(@"C:\Users\SpringRain\Desktop\1.txt", buffer);//一行一行读取string[] contents = File.ReadAllLines(@"C:\Users\SpringRain\Desktop\抽象类特点.txt", Encoding.Default);foreach (string item in contents){Console.WriteLine(item);}//直接读取所有string str = File.ReadAllText("抽象类特点.txt", Encoding.Default);//一行一行写入File.WriteAllLines(@"C:\Users\SpringRain\Desktop\new.txt", new string[] { "aoe", "ewu" });//a直接全部写入File.WriteAllText(@"C:\Users\SpringRain\Desktop\new.txt", "张三李四王五赵六");//不发生覆盖的写入 File.AppendAllText(@"C:\Users\SpringRain\Desktop\new.txt", "看我有木有把你覆盖掉");
List的使用
用法与ArrayList类似可以ToArray(),ToList()使泛型集合与数组相互转换
Dictionary
使用方式与HashTable类似
Dictionary<int, string> dic = new Dictionary<int, string>();dic.Add(1, "张三");dic.Add(2, "李四");dic.Add(3, "王五");dic[1] = "新来的";foreach (KeyValuePair<int,string> kv in dic){Console.WriteLine("{0}---{1}",kv.Key,kv.Value);}foreach (var item in dic.Keys){Console.WriteLine("{0}---{1}",item,dic[item]);}
文件IO流的实例代码
//使用FileStream来读取数据FileStream fsRead = new FileStream(@"C:\Users\SpringRain\Desktop\new.txt", FileMode.OpenOrCreate, FileAccess.Read);byte[] buffer = new byte[1024 * 1024 * 5];//3.8M 5M//返回本次实际读取到的有效字节数int r = fsRead.Read(buffer, 0, buffer.Length);//将字节数组中每一个元素按照指定的编码格式解码成字符串string s = Encoding.UTF8.GetString(buffer, 0, r);//关闭流fsRead.Close();//释放流所占用的资源fsRead.Dispose();Console.WriteLine(s);Console.ReadKey();//使用FileStream来写入数据//using (FileStream fsWrite = new FileStream(@"C:\Users\SpringRain\Desktop\new.txt", FileMode.OpenOrCreate, FileAccess.Write))//{// string str = "看我游牧又把你覆盖掉";// byte[] buffer = Encoding.UTF8.GetBytes(str);// fsWrite.Write(buffer, 0, buffer.Length);//}//Console.WriteLine("写入OK");//Console.ReadKey();
IO流复制大文件的实例代码
注意:将创建文件流对象的过程写在using当中,会自动的帮助我们释放流所占用的资源。
//1、我们创建一个负责读取的流using (FileStream fsRead = new FileStream(soucre, FileMode.Open, FileAccess.Read)){//2、创建一个负责写入的流using (FileStream fsWrite = new FileStream(target, FileMode.OpenOrCreate, FileAccess.Write)){byte[] buffer = new byte[1024 * 1024 * 5];//因为文件可能会比较大,所以我们在读取的时候 应该通过一个循环去读取while (true){//返回本次读取实际读取到的字节数int r = fsRead.Read(buffer, 0, buffer.Length);//如果返回一个0,也就意味什么都没有读取到,读取完了if (r == 0){break;}fsWrite.Write(buffer, 0, r);} }}
使用IO流操作文本文件实例
使用StreamReader来读取一个文本文件using (StreamReader sr = new StreamReader(@"C:\Users\SpringRain\Desktop\抽象类特点.txt",Encoding.Default)){while (!sr.EndOfStream){Console.WriteLine(sr.ReadLine());}}//使用StreamWriter来写入一个文本文件using (StreamWriter sw = new StreamWriter(@"C:\Users\SpringRain\Desktop\newnew.txt",true))//true为不覆盖{sw.Write("看我有木有把你覆盖掉");}
如何遍历一个文件夹的目录
//封装一个遍历文件夹目录大方法public void GetAllFiles(string path){var dir=new DirectoryInfo(path);foreach(var file in dir.GetFiles()) //GetFiles()获得所有文件对象{Console.WriteLine("文件名:{0}",file.Name);}foreach(var directory in dir.GetDirectories()) //GetDirectories获得所有文件夹对象{Console.WriteLine("文件夹名:{0}",directory.Name);this.GetAllFiles(directory.FullName);}}
移动文件夹需要如何异常处理
public void MoveFile(string sourceFilePath,string destinationFilePath){var temp=Path.GetTempFileName();File.Copy(destinationFilePath,temp);try{File.Move(sourceFilePath,destinationFilePath);}catch (Exception){File.Copy(temp,sourceFilePath);throw;}}
抽象类的介绍
1.抽象成员必须标记为abstract,并且不能有任何实现。
2.抽象成员必须在抽象类中。
3.抽象类不能被实例化
4.子类继承抽象类后,必须把父类中的所有抽象成员都重写。(除非子类也是一个抽象类,则可以不重写)
5.抽象成员的访问修饰符不能是private
6.在抽象类中可以包含实例成员。并且抽象类的实例成员可以不被子类实现
7.抽象类是有构造函数的。虽然不能被实例化。
8.如果父类的抽象方法中有参数,那么。继承这个抽象父类的子类在重写父类的方法的时候必须传入对应的参数。
如果抽象父类的抽象方法中有返回值,那么子类在重写这个抽象方法的时候 也必须要传入返回值。
注意:如果父类中的方法有默认的实现,并且父类需要被实例化,这时可以考虑将父类定义成一个普通类,用虚方法来实现多态。如果父类中的方法没有默认实现,父类也不需要被实例化,则可以将该类定义为抽象类。
实现多态的手段
虚方法:将父类的方法标记为虚方法 ,使用关键字 virtual,这个函数可以被子类重新写一个遍。
抽象类:当父类中的方法不知道如何去实现的时候,可以考虑将父类写成抽象类,将方法写成抽象方法。
c#中的访问修饰符
public :公开的公共的
private:私有的,只能在当前类的内部访问
protected:受保护的,只能在当前类的内部以及该类的子类中访问。
internal:只能在当前项目中访问。在同一个项目中,internal和public的权限是一样。protected internal:protected+internal
注意:1)、能够修饰类的访问修饰符只有两个:public、internal。
2)、子类的访问权限不能高于父类的访问权限,会暴漏父类的成员。
Directory类的使用
用于操作文件夹
创建文件夹:Directory.CreateDirectory(@"C:\a");
删除文件夹:Directory.Delete(@"C:\a",true); //true里面有内容也可以删除,否则会抛出异常
剪切文件夹:Directory.Move(@"c:\a", @"C:\Users\SpringRain\Desktop\new");
获得指定文件夹下所有文件的全路径:string[] path = Directory.GetFiles(@"C:\Users\SpringRain\Desktop\Picture","*.jpg"); //第二个参数可以过滤文件
获得指定目录下所有文件夹的全路径:string[] path = Directory.GetDirectories(@"C:\Users\SpringRain\Desktop\new");
判断指定的文件夹是否存在:Directory.Exists(@"C:\a\b");
接口的基本概念
1.只要一个类继承了一个接口(包括抽象类),这个类就必须实现这个接口中所有的成员
2.接口不能被实例化。也就是说,接口不能new(不能创建对象)。
3.接口中的成员不能加“访问修饰符”,默认就是public。
4.接口中的成员不能有任何实现(必须“光说不做”)。
5.接口中只能有方法、属性、索引器、事件,不能有“字段”和构造函数。
6.接口与接口之间可以继承,并且可以多继承。
7.接口并不能去继承一个类,而类可以继承接口(类可以继承多个接口)。
8.实现接口的子类必须实现该接口的全部成员。
注意:抽象类的方法被子类实现时必须在实现方法前+override;但是子类实现的接口的方法不用+任何修饰符
序列化与反序列化的代码示例
将某个对象传输给对方电脑Person p = new Person(); //例如:人这个对象,假设这个示例类已经定义好了p.Name = "霍金";p.Age = 27;p.Gender = '男';using (FileStream fsWrite = new FileStream(@"C:\Users\SpringRain\Desktop\111.txt", FileMode.OpenOrCreate, FileAccess.Write)){ //开始序列化对象BinaryFormatter bf = new BinaryFormatter();bf.Serialize(fsWrite, p);}Console.WriteLine("序列化成功");//接收对方发送过来的二进制 反序列化成对象Person p;using (FileStream fsRead = new FileStream(@"C:\Users\SpringRain\Desktop\111.txt", FileMode.OpenOrCreate, FileAccess.Read)){BinaryFormatter bf = new BinaryFormatter();p = (Person)bf.Deserialize(fsRead);}
部分类概念
用partial修饰class,将两个相同类名的partial class当做一个类使用。(用于多人协作)
sealed密封类的概念
不能够被其他类继承,但是可以继承于其他类。
本文为归纳和补充重要知识点,具体更为详细内容总结可查看此链接
C#基础知识框架整理_c#框架-CSDN博客文章浏览阅读4.2k次,点赞10次,收藏46次。注意:表达式2的结果类型必须跟表达式3的结果类型一致,并且也要跟整个三元表达式的结果类型一致。结构的使用函数的调用全局静态字段方法中的高级参数用法out、ref、params什么是属性访问修饰符静态和非静态的区别静态类的使用new关键字的作用3.调用对象的构造函数进行初始化对象属性的概念及作用英文对照静态和非静态的区别析构函数构造函数的概念this关键字的用法_c#框架https://blog.csdn.net/i78i845/article/details/128184420?ops_request_misc=&request_id=&biz_id=102&utm_term=C&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-5-128184420.142