您的位置:首页 > 编程语言 > C#

C#语法之比较

2015-11-02 15:17 423 查看
本次将以如下顺次介绍C#中的比较

1.类型比较

2.值比较

2.1.运算符重载

2.2.IComparable和IComparer接口的实现

2.3.类型转换

1.类型比较

有2种方式进行类型比较:GetType  和 is

CTypeTst l_typeclass = new CTypeTst();
/*类型比较*/
/*GetType, typeof*/
if (l_typeclass.GetType() == typeof(CTypeTst))
{
Console.WriteLine("They are the same type: {0}",l_typeclass.GetType());
}
/*is*/
if (l_typeclass is ITypeTst)
{
Console.WriteLine("l_typeclass is {0}", typeof(ITypeTst));
}


我的理解是:

GetType 是得到并判断对象的最顶层类型,

而is可以判断对象最顶层到最底层之间的任意类型

2.值比较

2.1.运算符重载

运算符重载的基本结构如下:

public static CYourType  Operator  op (){...}

class COperatorTst
{
private int m_value;
public int m_Value
{
get
{
return m_value;
}
set
{
m_value = value;
}
}
/*重载+运算符*/
public static COperatorTst operator + (COperatorTst i_obj_1, COperatorTst i_obj_2)
{
COperatorTst l_obj = new COperatorTst();
l_obj.m_value = i_obj_1.m_value + i_obj_2.m_value;
return l_obj;
}
/*重载-运算符*/
public static COperatorTst operator - (COperatorTst i_obj_1, COperatorTst i_obj_2)
{
COperatorTst l_obj = new COperatorTst();
l_obj.m_value = i_obj_1.m_value - i_obj_2.m_value;
return l_obj;
}
}

2.2.IComparable和IComparer接口的实现
实现这两个接口主要是用于排序

其中IComparable要实现:

int CompareTo(object obj);

而IComparer要实现:

int Compare(object x, object y);

/*实现IComparable接口*/
class CMyComparable:IComparable
{
private int m_value;
public int m_Value
{
get
{
return m_value;
}
set
{
m_value = value;
}
}
/*构造*/
public CMyComparable(int i_val)
{
this.m_value = i_val;
}
/*实现CompareTo*/
public int CompareTo(object obj)
{
if (obj is CMyComparable)
{
return m_value - ((CMyComparable)obj).m_value;
}
else
{
throw new ArgumentException("One object to compare is not the right object!");
}
}
}
class CMyCompareor:IComparer
{
public static CMyCompareor s_comparer = new CMyCompareor();
public int Compare(object x, object y)
{
if (x is CMyComparable &&
y is CMyComparable )
{
return -1 * ((CMyComparable)x).CompareTo(y);
}
else
{
throw new ArgumentException("One or both objects to compare are not Person objects");
}
}
}
ArrayList l_list = new ArrayList();
/*IComparable*/
l_list.Add(new CMyComparable(10));
l_list.Add(new CMyComparable(8));
l_list.Add(new CMyComparable(11));
l_list.Add(new CMyComparable(9));
/*Before sort*/
foreach(Object l_obj in l_list)
{
CMyComparable l_comp = (l_obj as CMyComparable);
Console.Write("{0} ", l_comp.m_Value);
}
Console.WriteLine();
l_list.Sort();
/*After Sort*/
foreach (Object l_obj in l_list)
{
CMyComparable l_comp = (l_obj as CMyComparable);
Console.Write("{0} ", l_comp.m_Value);
}
Console.WriteLine();
l_list.Sort(CMyCompareor.s_comparer);
/*After outer sort*/
foreach (Object l_obj in l_list)
{
CMyComparable l_comp = (l_obj as CMyComparable);
Console.Write("{0} ", l_comp.m_Value);
}
2.3.类型转换
类型转换包括显式转换和隐式转换,如果要自定义显式和隐式转换,则需要重载如下操作符:

public static implicit operator CExplicitTst(CImplicitTst i_obj);

public static explicit operator CImplicitTst(CExplicitTst i_obj);

另一是 as

与is的区别在于, is 操作返回的是 true和false

而 as 返回的是引用或null
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: