C#语法之比较
2015-11-02 15:17
423 查看
本次将以如下顺次介绍C#中的比较
1.类型比较
2.值比较
2.1.运算符重载
2.2.IComparable和IComparer接口的实现
2.3.类型转换
1.类型比较
有2种方式进行类型比较:GetType 和 is
我的理解是:
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!");
}
}
}
类型转换包括显式转换和隐式转换,如果要自定义显式和隐式转换,则需要重载如下操作符:
public static implicit operator CExplicitTst(CImplicitTst i_obj);
public static explicit operator CImplicitTst(CExplicitTst i_obj);
另一是 as
与is的区别在于, is 操作返回的是 true和false
而 as 返回的是引用或null
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
相关文章推荐
- c#MD5珍藏
- (原创)c#学习笔记08--面向对象编程简介01--面向对象编程的含义03--静态和实例类成员
- (原创)c#学习笔记08--面向对象编程简介01--面向对象编程的含义03--对象的生命周期--构造函数和析构函数
- C# KeepAlive的设置
- (原创)c#学习笔记08--面向对象编程简介01--面向对象编程的含义02--一切皆对象
- (原创)c#学习笔记08--面向对象编程简介01--面向对象编程的含义01--对象的含义02--方法
- [C#]光标(cur/ani)转图片(Image)
- C#之封装和继承
- C#托管与非托管资源
- C#:妥协与取舍,解构C#中的小数运算
- (原创)c#学习笔记08--面向对象编程简介01--面向对象编程的含义01--对象的含义01--属性和字段
- 第5篇 WPF C# 数据绑定Model-View-ViewModel模式
- C# 使用Log4Net记录日志(进阶篇)
- C# 使用Log4Net记录日志(进阶篇)
- C#应用程序
- C# 发送、接收和处理自定义的WINDOWS消息
- c#开发中注意事项
- c# Equals方法
- C#基本数据类型
- C#基础