1、里氏转换
1. 子类可以赋值给父类
- 作用:如果有一个地方需要一个父类作为参数,可以填入一个子类代替
- 例子:
Person p = new Student();2. 如果父类中装的是子类对象,那么可以讲这个父类强转为子类对象
- 例子:
Student ss = (Student)p;- 若强转回去的子类对象并不是一开始赋值的子类,可能不能转换,则抛异常。这种情况一般使用is/as
3.类型转换
- is:如果能够转换成功,则返回一个true,否则返回一个false。
例子:
if(p is Teacher)
{
Teacher ss = (Teacher)p;
ss.TeacherSayHello();
}
else
{
Console.WriteLine("转换失败");
}- as:如果能够转换则返回对应的对象,否则返回一个null。例子:
Teacher t = p as Teacher;2、protected 访问修饰符
受保护的:可以在当前类和子类中访问到
3、集合(ArrayList)
- 集合的好处:与数组对比,长度可以任意改变,类型随便
- 是一个实例,因此可以创建对象,举例:
ArrayList list = new ArrayList();- 向集合对象中添加单个元素用
Add,举例:
list.Add(1);
list.Add(3.14);- 向集合对象中添加集合元素用
AddRange,举例:
list.AddRange(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 });//此时在list的下十个空间添加元素
list.AddRange(list);- 取集合的元素数量用
.Count(读取集合对象中的数据,和数组一样采用角标的形式)举例:
for (int i = 0; i < list.Count; i++)
{
Console.WriteLine(list [i]);
} .Caprity表示这个集合中可以包含的元素。
在ArrayList中,每次放里面添加一定的元素,每超过当前开辟的内存,就再开辟一倍的内存,从而实现无限长度。
- 删除元素
清空所有元素用.Clear()
删除一个元素用.Remove(),括号里写谁删谁
根据索引(下标)删除元素用.RemoveAt()
根据索引范围删除元素用.RemoveRange() - 升序排列
.Sort - 反转元素顺序
.Reverse - 插入元素(在指定位置),举例:
list.Insert(1, "插入的");
list.InsertRange(0, new string[] { "张三", "李四" });.Contains判断是否包含指定的元素,返回bool。在前面加!表示包含时返回false!list.Contains()- 例题:
//写一个长度为10的集合,要求在里面随机地存放10个数字(0-9),但要求所有的数字不重复
ArrayList list = new ArrayList();
Random r = new Random();
for (int i = 0; i < 10; i++)
{
int rNumber = r.Next(0, 10);
if (!list.Contains(rNumber))
{
list.Add(rNumber);
}
else
{
i--;
}
}
for (int i = 0; i < list.Count; i++)
{
Console.WriteLine(list[i]);
}
Console.ReadKey();4、ToString的问题
当把一个对象打印到控制台的时候,默认打印这个对象所在的命名空间
5、Hashtable 键值对集合(根据键找值)
1. 用法:
- 举例:
Hashtable ht = new Hashtable(); ht.Add(1, "张三"); ht.Add(2, true); ht.Add(3, '男'); ht.Add(false, "错误的"); ht[6] = "新来的"; ht[1] = "把张三干掉"; Console.WriteLine(ht[1]); Console.WriteLine(ht[2]); Console.WriteLine(ht[3]); Console.WriteLine(ht[false]);- 注意:键必须是唯一的,值可以是重复的
2. foreach循环
- 想要遍历输出Hashtable,由于是根据键照值,因此不能用for循环来做,于是用到foreach
- 语法:
foreach (var item in collection)
{
}- 解释:var是推断类型(如果已知集合内的类型,可以直接改),item是循环集合的每一项,collection是要循环的集合
- 举例:
int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
foreach (var item in nums)
{
Console.WriteLine(item);
}
Console.ReadKey();5.和for循环比较:效率不如for,在循环次数较大时比较明显
3. 推断类型var
- 作用:根据值能够推断出来类型
- 缺陷:在声明这个变量的时候必须赋初值
4. Hashtable的方法
.Keys,输出键的集合.Values,值的集合.Add,添加一个新的元素。因此在键值对集合中,赋值有两种方法:
ht.Add(1, "张三");
ht[1] = "把张三干掉";二者的区别在于,Add是新添加一个元素,因此要遵循键必须是唯一的这条规则,不能命名已有的键。但是后面那种赋值方法相当于是给重新赋值,是以索引的方式。
.Contains:与ContainsKey用法相同,一般用后者。
.ContainsKey:查键的集合里是否包含,返回bool
.ContainsValue:查值的集合里是否包含,返回bool.Clear:移除所有元素.Remove:根据键移除元素
6、强类型语言
- 定义:在代码中,必须对每一个变量的类型有一个明确的定义
- C#是一门强类型语言,js是一门弱类型语言
7、获得数据类型(GetType())
语法:
参数名.GetType();8、Path类
Path.GetFileName()获得一个文件的文件名+拓展名Path.GetFileNameWithoutExtension()获得一个文件的文件名Path.GetExtension()获得一个文件的扩展名Path.GetDirectoryName()获得一个文件所在的文件夹路径Path.GetFullPath()获得一个文件的全路径Path.Combine(@" ", " ")将两个字符串连在一起作为路径
9、File类(上)
File.Create()在路径下创建新文件File.Delete()删除文件File.Copy(,)将文件赋值并可以重命名File.ReadAllBytes()读取文件,返回字节数组。由于是返回字节数组,因此可以读取非文本文件,比如多媒体文件。File.WriteAllBytes( , )将字节数组写入(需要先将字符串转换成字节数组),前面是文件路径,后面是字节数组。如果路径中有没有同名文件,就创建一下;如果已经有了,就覆盖。Encoding.Default.GetString()将字节数组转换为字符串(使用当前系统编码)Encoding.Default.GetBytes()将字符串转换为字节数组Encoding.UTF8.GetString()使用UTF-8编码Encoding.GetEncoding("GBK").GetString()使用其他编码
10、编码
1. 常见编码种类
- ASC 128
- ASCII 256
- GB2312 简体字
- Big5 繁体字
- unicode 几乎都包含,但是解析慢
- UTF-8 web常用
2. 定义
- 将字符串以怎样的形式保存成二进制
- 产生乱码的原因:保存这个文件所采用的编码和你打开这个文件所采用的编码格式不一样
评论