c#基础5
1.访问修饰符作用所有类型和类型成员都具有可访问性级别。2.分类public:同一程序集的其他任何代码或引用该程序集的其他程序集都可以访问该类型或成员。internal:同一程序集中的任何代码都可以访问该类型或成员但其他程序集不可以访问。private:同一结构的代码可以访问该类型和成员。protected:同一结构和派生(继承特性)类中的代码可以访问该类型和成员。protected internal:同一程序集中的任何代码或其他程序集中的任何派生类都可以访问该类型和成员。private protected:该类型或成员可以通过从class派生的类型访问。3.c#的默认修饰符 ★类、结构体的默认修饰符是internal.类中所有的成员默认修饰符是private.接口默认修饰符是internal.接口的成员默认修饰符是public.枚举类型成员默认修饰符是public.委托的默认修饰符是internal.2.c#方法函数1.作用方法是包含一系列语句的代码块。方法必须在类或结构中声明2.优点减少代码重复率方法体现了c#语言的封装性3.方法的分为 声明方法定义方法和调用方法使用方法4.声明方法基本结构访问权限静态非静态 static返回值类型 代表方法 是否具有return 数据的类 void 和 其他明确的数据类型int float.. string..方法名称 大驼峰 见名之意方法参数 实参调用方法 和形参声明方法大括号{语句块}5.调用方法在哪调用在方法内部调用 Main 入口方法 程序运行时 自动执行 Main方法是静态方法 自定义静态方法直接使用自定义非静态方法 需要对象打点调用6.方法的分类从访问权限分类从静态和非静态分类从有无参数从有无返回值分类7.参数传递形式值参数传递特点1.值参数传递是参数传递的默认方式2.当调用一个方法时会为每个值参数创建一个新的存储位置3.当形参的值发生改变时不会影响实参的值从而保证了实参数据的安全总结无论参数的类型是值类型还是引用类型 都遵循值传递的特性引用参数传递特点1.引用参数传递是一个对变量的内存位置的引用 不会创建一个新的存储位置2.参数关键字ref8.out 输出参数特点1.是对于方法返回值类型的补充。return 语句可用于函数中返回一个值 输出参数可以返回多个值2.关键字 out out 输出参数在方法中必须被使用3.其他方面与引用参数相似9.in 参数// in和out最大不同in传递过来的参数不能修改。而out必须修改。ref想改就改不想改不改。// in传递过来的参数是只读的可变参数params(未写)1.params是ParamArrayAttribute参数数组属性的缩写2.params解决了C#中不定长参数的传递的问题3.params参数必须定义在参数列表最后面 且只能写一个4.params必须是一维数组类型5.一个方法中 params只能在定义一维数组6. params 参数可以直接传入对应类型的数组 或者直接传入数组中的数据10.递归方法调用一个方法可以自我调用。 这就是所谓的递归1.注意无限循环2.可以通过递归模拟循环逻辑3.不可变数组1.含义不可变数组是一个存储相同类型元素的固定大小的顺序集合2.特点数组属于引用类型数组只能包含类型相同的元素数组通过下标索引值标记元素 下标从0开始 依次加13.格式1.声明数组datatype[] arrayName;datatype 用于指定被存储在数组中的元素的类型。指定数组的秩维度。秩指定数组的大小。arrayName 指定数组的名称。2.初始化数组中的元素的方式使用数组数据类型[] 数组名 {值 1, 值 2, …}数据类型[] 数组名 new 数据类型[长度]{值 1值 2,…}数据类型[] 数组名 new 数据类型[长度可忽略]{值 1值 2,…}数据类型[] 数组名 new 数据类型[长度];数组访问元素intArray[0];修改数组元素intArray[0]1;遍历数组方式forforeach数组越界 超出数组范围 系统抛出异常4.多维数组含义数组嵌套数组形式 一般常用二维数组二维数组格式二位数组格式string [,] strArray new string[数组个数,数组元素个数]初始化二维数组二维数组访问元素int vala[2,3];二维数值修改元素a[2,3]10;遍历二维数组元素其他多维数组格式 例如三维数组 string [,,] strArray new string[数组个数,数组元素个数]int[,,] val new int[3, 3, 3] { { { 10, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } },{ { 10, 11, 12 }, { 13, 14, 15 }, { 16, 17, 18 } },{ { 19, 20, 21 }, {22, 23, 24 }, { 25, 26, 27 } } };三维数组访问元素int val a[2,2,2];三维数组修改元素a[2,2,2]10遍历三维数组元素交错数组 了解含义交错数组是数组的数组交错数组是一维数组。交错数组格式int [][] scores;初始化交错数组中的元素的方式int[][] scores new int[2][]{new int[]{92,93,94},new int[]{85,66,87,88}};交错数组访问元素scores[0][1]交错修改数组元素scores[0][1] 10补充Array类含义是c#中所有数组的基类它是在System命名空间中定义 提供了各种用于数组功能的属性和方法常用属性 和方法不可变字符串1.string, 引用类型 string类型表示零或更多单字符组成的序列(集合),2.string 是 .NET Framework 中 String 的别名。3.不可变字符串类似于不可变数组4.长度固定5.字符串中包含char类型元素不可变数组根据定义数组的类型决定元素的类型6.都是通过索引查看元素位置7.不可变字符串内容不能修改初始化字符串方式//方式1 字面量创建字符串string str1 abc;string str2 abc;//方式2char[] charArray new char[5] { a,b,c,d,f};string str3 new string(charArray);//方式3string str4 string.Format(123);//字符串本质也是单字符的集合string str5 abcdefg;Console.WriteLine(str5.Length);char charNumber1 str5[0];Console.WriteLine(charNumber1);//str5[0] w; 无法直接修改某个单字符for (int i 0; i str5.Length; i){Console.WriteLine(str5[i]);}foreach (var item in str5){Console.WriteLine(item);}字符串常用API1.Length 获取字符串的长度即字符串中字符的个数.2.IndexOf 返回整数得到指定的字符串在原字符串中第一次出现的位置.3.LastlndexOf 返回整数得到指定的字符串在原字符串中最后一次出现的位置.4. StartsWith 返回布尔型的值判断某个字符串是否以指定的字符串开头.5. EndsWith 返回布尔型的值判断某个字符串是否以指定的字符串结尾.6. ToLower 返回一个新的字符串将字符串中的大写字母转换成小写字母.7. ToUpper 返回一个新的字符串将字符串中的小写字母转换成大写字母.8. Trim返回一个新的字符串不带任何参数时表示将原字符串中前后的空格删除.9. TrimStart 返回一个新的字符串将字符串中左侧的空格删除10. TrimEnd 返回一个新的字符串将字符串中右侧的空格删除。11. Remove 返回一个新的字符串将字符串中指定位置的字符串移除.12. PadLeft 返回一个新的字符串从字符串的左侧填充空格达到指定的字符串长度.13. PadRight 返回一个新的字符串从字符串的右侧填充空格达到指定的字符串长度.14. Substring 返回一个新的字符串用于截取指定的字符串.15. Insert 返回一个新的字符串将一个字符串插入到另一个字符串中指定索引的位置16.contain 字符串是否包含某个字符串 (区分大小写)17.IsNullOrEmpty 判断字符串对象是否为空类型或者是空字符串18. char[] charArray str.ToCharArray(); //ToCharArray 把字符串分割成字符数组19.str1.Split(,) 以特殊符号为参考分割字符串为字符串数组20. Join //把数组组合成字符串 以某个字符作为组合符号21. replace可变字符串StringBuilderstring和StringBuilder区别1.String类型在C#中用于保存字符是引用类型一旦创建就不能再进行修改其底层是根据字符 数组char[]实现的2.StringBuilder 表示可变字符字符串类型其中的字符可以被改变、增加、删除当向一个已满的StringBuilder 添加字符时其会自动申请内存进行扩容using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ZN_Lesson9_3可变字符串 { internal class Program { static void Main(string[] args) { //不可变字符串 string str hello world; string str1 123; Console.WriteLine(strstr1ba); // 可变字符串 StringBuilder sbStr new StringBuilder(); sbStr.Append(hello world); sbStr.Append(123); sbStr.Append(ba); StringBuilder stringBuilder sbStr.Insert(0, 456); Console.WriteLine(sbStr); Console.WriteLine(stringBuilder); //可变字符串转换成不可变字符串 string str2 sbStr.ToString(); str2.Contains(hello); //不可变字符串转换成可变字符串 StringBuilder sb1 new StringBuilder(str); sb1.Append(str2); Console.WriteLine(sb1.Length); sb1.Length 10; Console.WriteLine(-----------------); for (int i 0; i sb1.Length-1; i) { Console.WriteLine(sb1[i]); } } } }使用场景对字符串添加或删除操作不频繁的话就几个固定的 string 累加的时候就不需要 StringBuilder 了毕竟 StringBuilder 的初始化也是需要时间的。对字符串添加或删除操作比较频繁的话那就用StringBuilder。特点1.可以定义可变字符串实现字符串的添加2.对于高频率字符串拼接可以使用3.如果普通拼接 可以使用上面的字符串格式化方式常用方法如下using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; // 导入代码执行时间的命名空间 using System.Diagnostics; namespace ZN_LessonDay12_2可变字符串 { internal class Program { static void Main(string[] args) { //1.创建不可变字符串 string str hello world; char[] chars new char[5] {a, b, c, d, e}; string str1 new string (chars); //不可变字符串拼接 string newStr str str1; //1.创建可变字符串 StringBuilder sb new StringBuilder(); //追加字符串 sb.Append(hello world); //追加字符串 sb.Append(abcde); //占位符 //追加字符串并且格式化 sb.AppendFormat({0:C},{1}, 123, 456); //指定位置插入字符串 //参数1插入位置索引值 //参数2插入的字符串 sb.Insert(16,你好); //参数3插入的字符串重复的次数 sb.Insert(16, 你好,2); //移除字符串 //参数1开始位置索引值 //参数2移除的长度 sb.Remove(0, 6); //替换字符串 //参数1要替换的字符串 //参数2替换的字符串 sb.Replace(d, 中); Console.WriteLine(sb); //转换为不可变字符串 string strTest sb.ToString(); //查看某个字符 Console.WriteLine(sb[4]); Console.WriteLine(---------------------------修改长度之前); //遍历可变字符串 for (int i 0; i sb.Length; i) { Console.WriteLine(sb[i]); } //可变 字符串的长度 Console.WriteLine(sb.Length); Console.WriteLine(******************************修改长度之后); //可变字符串的长度可以被修改 sb.Length 10; Console.WriteLine(sb.Length); for (int i 0; i sb.Length; i) { Console.WriteLine(sb[i]); } //foreach 无法遍历可变字符串 //foreach (var item in sb) //{ // } //10000个不可变字符串拼接 //创建代码检测时间的对象 Stopwatch sw new Stopwatch(); //开始检测时间 sw.Start(); string tempStr ; for (int i 0; i 10000; i) { tempStr abc; } Console.WriteLine(tempStr); Console.WriteLine(tempStr.Length); //停止检测时间 sw.Stop(); //输出代码执行的时间 以毫秒为单位 //1秒等于多少毫秒 1秒等于1000毫秒 Console.WriteLine(不可变字符串拼接时间{0}毫秒, sw.ElapsedMilliseconds); Console.WriteLine(-------------------------------------------------------); //10000个可变字符串拼接 Stopwatch sw1 new Stopwatch(); sw1.Start(); StringBuilder sb1 new StringBuilder(); for (int i 0; i 10000; i) { sb1.Append(abc); } Console.WriteLine(sb1); Console.WriteLine(sb1.Length); sw1.Stop(); Console.WriteLine(可变字符串拼接时间{0}毫秒, sw1.ElapsedMilliseconds); Console.ReadKey(); } } }格式化字符串含义用特殊的符号 使变量和数据 按指定格式拼接成字符串的形式1.Format 方法1 拼接string name 张三; int age 10; string contentStr 姓名为: name 年龄为: age 岁; string fomatStr1 string.Format(contentStr); Console.WriteLine(fomatStr1)(2).用{ }来表示在{ }内填写 占位符从0开始Format({占位符0} {占位符1} {占位符2}, 1, 2, 3)Format({占位符0:格式化符号} {占位符1:格式化符号} {占位符2:格式化符号}, 1, 2, 3)//格式化字符串 string contentStr2 姓名为:{0}年龄为:{1}岁; // 调用格式化字符串 string fomatStr string.Format(contentStr2,name,age); Console.WriteLine(fomatStr); Console.WriteLine(姓名为:{0}年龄为:{1}岁,name,age); Console.WriteLine(姓名为:{0}年龄为:{1}岁, age, name); Console.WriteLine(姓名为:{0}年龄为:{0}岁, age, name); Console.WriteLine(姓名为:{0}年龄为:{3}岁{1},{2},{0}, age, name,age,20);3.toString(格式化符号)方法 无法使用占位符int a 10; a.ToString(格式化符号); string stringFormat string.Format(姓名为:{0}年龄为:{1}岁, name, age); age.ToString(stringFormat);4.模板字符串 ${变量1},{变量2}模板字符串 ${变量1:格式化符号},{变量2:格式化符号}string name可乐; int age3; Console.WriteLine(${name}今年{age}岁); string str ${age:D}今年{age:F}岁5.格式化标识符格式化标识符 字母 含义 C或c 货币格式 D或d 十进制格式十进制整数不要和.Net的Decimal数据类型混淆了 E或e 指数格式 F或f 固定精度格式 G或g 常用格式 N或n 用逗号分割千位的数字比如1234将会被变成1,234 P或p 百分符号格式 R或r 圆整只用于浮点数保证一个数字被转化成字符串以后可以再被转回成同样的数字 X或x 16进制格式 static void Main() { int i12345; //控制台输出格式化 Console.WriteLine({0:C},i); //货币 Console.WriteLine({0:D},i); //十进制数 Console.WriteLine({0:E},i); //科学技术法 Console.WriteLine({0:F},i); // 浮点数表示法 Console.WriteLine({0:G},i); //G或g General 常用格式 Console.WriteLine({0:N},i); //N或n 用逗号分割千位的数字 //使用Format 格式化 string str string.Format({0:C}, i); //使用toString int a 10; string str a.ToString(D); //模板字符串 string priceText $价格{i:C} 精度控制标识控制了有效数字的个数或者十进制数小数的位数 例如{0:C5} C 代表类型 5代表精度 // 控制台输出 Console.WriteLine({0:C5}, i); // 123,456.00 Console.WriteLine({0:D5}, i); // 123456 Console.WriteLine({0:E5}, i); // 1.23456E005 Console.WriteLine({0:F5}, i); // 123456.00000 Console.WriteLine({0:G5}, i); // 1.23456E5 Console.WriteLine({0:N5}, i); // 123,456.00000 Console.WriteLine({0:P5}, i); // 12,345,600.00000 % Console.WriteLine({0:X5}, i); // 1E240 } 时间格式化符号 MM/dd/yyyy 短日期模式 dddd,MMMM dd,yyyy 长日期模式 dddd,MMMM dd,yyyy HH:mm 全日期和时间模式 dddd,MMMM dd,yyyy HH:mm:ss 长日期和长时间 MM/dd/yyyy HH:mm 通用模式短日期和短时间 MM/dd/yyyy HH:mm:ss 通用模式短日期和长时间 MMMM dd 月天模式 yyyy-MM-dd HH:mm:ss 使用本地时间的可排序模式 HH:mm 短时间模式 HH:mm:ss 长时间模式 yyyy-MM-dd HH:mm:ss 通用可排序模式 MMMM,yyyy 年月模式 //控制台输出 Console.WriteLine({0:yyyy-MM-dd HH:mm:ss}, DateTime.Now); //Format string.Format({0:yyyy-MM-dd HH:mm:ss}, DateTime.Now); //toString DateTime.Now.ToString(yyyy-MM-dd HH:mm:ss); //模板字符串 string timeStr ${DateTime.Now:yyyy-MM-dd HH:mm:ss};补充三元运算符Dynamic和var的区别var是一种编译时类型推断编译器会根据变量的初始化表达式推断其类型。dynamic是一种运行时类型在编译时不会进行类型检查而是在运行时确定其类型。var msg7hello; //编译时确定 所以使用错误的类型 会主动报错 // int aaamsg7; if(msg7 is string) { Console.WriteLine(成立1); } //运行时确定 dynamic d17; dynamic d2a string; dynamic d3System.DateTime.Today; if(d1 is int) { Console.WriteLine(成立2); } //运行时确定 所以使用错误的类型 再编译阶段 也不会报错 //string i1 d1; string str11 d2; DateTime dt1 d3;1.Null 空类型特点1.表示不引用任何对象的空引用没有创建内存空间存放的是空引用指针2.Null类型是System.NullableT这个struct的类型3.对于值类型 赋值不能直接为null 引用类型可以null4.null引用类型变量的默认值 值类型默认为05.值类型如何赋值为null?1.NullableT结构体Nullableint intNumber null;2.类型之后添加 单int? intNumber null;使用场景当我们想要对于一个值类型变量进行 判断 是否 存在时为了节约内存 可以赋值为nullnull和字符串空值和字符串空格的区别1.null是没有创建内存空间,2.字符串空值 为 或者string.Empty实际上都会分配空间3.字符串空格 会分配空间 空格也是ACSII 对应的符号双问号 ??合并运算符作用用于判断一个变量在为 null 的时候返回一个指定的值使用场景Null 合并运算符为类型转换定义了一个预设值以防可空类型的值为 Nul面向对象编程和面向过程编程面向过程关注的是解决问题的步骤将问题分解成一系列需要依次执行的任务并通过函数来实现这些步骤。它的特点是流程清晰强调“怎么做”。面向对象关注的是参与解决问题的对象将问题分解成一个个具有属性和行为的对象通过对象之间的交互来解决问题。它的特点是更接近现实世界强调“谁来做”通过类与对象来体现面向对象的思想2.什么是类类是对现实生活中一类具有共同属性和行为的事物的抽象。它是一种复杂的数据类型将不同类型的数据和与这些数据相关的操作封装在一起。类定义了对象的结构和行为包括属性成员变量和方法成员函数3.什么是对象对象是实现类的属性和行为的具象的事物。4.类的规范组成访问修饰符 class 类的名称{成员变量//字段部分成员函数//属性部分//方法部分}5. 如何创建类的对象使用new关键字 new 为类的对象开辟内存空间实例化(创建)一个对象的方式:类名 对象名new 类名()static void Main(string[] args) { //创建People类的对象 People zhangsan new People(); //为zhangsan设置属性 zhangsan.name 张三; zhangsan.age 18; zhangsan.sex true; zhangsan.height 1.8; //zhangsan的行为 zhangsan.Eat(); zhangsan.Sleep(); zhangsan.ReadNumber(); Console.WriteLine($张三的名字{zhangsan.name}年龄{zhangsan.age}性别{zhangsan.sex}身高{zhangsan.height}); People lisi new People(); lisi.name 李四; lisi.age 19; lisi.sex false; lisi.height 1.7; Console.WriteLine($李四的名字{lisi.name}年龄{lisi.age}性别{lisi.sex}身高{lisi.height}); Console.ReadKey(); } } //1.定义一个类 人类 class 是类的关键字 //定义格式 访问修饰符 class关键字 类名{类的成员属性和行为} //类的访问修饰符 默认为internal //类名要符合标识的规则 类名要使用大驼峰命名法 internal class People { //定义属性 默认为private //名字 public string name; //年龄 public int age; //性别 public bool sex; //身高 public double height; //定义行为 使用方法来表示人的行为 方法的访问修饰符 默认为 private public void Eat() { Console.WriteLine(吃); } public void Sleep() { Console.WriteLine(睡觉); } public void ReadNumber() { for (int i 1; i 10; i) { Console.WriteLine(i); } } }什么是字段成员变量字段1字段是类的成员也称为成员变量 在类中字段也可以叫全局变量 在整个类中可以使用2字段是定义在类中方法之外的 局部变量是定义在方法内部的3字段的格式 访问修饰符默认访问修饰符 private数据类型 字段名字段的访问修饰符学过的修饰符字段都能使用 字段的命名规则 _小驼峰 保持和系统框架中的字段名字一致4字段是有默认值的 值类型默认值为0 引用类型默认值为null 局部变量没有默认值5在一个类中 不能重复定义字段 但是允许定义相同名字的字段和局部变量 使用规则就近 原则6字段的命名规则 _小驼峰 保持和系统框架中的字段名字一致7字段包含 静态字段和非静态字段实例字段 静态字段使用类名调用 实例字段使用对象 调用在本类的实例方法中 使用 静态和非静态字段时 如果没有名字冲突 一般 可以省略 对象名和类名在本类的静态方法中 使用 静态字段时 如果没有名字冲突 一般可以省略类名 但是非静态字段 必须使用对象名调用public class Car { //1字段是类的成员也称为成员变量 在类中字段也可以叫全局变量 在整个类中可以使用 // 实例全局变量 在类中定义是属于每一个调用它的对象的 而且类中的方法公用一个变量 public string _carName; // 字段是有默认值的 值类型默认值为 0 引用类型默认值为null 局部变量没有默认值 public int _carAge; public string _carColor; //在一个类中 不能重复定义字段(和访问修饰符和类型无关) 但是允许定义相同名字的字段和局部变量 使用规则就近原则 // private int _carName; // 字段包含 静态字段和非静态字段实例字段 静态字段使用类名调用 实例字段使用对象调用 public static string _carType 代步工具; public void Run() { //局部变量 在方法中定义 作用域范围方法内部 int a 10; Console.WriteLine(a); // 全局变量 在类中定义 作用域范围类内部 _carName BMW; Console.WriteLine(_carName); Console.WriteLine(_carAge); Console.WriteLine(_carColor); Console.WriteLine(_carColor null ? null : 非null); Console.WriteLine(_carName null ? null : 非null); } public void Run1() { int a 110; Console.WriteLine(a); Console.WriteLine(_carName); } public void Run2() { string _carName; _carName 保时捷; Console.WriteLine(_carName); Console.WriteLine(this._carName); Car._carType 努力之后可以买的工具; } } }8