1.String
1.字符串指定位置获取
//字符串本质是char数组
string str = "张三";
Console.WriteLine(str[0]);//张
//转为char数组
char[] chars = str.ToCharArray();
Console.WriteLine(chars[1]);//三
for (int i = 0; i < str.Length; i++)
{
Console.WriteLine(str[i]);
}
//张
//三
2.字符串拼接
str = string.Format("{0}{1}",1,333);
Console.WriteLine(str);//1333
3.正向查找字符位置
str = "123!";
int index = str.IndexOf("1");
Console.WriteLine(index);
index = str.IndexOf("4");
Console.WriteLine(index);
4.反向查找指定字符串位置
str = "123456456";
index = str.LastIndexOf("456");
Console.WriteLine(index);
index = str.LastIndexOf("456");
Console.WriteLine(index);
5.移除指定位置后的字符
str = "我是张三";
str.Remove(3);
Console.WriteLine(str);//我是张三
str = str.Remove(3);
Console.WriteLine(str);//我是张
//执行两个参数进行移除
//参数1 开始位置
//参数2 字符个数
str = "我是张三";
str = str.Remove(1, 1);
Console.WriteLine(str);//我张三
6.替换指定字符串
str = "123456456";
str.Replace("123", "789");
Console.WriteLine(str);
str = str.Replace("123", "789");
Console.WriteLine(str);
7.大小写转换
str = "abc";
str.ToUpper();
Console.WriteLine(str);//abc
str=str.ToUpper();
Console.WriteLine(str);//ABC
str = str.ToLower();
Console.WriteLine(str);//abc
8.字符串截取
str = "我是张三张三";
//截取从指定位置开始之后的字符串
str.Substring(2);
Console.WriteLine(str);//我是张三张三
str = str.Substring(2);
Console.WriteLine(str);//张三张三
//参数1 开始位置
//参数2 指定个数
//不会自动的帮助你判断是否越界 你需要自己去判断
str = "我是张三张三";
str = str.Substring(2, 3);
Console.WriteLine(str);//张三张
9.字符串切割
str = "1,2,3,4,5,6,7,8,9";
string[] strs = str.Split(',');//以‘’里的为界限分割
for (int i = 0; i < strs.Length; i++)
{
Console.WriteLine(strs[i]);
}
2.StringBuilder
1.StringBuilder
C#提供的一个用于处理字符串的公共类
主要解决的问题是:
- 修改字符串而不创建新的对象,需要频繁修改和拼接的字符串可以使用它,可以提升性能
- 使用前 需要引用命名空间
2.初始化 直接指明内容
StringBuilder str = new StringBuilder("123123123");
Console.WriteLine(str);//123123123
3.容量
StringBuilder存在一个容量的问题,每次往里面增加时 会自动扩容
//获得容量
Console.WriteLine(str.Capacity);
//获得字符长度
Console.WriteLine(str.Length);
4.增删查改替换
1.增
str.Append("4444");
Console.WriteLine(str);//1231231234444
Console.WriteLine(str.Length);//13
Console.WriteLine(str.Capacity);//16
str.AppendFormat("{0}{1}", 100, 999);
Console.WriteLine(str);//1231231234444100999
Console.WriteLine(str.Length);//19
Console.WriteLine(str.Capacity);//32
2.插入
str.Insert(0, "张三");
Console.WriteLine(str);//张三1231231234444100999
3.删除
str.Remove(0, 10);//删除从0索引开始的10个数
Console.WriteLine(str);//34444100999
4.清空
str.Clear();
Console.WriteLine(str);
5.查
Console.WriteLine(str[0]);//3
6.改
str[0] = 'A';
Console.WriteLine(str);//A4444100999
7.替换
str.Replace("1", "张");
Console.WriteLine(str);//A4444张00999
8.重新赋值 StringBuilder
str.Clear();
str.Append("123123");
Console.WriteLine(str);//123123
9.判断 StringBuilder 是否和某一个字符串相等
if (str.Equals("123123"))
{
Console.WriteLine("相等");//相等
}
3.结构体和类的区别
1.区别概述
结构体和类的最大的区别是在存储空间上的,因为结构体是值,类是引用
因此他们的存储位置一个在栈上,一个在堆上
通过之前知识点的学习,我相信你能够从此处看出他们在使用的区别——值和引用对象在赋值时的区别
结构体和类在使用上很类似,结构体甚至可以用面向对象的思想来形容一类对象
结构体具备着面向对象思想中封装的特性,但他不具备继承和多态的特性,因此大大减少了它的使用频率
由于结构体不具备继承的特性,所以它不能够使用protected保护访问修饰符
2.细节区别
1.结构体是值类型,类是引用类型
2.结构体存在栈中,类存在堆中
3.结构体成员不能使用 protected 访问修饰符,而类可以
4.结构体成员变量申明不能指定初始值,而类可以
5.结构体不能申明无参的构造函数,而类可以
6.结构体申明有参构造函数后,无参构造不会被顶掉
7.结构体不能申明析构函数,而类可以
8.结构体不能被继承,而类可以
9.结构体需要在构造函数中初始化所有成员变量,而类随意
10.结构体不能被静态 sratic 修饰 (不存在静态结构体),而类可以
11.结构体不能在自己内部申明和自己一样的结构体变量,而类可以
3.结构体的特别之处
结构体可以继承 接口 因为接口是行为的抽象
4.如何选择结构体和类
1.想要使用继承和多态时,直接淘汰结构体,比如玩家、怪物等等
2.对象是数据集合时,优先考虑结构体,比如位置、坐标等等
3.从值类型和引用类型赋值时的区别上去考虑,比如经常被赋值传递的对象
并且改变赋值对象,原对象不想跟着变化时,就用结构体,比如坐标、向量、旋转等等
4.抽象类和接口的区别
1.知识回顾
抽象类和抽象方法
abstract修饰的类和方法
抽象类 不能实例化
抽象方法只能在抽象类中申明 是个纯虚方法 必须在子类中实现
接口
interface 自定义类型
是行为的抽象
不包含成员变量
仅包含方法、属性、索引器、事件,成员都不能实现,建议不写访问修饰符,默认public
2.相同点
1.都可以被继承
2.都不能直接实例化
3.都可以包含方法申明
4.子类必须实现未实现的方法
5.都遵循里氏替换原则
3.区别
1.抽象类中可以有构造函数;接口中不能
2.抽象类只能被单一继承;接口可以被继承多个
3.抽象类中可以有成员变量;接口中不能
4.抽象类中可以申明成员方法,虚方法,抽象方法,静态方法;接口中只能申明没有实现的抽象方法
5.抽象类方法可以使用访问修饰符;接口中建议不写,默认public
4.如何选择抽象类和接口
表示对象的用抽象类,表示行为拓展的用接口
不同对象拥有的共同行为,我们往往可以使用接口来实现
举个栗子:(故意的,哈哈哈!)
动物是一类对象,我们自然会选择抽象类;而飞翔是一个行为,我们自然会选择接口