你的位置:首页 > ASP.net教程

[ASP.net教程]妙用Object


妙用Object

  当你在写C#程序时,经常会用到“ToString()”这个方法,而且如果你细心你点就会发现所有的引用类型都含有“ToString()”这个方法,那么你知道为什么会这样吗?很简单,因为所有的引用类型都继承自Object这个类,而“ToString”这个方法便是Object的一个成员,所以所有的引用类型都拥有“ToString()”这个成员。接下来,我们将通过几段代码来深入理解Object的作用。

1.Object的成员:

方法返回类型虚拟静态说明
Object()N/ASystem.Object类型的构造函数,由派生类的构造函数自动调用
~Object()(也称为Finalize())N/ASystem.Object类型的析构函数,由派生类的析构函数调用,不能手动调用
Equals(object)bool把调用该方法的对象与另一对象相比,如果它们相等,就返回true。默认的实现代码会查看对象参数是否引用了同一个对象。如果想以不同的方式来比较对象,则可以重写该方法,例如,比较两个对象的状态。
Equals(object,object)bool这个方法比较传送给它的两个对象,看看它们是否相等。检查时使用了 Equals(object) 方法。注意,如果两个对象都是空引用,这个方法就返回true。
ReferenceEquals(objcet,object)bool这个方法比较传送给它的两个对象,看看它们是不是同一个实例的引用。
ToString()String返回一个对应于对象实例的字符串。默认情况下,这是一个类类型限定名称,但可以重写它,给类类型提供合适的实现方式。
MemberwiseClone()object通过创建一个新对象实例并复制成员,以复制该对象。成员不会得到这些成员的新实例。新对象的任何引用类型成员都将引用与源类型形同的对象,这个方法是受保护的,所以只能在类或派生的类中使用。
GetType()System.Type以System.Type对对象的形式返回对象的额类型
GetHashCode()int在需要次参数的地方,用作对象的散列函数,它返回一个以压缩形似标识的对象的值

 

2.object与自定义类型:

 

  所有的类都继承自object类,我们自己写的类同样如此(如果你没有显示的指明基类,编译器会默认为object)。所以我们编写一些类时,可以利用object已经提供的方法。比如我们常用的“ToString”方法,通过重写,可以现实不同的字符串的版本等。object也可用于向上转型与向下转型

 

 

3.Object在事件处理时的妙用:

  在写事件处理程序时,我们通常会这样写: public void Btn_Click(object sender,EventArgs e){}  ,第一个参数总是 object类型,为什么要这样定义?要弄懂问题,首先要知道这个“sender”所表示的含义:sender指的是调用这个事件处理程序的对象。而这样定义的好处可以通过下面的两段代码来看出:

 

//项目文件 Calculate.csusing System;using System.Windows.Forms;namespace Sample_Windows{  public partial class Calculate : Form  {    public Calculate()    {      InitializeComponent();    }    private string _firstNumber = String.Empty;    private string _secondNumber = String.Empty;    private string _operation = "+";    private bool _flag = false;    private void btn9_Click(object sender, EventArgs e)    {      if (!_flag)      {        _firstNumber += btn9.Text;
          resultBox.Text=_firstNumber; } else { _secondNumber += btn9.Text;
         resultBox.Text = secondNumber; } }......
