C#面向对象总结2
1、值类型和引用类型:
值类型:int、double、bool、char、decimal、struct、enum
引用类型:string、自定义类、数组
存储: 值类型的值是存储在内存的栈当中。
引用类型的值是存储在内存的堆中。
2、字符串
1)、字符串的不可变性
当你给一个字符串重新赋值之后,老值并没有销毁,而是重新开辟一块空间存储新值。
当程序结束后,GC扫描整个内存,如果发现有的空间没有被指向,则立即把它销毁。
2)、我们可以讲字符串看做是char类型的一个只读数组。
ToCharArray();将字符串转换为char数组
new string(char[] chs):能够将char数组转换为字符串
3、字符串提供的各种方法
1)、Length:获得当前字符串中字符的个数
2)、ToUpper():将字符转换成大写形式
3)、ToLower():将字符串转换成小写形式
4)、Equals(lessonTwo,StringComparison.OrdinalIgnoreCase):比较两个字符串,可以忽略大小写
5)、Split():分割字符串,返回字符串类型的数组。
6)、Substring():截取字符串。在截取的时候要包括截取的那个位置。
7)、IndexOf():判断某个字符串在字符串中第一次出现的位置,如果没有,返回-1
8)、LastIndexOf():判断某个字符串在字符串中最后一次出现的位置,如果没有,同样返回-1
9)、StartsWith():判断以....开始
10)、EndsWith():判断以...结束
11)、Replace():将字符串中某个字符串替换成一个新的字符串
12)、Contains():判断某个字符串是否包含指定的字符串
13)、Trim():去掉字符串中前后的空格
14)、TrimEnd():去掉字符串中结尾的空格
15)、TrimStart():去掉字符串中前面的空格
16)、string.IsNullOrEmpty():判断一个字符串是否为空或者为null
17)、string.Join():将数组按照指定的字符串连接,返回一个字符串。
4、继承
我们可能会在一些类中,写一些重复的成员,我们可以将这些重复的成员, 单独的封装到一个类中,作为这些类的父类。
Student、Teacher、Driver 子类 (派生类 )
Person 父类 (基类)
子类继承了父类,那么子类从父类那里继承过来了什么?
首先,子类继承了父类的属性和方法,但是子类并没有继承父类的私有字段。
问题:子类有没有继承父类的构造函数?
答:子类并没有继承父类的构造函数,但是。子类会默认的调用父类无参数的构造函数, 创建父类对象,让子类可以使用父类中的成员。 所以,如果在父类中重新写了一个有参数的构造函数之后,那个无参数的就被干掉了, 子类就调用不到了,所以子类会报错。
解决办法:
1)、在父类中重新写一个无参数的构造函数。(不常用)
2)、在子类中显示的调用父类的构造函数,使用关键字:base()
继承的特性
1、继承的单根性:一个子类只能有一个父类。
2、继承的传递性
object是所有类的基类。
5、new关键字
1)、创建对象
2)、隐藏从父类那里继承过来的同名成员。
隐藏的后果就是子类调用不到父类的成员。
6、里氏转换
1)、子类可以赋值给父类
2)、如果父类中装的是子类对象,那么可以讲这个父类强转为子类对象。
子类对象可以调用父类中的成员,但是父类对象永远都只能调用自己的成员。
is:表示类型转换,如果能够转换成功,则返回一个true,否则返回一个false
as:表示类型转换,如果能够转换则返回对应的对象,否则返回一个null
is的用法
if (p is Student)
{
Student ss = (Student)p;
ss.StudentSayHello();
}
else
{
Console.WriteLine("转换失败");
}
as的用法
Student t = p as Student;
t.StudentSayHello();
Console.ReadKey();
protected 受保护的:可以在当前类的内部以及该类的子类中访问。
7、集合
创建了一个集合对象
ArrayList list = new ArrayList();
集合:很多数据的一个集合
数组:长度不可变、类型单一
集合的好处:长度可以任意改变 类型随便
ArrayList集合的长度问题: 每次集合中实际包含的元素个数(count)超过了可以包含的元素的个数(capcity)的时候, 集合就会向内存中申请多开辟一倍的空间,来保证集合的长度一直够用。
ArrayList list = new ArrayList();
添加单个元素
list.Add(true);
list.Add(1);
list.Add("张三");
添加集合元素
list.AddRange(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 });
list.AddRange(list);
list.Clear();清空所有元素
list.Remove(true);删除单个元素 写谁就删谁
list.RemoveAt(0);根据下标去删除元素
list.RemoveRange(0, 3);根据下标去移除一定范围的元素
list.Sort();//升序排列
list.Reverse();反转
list.Insert(1, "插入的");在指定的位置插入一个元素
list.InsertRange(0, new string[] { "张三", "李四" });在指定的位置插入一个集合
bool b = list.Contains(1);判断是否包含某个指定的元素
创建一个集合,里面添加一些数字,求平均值与和,最大值,最小值
1 ArrayList list = new ArrayList(); 2 list.AddRange(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }); 3 int sum = 0; 4 int max = (int)list[0]; 5 for (int i = 0; i < list.Count; i++) 6 { 7 if ((int)list[i] > max) 8 { 9 max = (int)list[i]; 10 } 11 sum += (int)list[i]; 12 } 13 Console.WriteLine(sum); 14 Console.WriteLine(max); 15 Console.WriteLine(sum/list.Count); 16 Console.ReadKey();
写一个长度为10的集合,要求在里面随机地存放10个数字(0-9),但是要求所有的数字不重复
1 ArrayList list = new ArrayList(); 2 Random r = new Random(); 3 for (int i = 0; i <10; i++) 4 { 5 int rNumber = r.Next(0, 10);//集合中没有这个随机数 6 if (!list.Contains(rNumber)) 7 { 8 list.Add(rNumber); 9 } 10 else//集合中有这个随机数 11 { 12 //一旦产生了重复的随机数 这次循环就不算数 13 i--; 14 } 15 16 } 17 for (int i = 0; i < list.Count; i++) 18 { 19 Console.WriteLine(list[i]); 20 } 21 Console.ReadKey();
8、Hastable 键值对集合
在键值对集合当中,我们是根据键去找值的。
键值对对象[键]=值;
键值对集合当中,键必须是唯一的,而值是可以重复的
创建了一个键值对集合对象:
1 Hashtable ht = new Hashtable(); 2 ht.Add(1, "张三"); 3 ht.Add(2, true); 4 ht.Add(3, '男'); 5 ht.Add(false, "错误的"); 6 ht.Add(5, "张三"); 7 ht[6] = "新来的";//这也是一种添加数据的方式 8 ht[1] = "张三"; 9 ht.Add("abc", "cba"); 10 Console.WriteLine(ht[1]);//在键值对集合中 是根据键去找值的
9、foreach循环
foreach (var item in nums)
{
Console.WriteLine(item);
}
10、Path类
string str = @"C:\3000soft\Red Spider\Data\Message\老赵.wav";
Console.WriteLine(Path.GetFileName(str));//获得文件名
Console.WriteLine(Path.GetFileNameWithoutExtension(str));//获得文件名但是不包含扩展名
Console.WriteLine(Path.GetExtension(str));//获得文件的扩展名
Console.WriteLine(Path.GetDirectoryName(str));//获得文件所在的文件夹的名称
Console.WriteLine(Path.GetFullPath(str));//获得文件所在的全(绝对)路径
Console.WriteLine(Path.Combine(@"c:\a\" , "b.txt"));//连接两个字符串作为路径
编码格式 产生乱码的原因就是因为你保存这个文件的编码格式跟你打开这个文件的编码格式不一样。
11、文件
File.Create(@"C:\Users\SpringRain\Desktop\new.txt");创建一个文件
File.Delete(@"C:\Users\SpringRain\Desktop\new.txt");删除一个文件
File.Copy(@"C:\Users\SpringRain\Desktop\code.txt", @"C:\Users\SpringRain\Desktop\new.txt");复制一个文件
File.Move(@"C:\Users\SpringRain\Desktop\code.txt", @"C:\Users\SpringRain\Desktop\newnew.txt");剪切