1、复习
1、类
2、对象
{字段;
属性;
方法}
3、构造函数
2、命名空间
解决类的重名问题,等于类的文件夹
如果没有包含类的命名空间就不能使用该类
using System;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _1_命名空间
{
internal class Program
{
static void Main(string[] args)
{
List<int> list = new List<int>();//缺少对应的命名空间,报错
}
}
}
在一个项目中引用另外一个项目的类
1、添加引用
2、引用命名空间(被引用者访问修饰符应为 public级别)
3、值类型和引用类型
区别
1、在内存上存储的地方不一样:堆 栈 静态空间
2、在传递时,传递方式不同:值类型称之为值传递,引用类型称之为引用传递
1、值类型:
int、double、bool、char、decimal、struct、enum
存储在内存的栈中
2、引用类型:
string、自定义类、数组
存储在内存的堆中
4、字符串的一些性质
一、字符串的不可变性
栈中空间不变,指向改变;堆中开辟新空间
给字符串重新赋值后,老值并未删除,仍存在,开辟新空间存储新址。
string 在栈中的指向由新地址代替旧地址,实现更改过程
当程序结束后,GC扫描整个内存,只要发现存在空间没有被指向,则立即销毁
二、不同的string类型的变量的赋值内容一样时,堆地址相同
三、我们可以将字符串看成做是char类型组成的一个只读数组
string s = "abcdef";
Console.WriteLine(s[1]);
字符串与char数组之间的相互转换
string s = "abcdef";
Console.WriteLine(s[1]);
//将 s中的第一个字符 a 变为字符 b
//s[0] = 'b';//报错。因为类型只读
//先将字符串s 变为数组形式再该字符,调用s.ToCharArray();实现
char[] chr = s.ToCharArray();
chr[0] = 'b'; //对原字符串无影响,需要再转换为字符串来输出
s = new string (chr);
Console.WriteLine(s);
StringBuilder
StringBuilder sb = new StringBuilder();//没有多开额外的空间
string str = null;
//创建计时器用来计时
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 100000; i++)
{
//str += i; 不停的重复开辟空间,较慢
sb.Append(str);//Append 方法
}
sw.Stop();
Console.WriteLine(sb.ToString());//输出sb对象的方法时重新转换回字符串
Console.WriteLine(sw.Elapsed);
Console.ReadKey();
5、字符串的方法
一、Length
字符串长度
二、字符串大小写转换
ToUpper(); 转大写
ToLower();转小写
.Equals();
Console.WriteLine("李四,请输入一门你喜欢的课程的名字");
string n1 = Console.ReadLine();
//n1 = n1.ToLower();//转为小写
//n1 = n1.ToUpper();//转为大写
Console.WriteLine("张三,请输入一门你喜欢的课程的名字");
string n2 = Console.ReadLine();
if(n1.Equals(n2,StringComparison.OrdinalIgnoreCase) )
{
Console.WriteLine("你们喜欢的课程一致");
}
三、字符串的分割
使用.split()方法
string r = "ad we + ij -";
char[] str = { ' ', '-', '+' };//声明char类型数组,将不要字符放进去
//string[] r1 = r.Split(str);//调用Split删除不要的字符(实际变为空),返回一个字符串类型的数组,数组中元素为被删去字符隔开的部分
string[] r1 = r.Split(str, StringSplitOptions.RemoveEmptyEntries);//输出不带空的结果
Console.WriteLine(r1[2]);
Console.ReadKey();
练习
string s = "2008-01-05";
string[] s1 = { "-0" };
string [] s2 = s.Split(s1, StringSplitOptions.RemoveEmptyEntries);
Console.WriteLine("当前时间为{0}年{1}月{2}日", s2[0], s2[1], s2[2]);
Console.ReadKey();
四、一些方法
判断和替换
string s = "关键人物老冯";
if (s.Contains("老冯")) //判断是否存在关键字
{
s = s.Replace("老冯","XX"); //替换关键字为其他设定好的字符
}
Console.WriteLine(s);
Console.ReadKey();
.Substring();
string s = "今天天气好晴朗,处处好风光";
s = s.Substring(1,2);//Substring 从指定的位置开始分割截取包含指定位置的之后的部分,第二个数字代表往后截取的长度
Console.WriteLine(s);
Console.ReadKey();
.StsrtsWitth(); 判断字符串中是否以某字符串开始
.EndsWith();判断字符串中是否以XX结束
.IndexdOf(); 字符串中XX第一次出现的位置,如果没出现过返回-1 .LastIndexOf();字符串中XX最后一次出现的位置
Console.WriteLine("请输入作者名和标题");
string s1 = Console.ReadLine();
int index = s1.IndexOf(" ");
if (index > 10)
{
index = s1.LastIndexOf(" "); //找到最后一个空格的位置
string name = s1.Substring(index + 1);
string s2 = s1.Substring(0, 8);
Console.WriteLine(s2 + "..." + name);
}
else
{
Console.WriteLine(s1);
}
Console.ReadKey();
.Trim(); 替换字符串前后的空格
.TrimStart(); 替换字符串之前的空格
.TrimEnd();去掉字符串之后的空格
string.IsNullOrEmpty();判断是否为空或为null
string.Join();将数组按指定的字符串连接,返回一个字符串
string[] str = { "鸟叔", "卡哇伊", "四单", "指甲", "终极" };
string s = string.Join("|",str);
6、继承
涵义
把几个类中的相同部分单独拿出来封装成一个父类
①子类继承了父类什么?
可以访问到什么就继承什么
②是否继承构造函数?
没有继承父类的构造函数。但是子类会默认调用父类无参数的构造函数,创建父类无参数的对象,让子类可以使用父类中的成员
所以,如果在父类函数中写了一个含参的构造函数,无参的构造函数就被干掉了,子类无法调用就会报错
解决办法:
①在父类中重新写一个无参的构造函数
②在子类中显示的调用父类的构造函数,使用关键字base()
public class Person//父类 基类
public class Student : Person//子类 派生类
Public class Teacher : Person//子类 派生类
继承的特性
1、继承的单根性:只能继承1个基类
public class Person
public class Student :
Public class Teacher : Person,Student//会报错,继承多个基类
2、传递性
public class Person
public class Student : Person
Public class Teacher : Student
Teacher可以用Student,也可以用Person
object类
所有类的基类;
c#中所有的类都直接或间接继承了object类
7、关键字的new隐藏父类成员
1、创建对象
2、隐藏从父类继承过来的同名成员