......//此处沈略部分代码(btn8_Click,btn7_Click,btn6_Click...)
......
     private void btn0_Click(object sender, EventArgs e) { if (!_flag) { _firstNumber += btn0.Text;
         resultBox.Text=_firstNumber; } else { _secondNumber += btn0.Text;
         resultBox.Text=_secondNumber; } } private void btnResult_Click(object sender, EventArgs e) { if (_firstNumber != String.Empty && _secondNumber != String.Empty) { double a = Convert.ToDouble(_firstNumber); double b = Convert.ToDouble(_secondNumber); switch (_operation) { case "+": resultBox.Text = Convert.ToString(a + b); break; case "-": resultBox.Text = Convert.ToString(a - b); break; case "*": resultBox.Text = Convert.ToString(a*b); break; case "/": resultBox.Text = Convert.ToString(a/b); break; } } else { MessageBox.Show("Error!!!","Warning",MessageBoxButtons.OK,MessageBoxIcon.Warning); } } private void btnClear_Click(object sender, EventArgs e) { resultBox.Text = "0"; _flag = false; } private void btnAdd_Click(object sender, EventArgs e) { _operation = "+"; resultBox.Text = _operation; _flag = !_flag; } private void btnDiv_Click(object sender, EventArgs e) { _operation = "-"; resultBox.Text = _operation; _flag = !_flag; } private void btnMul_Click(object sender, EventArgs e) { _operation = "*"; resultBox.Text = _operation; _flag = !_flag; } private void btnSub_Click(object sender, EventArgs e) { _operation = "/"; resultBox.Text = _operation; _flag = !_flag; } }}

这是一个简单的计算器程序,在上面的代码中,共有16个事件处理程序,而其中10个数字处理程序与4个操作符处理程。看以看出代码很长,修改修改起来也很麻烦。接下来看一下下面的代码:

//项目文件 Calculate.Designer.cs...this.btn0.Click += new System.EventHandler(this.btn_Click);this.btn2.Click += new System.EventHandler(this.btn_Click);this.btn3.Click += new System.EventHandler(this.btn_Click);this.btn4.Click += new System.EventHandler(this.btn_Click);this.btn5.Click += new System.EventHandler(this.btn_Click);...this.btnSub.Click += new System.EventHandler(this.btnOperation_Click);...//项目文件 Calculate.csusing System;using System.Windows.Forms;namespace Sample_Windows{  public partial class Calculate : Form  {    public Calculate()    {      InitializeComponent();    }    private string _firstNumber = String.Empty;    private string _secondNumber = String.Empty;    private string _operation = "+";    private bool _flag = false;    private void btn_Click(object sender, EventArgs e)    {      Button btn = (Button) sender;  //获取触发此事件处理程序的Button对象      if (!_flag)      {        _firstNumber += btn.Text;         resultBox.Text = _firstNumber;      }      else      {        _secondNumber += btn.Text;        resultBox.Text = _secondNumber;      }    }    private void btnResult_Click(object sender, EventArgs e)    {      if (_firstNumber != String.Empty && _secondNumber != String.Empty)      {        double a = Convert.ToDouble(_firstNumber);        double b = Convert.ToDouble(_secondNumber);        _firstNumber = String.Empty;        _secondNumber = String.Empty;        switch (_operation)        {          case "+":            resultBox.Text = Convert.ToString(a + b);            break;          case "-":            resultBox.Text = Convert.ToString(a - b);            break;          case "*":            resultBox.Text = Convert.ToString(a*b);            break;          case "/":            resultBox.Text = Convert.ToString(a/b);            break;        }      }      else      {        MessageBox.Show("Error!!!","Warning",MessageBoxButtons.OK,MessageBoxIcon.Warning);      }    }    private void btnOperation_Click(object sender, EventArgs e)    {      Button btn = (Button) sender;  //获取触发此事件处理程序的Button对象      _operation = btn.Text;      resultBox.Text = _operation;      _flag = !_flag;    }    private void btnClear_Click(object sender, EventArgs e)    {      _flag = false;      resultBox.Text = "0";    }  }}

 这段代码与上面要实现的功能完全一样,但只有4个时间处理程序,一个数字处理程序与一个字符处理程序,很明显,代码明显的精简的不少,而且修改起来也更加方便。从上面的例子可以看出使用object与不使用object有多么大的不同。

 

总结:

(1)在写事件处理程序时,可以将事件处理程序按事件的属性分类(如上面例子中的数字处理,操作处理,计算处理),再通过object这个类来实现用一个事件处理程序处理同一类事件。这样既避免了代码的重复,又增加了可读性和易维护性!

(2)object可以实现控件之间的交互,因为所有类都继承自object,所以通过多态性,可以将控件与object的引用绑定,以便于在不同的方法间传递,再通过向下转型解绑,就可以轻松实现控件之间的交互。