C#入门经典学习11-集合比较转换

C#入门经典学习11-集合比较转换

C#中的数组是System.Array类的实例
IEnumerable
ICollection
IList
IDictionary
System.Array类实现了IList ICollection IEnumerable但不支持IList的高级功能,表示大小固定的项列表

[] 是针对特定类型、固定长度的。
List 是针对特定类型、任意长度的。
Array 是针对任意类型、固定长度的。
ArrayList 是针对任意类型、任意长度的。
Array 和 ArrayList 是通过存储 object 实现任意类型的,所以使用时要转换。

自定义集合
CollectionBase List是IList InnerList是ArrayList
索引符 public A this[int index] 属性
DictionaryBase Dictionary是IDictionary
foreach 用DictionaryEntry
迭代器yield vs IEnumerable MoveNext方法 Current属性
要迭代一个类用GetEnumerator返回值是IEnumerator
要迭代一个类成员用IEnumerable
yield break

深度复制
ICloneable

比较
类型比较
obj.GetType() == typeof(MyComplexClass)
封箱和拆箱
封箱和拆箱,这个概念在以前的编程语言的学习中,从未听到过,现在先说一下封箱的概念是把值类型转换为Object类型,或者转换为由值类型实现的接口类型。在这里有个值类型是个什么概念呢?我是这样理解的,所谓值类型就是指像int struct之类的简单类型,像集合、数组应该就不是值类型还应该归为对象类型。

下面看一个封箱的例子:

struct MyStruct{

    public int val;

}

MyStruct valType1=new MyStruct();

valType1.val=5;

object  valType=valType1;//这样就完成了封装

相当于把将MyStruct和valType1封装在一个盒子中。
valType是值类型变量的一个副本的引用

拆箱即是将对象类型转换为值类型或为初始的接口类型。

例如:
MyStruct valType1=new MyStruct();
IMyInterface refType=valType();
MyStruct ValType2=(MyStruct)refType;
拆箱和封箱都是非常简单的操作,但具体该什么时候使用,该如何使用,我还不知道。不过书上有这么句话应该理解:封箱非常有用,有两个非常重要的原因。首先,它允许使用集合中的值类型,集合中项的类型是Object。其次,有一个内部机制允许在值类型上调用object,例如int和结构。

is运算符
<operand> is <type>
类,继承了该类型,或者可以封箱到该类型
接口,是该类型,实现了该接口
值类型,也是该类型,或者他可以拆箱到该类型

值的比较
运算符重载
public static MyClass operator +(MyClass op1, MyClass op2)
+、-、!、~、++、--、true 和 false
 可以重载这些一元运算符。
 
+, -, *, /, %, &, |, ^, <<, >>
 可以重载这些二进制运算符。
 
==, !=, <, >, <=, >=
 比较运算符可以重载(但请参见本表后面的说明)。
 
&&, ||
 条件逻辑运算符不能重载,但可使用能够重载的 & 和 | 进行计算。
 
[]
 不能重载数组索引运算符,但可定义索引器。
 
()
 不能重载转换运算符,但可定义新的转换运算符(参见 explicit 和 implicit)。
 
+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=
 赋值运算符不能重载,但 += 可使用 + 计算,等等。
 
=、.、?:、->、new、is、sizeof 和 typeof
 不能重载这些运算符。

GetHashCode()
Equals()

IComparable IComparer
IComparable在比较的对象的类中实现
IComparer 在一个单独的类中实现 Comparer.Default

隐式转换
Convclass1 op1 = new Convclass1;
Convclass2 op2 = op1;
Convclass1的方法
public static implicit operator ConvClass2(Convclass1 op1)
显示转换
Convclass2 op1 = new Convclass2;
Convclass1 op2 = (Convclass2)op1;
public static explicit operator ConvClass1(Convclass2 op1)

as运算符 把一种类型转换为指定类型 不能转换结果是null
是同一类型
可以隐式转换
可以封箱到指定类型

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值