C#学习笔记(五)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jameshater/article/details/79576626

1、里氏转换

    里氏转换需满足的条件:

1)、子类可以赋值给父类;

2)、如果父类中装的是子类对象,那么可以将这个父类强转为子类对象。

里氏转换经常用到,如果有一个地方需要父类作为参数,我们可以给一个子类对象。上一篇文章提到过Object是所有类的父类,Console类的WriteLine(Object param)方法就是以Object类对象作为参数,所以我们可以传入int、double、string等等类型的对象,在这个过程中就是进行了里氏转换,对应的是第一种条件。

对于第二种条件,如下

Person p=new Student();//父类存的是子类对象
Student s=(Student)p;//将父类强转为子类对象
//其中Person是Student的父类

我们在进行里氏转换前,经常使用两个方法来进行判断

1)、is:表示类型转换,如果能够转换成功,则返回一个true,否则返回一个false.

Person p=new Student();
if(p is Teacher)//Teacher也是Person的子类,但没有满足上面的两个条件,因此不能进行里氏转换,故会执行else语句
{
   Teacher ss=(Teacher)p;
}
else
{
   Console.WriteLine("转换失败");
}

2)、as:如果可以转换,则返回一个转换后的对象,如果不能转换,则返回null。

Teacher t=p as Teacher;
//因为不能转换,因此此时的t是null。

2、ArrayList集合

    其在System.Collections命名空间里面

    集合相对于数组的优势:长度可以任意改变;类型随便。

    元素的访问形式和数组一样,都是利用下标进行访问。

ArrayList list=new ArrayList();
list.Add(1);
list.Add(3.14);
list.Add(50000m);
list.Add("你好");
//集合遍历还是用for循环,只是是利用Count这个属性
for(int i=0; i<list.Count;i++)
{
   Console.WriteLine(list[i]);
}

注:将一个类对象打印到控制台,默认情况下打印的是这个对象所在类的命名空间。

Person p=new Person();
ArrayList list=new ArrayList();
list.Add(p);
Console.WriteLine(list[0]);
//此处打印的是对象p所对应的类Person所在的命名空间

添加单个元素的时候使用Add,添加集合的时候就使用AddRange。

char[] c={'m','n','s','f'};
list.AddRange(c);

ArrayList还有很多的函数来帮助我们处理集合,像Clear\Remove\RemoveAt\RemoveRange\Insert等,可根据自己的实际需求查阅相关资料。

3、Hashtable集合

    一般称为键值对集合,类似于字典,根据键值去找相应的值,二者是一一对应的。其也在System.Collections中。

Hashtable ht=new Hashtable();
ht.Add(1,"张三");
ht.Add(2,'男');
ht.Add('age',23);
ht[3]=100;
//通过键值去遍历集合的值
foreach(var item in ht.Keys)
{
   Console.WriteLine(ht[item]);
}
//另一种遍历的方式直接遍历集合中的值
foreach(var item in ht.Values)
{
   Console.WriteLine(item);
}

注:关键字var是根据值去推断其类型,对于Hashtable的遍历刚好使用,因为Hashtable中的键值可以是各种类型,因此不能通过ArrayList集合的for循环来进行遍历。为什么我们平时很少用var?因为var在声明一个变量的时候必须为其赋值以确定其类型,而不能先声明变量再去赋值。

注:键值对集合中,键必须是唯一的,但值可以是重复的。


猜你喜欢

转载自blog.csdn.net/jameshater/article/details/79576626