又到了总结知识的时间了,今天在云和学院学习了析构函数,命名空间及字符串的处理,现在就为大家总结下来。
理论:
析构函数
不能在结构中定义析构函数。只能对类使用析构函数。
一个类只能有一个析构函数。
无法继承或重载析构函数。
无法调用析构函数。它们是被自动调用的。
析构函数既没有修饰符,也没有参数。
命名空间
•namespace(命名空间),用于解决类重名问题,可以看做“类的文件夹”。
•如果代码和被使用的类在一个namespace则不需要using。
•在不同命名空间下的类调用有两种方法:
–写全称 命名空间.类名
–先using引用命名空间,再调用
(注:using可以声明namespace的引入,还可以实现非托管资源的释放,实现了IDisposiable的类在using中创建,using结束后会自动调用该对象的Dispose方法,释放资源。)
字符串处理
string可以看做是char的只读数组。char c = s[1];
•C#中字符串有一个重要的特性:不可变性,字符串一旦声明就不再可以改变。所以只能通过索引来读取指定位置的char,不能对指定位置的char进行修改。
* 如果要对char进行修改,那么就必须创建一个新的字符串,用s. ToCharArray()方法得到字符串的char数组,对数组进行修改后,调用new string(char[])这个构造函数(暂时不用细研究)来创建char数组的字符串。一旦字符串被创建,那么char数组的修改也不会造成字符串的变化。
•字符串的连接+,两边只要有一个是字符串类型,另一个也会被自动转换成字符串类型
•一切类型都可以调用.ToString()方法转换成字符串类型.
String类常用方法
s1.Equals(s2,StringComparison.OrdinalIgnoreCase),两个字符串进行比较不区分大小写的比较。
•ToLower():得到字符串的小写形式。(这个在前面已经总结过)
•ToUpper():得到字符串的大写形式; Trim()去掉字符串两端的空白。(这个在前面已经总结过)
•注意字符串是不可变的,所以这些函数都不会直接改变字符串的内容,而是把修改后的字符串的值通过函数返回值的形式返回。s.ToLower()与s=s.ToLower()
•要区分变量名和变量指向的值的区别。程序中可以有很多字符串,然后由字符串变量指向他们,变量可以指向其他的字符串,但是字符串本身没有变化。字符串不可变性指的是内存中的字符串不可变,而不是变量不变。
字符串的分割
•string[] Split(params char[] separator):将字符串按照指定的分割符分割为字符串数组;
•string[] Split(char[] separator, StringSplitOptions options)将字符串按照指定的char分割符分割为字符串数组( options 取RemoveEmptyEntries的时候移除结果中的空白字符串);
字符串函数详解
•字符串替换:string Replace(string oldValue, string newValue)将字符串中的出现oldValue的地方替换为newValue。例子:名字替换。
•取子字符串:string Substring(int startIndex),取从位置startIndex开始一直到最后的子字符串;
•string Substring(int startIndex, int length),取从位置startIndex开始长度为length的子字符串,如果子字符串的长度不足length则报错。
•bool Contains(string value)判断字符串中是否含有子串value
•bool StartsWith(string value)判断字符串是否以子串value开始;
•bool EndsWith (string value)判断字符串是否以子串value结束;
•int IndexOf(string value):取子串value第一次出现的位置。
•Int IndexOf(string value,int startIndex)
实操:
•给前面写的学生类添加构造方法.使在实例化学生类的时候可以通过构造方法对姓名性别年龄语数英等属性赋值,也可以只对姓名和性别赋值.年龄默认为18岁,语数英成绩默认为0分.
–张三 男 18 三科成绩为:90 95 80
–小兰 女 16 三科成绩为:95 85 100
*首先在定义一个类
class Student {//给前面写的学生类添加构造方法.使在实例化学生类的时候可以通过构造方法对姓名性别年龄语数英等属性赋值,也可以只对姓名和性别赋值.年龄默认为18岁,语数英成绩默认为0分. //张三 男 18 三科成绩为:90 95 80 //小兰 女 16 三科成绩为:95 85 100 string name; string gender; int age=18; int chinese; int math; int english; public Student(string n,int a,string g,int c,int m,int e ) { name = n; age = a; gender = g; chinese = c; math = m; english = e; } public Student(string n, string g, int c, int m, int e) { name = n; gender = g; chinese = c; math = m; english = e; } public void Stt() { Console.WriteLine("大家好,我叫{0},是{1}同学,今年{2}岁,我的三科成绩为:{3},{4},{5}", name, gender, age, chinese, math, english); } }
在Main函数里写
static void Main(string[] args) { Student stu1 = new Student("张三",18,"男",90,95,80); Student stu2 = new Student("小兰",16,"女 ",95, 85,100); Student stu3 = new Student("小兰", "女 ", 95, 85, 100); stu1.Stt(); stu2.Stt(); stu3.Stt(); Console.ReadKey(); }
运行结果是:
•写一个Ticket类,有一个距离属性(本属性只读,在构造方法中赋值),不能为负数,有一个价格属性,价格属性只读,并且根据距离distance计算价格Price (1元/公里):
–0-100公里 票价不打折
–101-200公里 总额打9.5折
–201-300公里 总额打9折
–300公里以上 总额打8折
有一个方法,可以显示这张票的信息.90公里90块钱
•测试上面的类.
class Ticket { #region 构造函数 public Ticket(int distance) { if(distance<0) { distance = 0; } this.distance = distance; } #endregion int distance; public int Distance { get { return distance; } } double price=500; public double Price { get { if(distance<=100 && distance>=0) { return distance * 1.0; } else if(distance>=101 && distance<=200) { return distance * 0.95; } else if(distance>=201 && distance<=300) { return distance * 0.9; } else { return distance*0.8; } } } public void Show() { Console.WriteLine("{0}公里需要{1}钱",distance,price); } }
static void Main(string[] args) { Ticket t1 = new Ticket(110); Console.WriteLine(t1.Price); Console.ReadKey(); }
测试结果:这道题不知道哪里出现问题了,结果并没有运用到Show方法
随机输入你心中想到的一个名字,然后输出它的字符串长度 Length:可以得字符串的长度
两个学员输入各自最喜欢的课程名称, 判断是否一致,如果相等,则输出你们俩喜欢相同的课程. 如果不相同,则输出你们俩喜欢不相同的课程.
让用户输入一个日期格式如:2008-01-02,你输出你输入的日期为2008年1月2日
static void Main(string[] args) { Console.WriteLine("请输入日期"); string date = Console.ReadLine(); string[] strs = date.Split(‘-‘); string datetine = strs[0] + "年" + strs[1] + "月"+strs[2]+"日" ; Console.WriteLine(datetine); Console.ReadKey(); }
今天就总结到这里吧,下周一在继续学习吧。加油!