C# 面向对象系列笔记(二)
第二天
1. 字符串的特性
---à不可变性,每对字符串做拼接或者重新赋值类的操作,都会在内存中产生一个新的实例。
所以说,在.Net平台下,如果你对一个字符串进行大量的拼接赋值等操作,会产生大量的垃圾
---à我们可以将字符串看做是char类型的只读数组
当我们以索引的方式去访问某一个字符串的时候,获得的是char类型
Eg://我们将StringBuilder这个对象作为拼接字符串的工具
//拼接完成后 依然会把它转换成字符串。
StringBuilder sb = newStringBuilder();
//创建计时对象
Stopwatch sw = newStopwatch();
//00:01:43.1416217
//00:00:00.1009880
//开始计时
sw.Start();
for (int i = 0; i < 100000; i++)
{
// str += i;
sb.Append(i);
}
//结束计时
sw.Stop();
//输出这段代码的运行时间
Console.WriteLine(sw.Elapsed);
//Console.WriteLine(sb.ToString());
Console.ReadKey();
2. 字符串的常用函数:
<1>.ToCharArray():将一个字符串转换成一个char类型的数组。
<2>.new string (char[] chs):根据一个char类型的数组返回一个字符串。
string str = "abcdef";
//字符串--->char数组(可读可写)
char[] chs = str.ToCharArray();
chs[0] = 'b';
//将改变后的char数组再次转换成字符串
str = newstring(chs);
Console.WriteLine(str[0]);
<3>.ToUpper():返回字符串的大写形式;
<4>.ToLower():返回字符串的小写形式;
<5>.Equals(,stringcomprasion...):比较两个字符串是否想等,可以忽略大小写
Console.WriteLine("请输入你喜欢的课程");
string lessonOne = Console.ReadLine();
//转换成大写
//lessonOne = lessonOne.ToUpper();
//转换成小写
//lessonOne = lessonOne.ToLower();
Console.WriteLine("请输入你喜欢的课程");
string lessonTwo = Console.ReadLine();
//lessonTwo = lessonTwo.ToUpper();
//lessonTwo = lessonTwo.ToLower();
if (lessonOne.Equals(lessonTwo, StringComparison.OrdinalIgnoreCase))
{
Console.WriteLine("你们喜欢的课程相同");
}
else
{
Console.WriteLine("你们喜欢的课程不相同");
}
<6>.Split():分割字符串,返回字符串类型的数组;
string str = "abc ,,,d, ,--,ef,,-- 0987";
//将一个字符串中没用的东西去掉
string[] strNew = str.Split(newchar[] { ' ', ',', '-' }, StringSplitOptions.RemoveEmptyEntries);
<7>.Contains():判断字符串中的是否包含指定的字符串;
<8>.Replace():将老字符串替换成新字符串;
Console.WriteLine("请输入你的评论");
string input = Console.ReadLine();
//1、判断评论中是否包含敏感词
if (input.Contains("老赵"))
{
//2、进行替换
input = input.Replace("老赵", "***");
}
Console.WriteLine(input);
<9>.StartsWith():判断字符串是否以指定的字符串开始;
<10>.EndsWith():判断字符创是否以制定的字符结束;
string str = "举头望明月,我叫郭德纲";
if (str.StartsWith("头"))
{
Console.WriteLine("是的");
}
else
{
Console.WriteLine("不是");
}
Console.WriteLine(str.EndsWith("举头望明月,我叫郭德纲") ? "是的" : "不是");
<11>.Trim():去掉字符串两端的字符。但是,不能去掉字符串中间的字符;
<12>.TrimStart():只能去掉字符串前面的空格;
<13>.TrimEnd():只能去掉字符串后面的空格;
string str = "---- ---1 2---3- -- ----";
str = str.Trim(); //去掉字符串两边的空格
str = str.TrimStart(); //去掉字符串前边的空格
str = str.TrimEnd(); //去掉后面的空格
str = str.Trim('-', ' ');
string[] strNew = str.Split(newchar[] { '-', ' ' }, StringSplitOptions.RemoveEmptyEntries);
Console.Write(str);
<14>.SubString():截取指定的字符串,可以选择截取的长度;
string str = "今天我要是上课睡觉了,我以后就单身一辈子";
str = str.Substring(12, 2);
Console.WriteLine(str);
Console.ReadKey();
<15>.IndexOf():获取指定字符串第一次出现的位置,如果没有,则返回
-1;
string str = "举头望明头头月,我叫头郭头德纲";
int index = str.IndexOf('a', 3);
onsole.WriteLine(index);
<16>.LastIndexOf():取某一个字符串最后一次出现的位置,如果没有,则返回-1;
string path = @"c:\a\b\c\e\亚廷\d\f\苍老师苍老师.avi";
//找到某一个字符在字符串中最后一次出现的位置
//获得 \\在路径中最后一次出现的位置
int index = path.LastIndexOf('\\');
string fileName = path.Substring(index + 1);
Console.WriteLine(fileName);
<17>.静态函数
-àstring.IsNullorEmpty():判断指定的字符串是否为空或null;
Console.WriteLine(string.IsNullOrEmpty(null) ? "yes" : "no");
-àstring.Join():将指定的分隔符插入数组每个元素的后面,或者返回一个字符串,默认最后一个元素后面没有;
string[] names = { "张三", "李四", "王五", "赵六", "田七" };
//张三|李四|王五|赵六|田七
string str = string.Join("|", names);
Console.WriteLine(str);
3. 继承
在我们设计类中,发现有的时候相似的几个类中会出现大量的冗余代码
为了解决这个问题,我们在设计类的时候,采用继承来解决冗余代码的问题。
继承让类与类之间产生了关系(父子类的关系,子类与子类的关系),为后面要学习的多态打下了基础。
我们把这些类当中相同的成员,单独的拿出来,封装成一个类。
让这些类去继承这个类。
注意:---子类继承了父类的属性和函数,并没有继承父类的私有字段。
---子类并没有继承父类的构造函数,二是会默认的调用父类中无参数的构造函数。
因为父类有可能再无参数的构造函数中对自己成员进行初始化
所以子类如果想要得到父类中初始化之后的数据,就必须调用父类中无参数的构造函数。
父子类的构造函数关系:
我们需要父类的那个构造函数的原因是因为父类在那个无参数的构造函数中对自己的数据进行了初始化
如果我们在父类中写了一个新的构造函数后,那个默认的无参数的构造函数就被干掉了
此时子类就调用不到了,解决办法:
--à在父类中重复写一个无参数的构造函数
--à显示的让子类调用父类有参数的构造函数 + :base;
classStudent : Person
{
public Student(string name, int age, char gender, int id)
: base(name, age, gender){}}
继承的两大特性:
1.单根性 一个子类只能有父类。
2.传递性
4.里氏转换
--->子类可以赋值给父类:如果有一个地方需要一个父类,我们可以给一个子类代替。
--->如果父类中装的是子类对象,那么可以将这个父类转换成对应的子类
Person per = newStudent();
Student s = (Student)per;
Console.WriteLine("转换成功");
string s1 = string.Join("|", "张三", 100, 3.14, true, '男');
Console.WriteLine(s1);
Console.ReadKey();