C#中的==,!=等符号重载,以及重载等号操作
通过一个实际的例子来介绍。其中重载==,!=,Equal,GetHashCode函数。
public class Record
{
public string[] arr = null;
public bool hasEqual = false;
//重载一个下标运算符号
public string this[int index]
{
get
{
return arr[index];
}
set
{
arr[index] = value;
}
}
public override int GetHashCode()
{
// 在这里使用字符串数组的hashcode,避免自己完成一个算法
return arr.GetHashCode();
}
public Record(int count)
{
if (count < 1)
{
throw new Exception("数组的长度不能小于1");
}
arr = new string[count];
}
public static bool operator ==(Record rec1, Record rec2)
{
//注意我们调用Equals来判断是否相等。而不是在自己的函数中判、断。这是因为如果在自己的函数中判断。比如有rec2=null的情况。如果是这种情况。我们要判断if(rec2==null) {…}。其中rec2==null也是调用一个等号运算符,这里面有一个递归的过程,造成了死循环。
return Object.Equals(rec1, rec2);
}
public static bool operator !=(Record rec1, Record rec2)
{
return !Object.Equals(rec1, rec2);
}
public override bool Equals(object obj)
{
//判断与之比较的类型是否为null。这样不会造成递归的情况
if (obj == null)
return false;
if (GetType() != obj.GetType())
return false;
Record rec = (Record)obj;
int count = rec.arr.Length;
for (int i = 0; i < count; i++)
{
if (this.arr[i] != rec.arr[i])
{
return false;
}
}
return true;
}
}
以上就是介绍重载==,!=,Equal,GetHashCode的方法。但是有的时候我们需要重载 = 操作符,来方便我们进行传递,这在C++里可以使用符号重载来实现,但是C#里面就行不通了,不信你可以试试,编译器会报错的。C#里实现相同效果使用的并不是对 = 符号操作进行重载,而是通过以下方法来重载
原来C++的程序员一定会写operator=的,但是这在c#中是错误
的.
我们可以通过转换来实现重载等号的目的.
c#中有implicit和explicit关键字.可以实现隐式和显示
转换
示例:
class MyString
{
private string _str;
private MyString(string str)
{
this._str = str;
}
public static implicit operator MyString(string str)
{
相关文档:
从ContainerControl类继承的子类作为容器窗体,可以容纳除Form类对象外的其余窗体对象。
在所有容器窗体内,最基本的就是顶级容器Form类以及面板容器Panel类。这两者的主要区别为:前者具有Windows标准框架(标题栏,最大化、最小化和关闭按钮,窗体边框,可调整尺寸),并且可以独立存在;后者只是一块区域,并且必须依附 ......
这个问题也不知道难倒了多少C#豪杰。比起MFC的界面刷新,在WINFORM中来实现多线程刷新真是很痛苦,故写此文。
多线程刷新界面主要用到多线程,委托,线程安全、事件等一系列高难度的C#操作。
关于委托和事件,这有一篇很易懂的文章:hi.baidu.com/anglecloudy/blog/item/a52253ee804d052f2df534ab.html
======== ......
1.连接数据库文件
<add name="LocalSqlServer" connectionString="Data Source=.\SQLExpress;Integrated Security=True;AttachDBFilename=|DataDirectory|TimeTracker.mdf;User Instance=true" />
SqlConnectionStringBuilder实例化时,要用到connectionString,如:SqlConnectionStringBuild builder = new SqlCon ......
C#获取字符串的长度
作者:ylclass 来源:博客园 发布时间:2009-10-30 16:25 阅读:193 次 原文链接 [收藏]
1、 使用g.MeasureString()获得
使用MeasureString测量出来的字符宽度,总是比实际宽度大一些,而且随着字符 ......
本章为接口课程的综合练习。
本次练习展示了一个简化的银行业务流程,体现了银行和用户数个角色的关系。看下图:
账户类(Account)对象存储在数据库类(Database)对象中;计算机(Computer)类对象连接到数据库类对象上;银行柜台(BankCounter)类对象拥有一台计算机对象作为私有成员,利用该对象对数据库进行操作;AT ......