妙用Object

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

1.Object的成员:

方法 返回类型 虚拟 静态 说明
Object() N/A System.Object类型的构造函数,由派生类的构造函数自动调用
~Object()(也称为Finalize()) N/A System.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指的是调用这个事件处理程序的对象。而这样定义的好处可以通过下面的两段代码来看出:

aaarticlea/png;base64,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" alt="" />

建立一个winForm窗体应用程序,项目名为Calculate,下面为完整源代码(已测试):

//项目文件 Calculate.Designer.cs
namespace Sample_Windows
{
partial class Calculate
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.IContainer components = null; /// <summary>
/// 清理所有正在使用的资源。
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
} #region Windows 窗体设计器生成的代码 /// <summary>
/// 设计器支持所需的方法 - 不要
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.btn9 = new System.Windows.Forms.Button();
this.btn8 = new System.Windows.Forms.Button();
this.btn7 = new System.Windows.Forms.Button();
this.btn6 = new System.Windows.Forms.Button();
this.btn5 = new System.Windows.Forms.Button();
this.btn4 = new System.Windows.Forms.Button();
this.btn3 = new System.Windows.Forms.Button();
this.btn2 = new System.Windows.Forms.Button();
this.btn1 = new System.Windows.Forms.Button();
this.btn0 = new System.Windows.Forms.Button();
this.btnAdd = new System.Windows.Forms.Button();
this.btnDiv = new System.Windows.Forms.Button();
this.btnMul = new System.Windows.Forms.Button();
this.btnSub = new System.Windows.Forms.Button();
this.btnClear = new System.Windows.Forms.Button();
this.resultBox = new System.Windows.Forms.TextBox();
this.btnResult = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// btn9
//
this.btn9.Location = new System.Drawing.Point(, );
this.btn9.Name = "btn9";
this.btn9.Size = new System.Drawing.Size(, );
this.btn9.TabIndex = ;
this.btn9.Text = "";
this.btn9.UseVisualStyleBackColor = true;
this.btn9.Click += new System.EventHandler(this.btn9_Click);
//
// btn8
//
this.btn8.Location = new System.Drawing.Point(, );
this.btn8.Name = "btn8";
this.btn8.Size = new System.Drawing.Size(, );
this.btn8.TabIndex = ;
this.btn8.Text = "";
this.btn8.UseVisualStyleBackColor = true;
this.btn8.Click += new System.EventHandler(this.btn8_Click);
//
// btn7
//
this.btn7.Location = new System.Drawing.Point(, );
this.btn7.Name = "btn7";
this.btn7.Size = new System.Drawing.Size(, );
this.btn7.TabIndex = ;
this.btn7.Text = "";
this.btn7.UseVisualStyleBackColor = true;
this.btn7.Click += new System.EventHandler(this.btn7_Click);
//
// btn6
//
this.btn6.Location = new System.Drawing.Point(, );
this.btn6.Name = "btn6";
this.btn6.Size = new System.Drawing.Size(, );
this.btn6.TabIndex = ;
this.btn6.Text = "";
this.btn6.UseVisualStyleBackColor = true;
this.btn6.Click += new System.EventHandler(this.btn6_Click);
//
// btn5
//
this.btn5.Location = new System.Drawing.Point(, );
this.btn5.Name = "btn5";
this.btn5.Size = new System.Drawing.Size(, );
this.btn5.TabIndex = ;
this.btn5.Text = "";
this.btn5.UseVisualStyleBackColor = true;
this.btn5.Click += new System.EventHandler(this.btn5_Click);
//
// btn4
//
this.btn4.Location = new System.Drawing.Point(, );
this.btn4.Name = "btn4";
this.btn4.Size = new System.Drawing.Size(, );
this.btn4.TabIndex = ;
this.btn4.Text = "";
this.btn4.UseVisualStyleBackColor = true;
this.btn4.Click += new System.EventHandler(this.btn4_Click);
//
// btn3
//
this.btn3.Location = new System.Drawing.Point(, );
this.btn3.Name = "btn3";
this.btn3.Size = new System.Drawing.Size(, );
this.btn3.TabIndex = ;
this.btn3.Text = "";
this.btn3.UseVisualStyleBackColor = true;
this.btn3.Click += new System.EventHandler(this.btn3_Click);
//
// btn2
//
this.btn2.Location = new System.Drawing.Point(, );
this.btn2.Name = "btn2";
this.btn2.Size = new System.Drawing.Size(, );
this.btn2.TabIndex = ;
this.btn2.Text = "";
this.btn2.UseVisualStyleBackColor = true;
this.btn2.Click += new System.EventHandler(this.btn2_Click);
//
// btn1
//
this.btn1.Location = new System.Drawing.Point(, );
this.btn1.Name = "btn1";
this.btn1.Size = new System.Drawing.Size(, );
this.btn1.TabIndex = ;
this.btn1.Text = "";
this.btn1.UseVisualStyleBackColor = true;
this.btn1.Click += new System.EventHandler(this.btn1_Click);
//
// btn0
//
this.btn0.Location = new System.Drawing.Point(, );
this.btn0.Name = "btn0";
this.btn0.Size = new System.Drawing.Size(, );
this.btn0.TabIndex = ;
this.btn0.Text = "";
this.btn0.UseVisualStyleBackColor = true;
this.btn0.Click += new System.EventHandler(this.btn0_Click);
//
// btnAdd
//
this.btnAdd.Location = new System.Drawing.Point(, );
this.btnAdd.Name = "btnAdd";
this.btnAdd.Size = new System.Drawing.Size(, );
this.btnAdd.TabIndex = ;
this.btnAdd.Text = "+";
this.btnAdd.UseVisualStyleBackColor = true;
this.btnAdd.Click += new System.EventHandler(this.btnAdd_Click);
//
// btnDiv
//
this.btnDiv.Location = new System.Drawing.Point(, );
this.btnDiv.Name = "btnDiv";
this.btnDiv.Size = new System.Drawing.Size(, );
this.btnDiv.TabIndex = ;
this.btnDiv.Text = "-";
this.btnDiv.UseVisualStyleBackColor = true;
this.btnDiv.Click += new System.EventHandler(this.btnDiv_Click);
//
// btnMul
//
this.btnMul.Location = new System.Drawing.Point(, );
this.btnMul.Name = "btnMul";
this.btnMul.Size = new System.Drawing.Size(, );
this.btnMul.TabIndex = ;
this.btnMul.Text = "*";
this.btnMul.UseVisualStyleBackColor = true;
this.btnMul.Click += new System.EventHandler(this.btnMul_Click);
//
// btnSub
//
this.btnSub.Location = new System.Drawing.Point(, );
this.btnSub.Name = "btnSub";
this.btnSub.Size = new System.Drawing.Size(, );
this.btnSub.TabIndex = ;
this.btnSub.Text = "/";
this.btnSub.UseVisualStyleBackColor = true;
this.btnSub.Click += new System.EventHandler(this.btnSub_Click);
//
// btnClear
//
this.btnClear.Location = new System.Drawing.Point(, );
this.btnClear.Name = "btnClear";
this.btnClear.Size = new System.Drawing.Size(, );
this.btnClear.TabIndex = ;
this.btnClear.Text = "C";
this.btnClear.UseVisualStyleBackColor = true;
this.btnClear.Click += new System.EventHandler(this.btnClear_Click);
//
// resultBox
//
this.resultBox.Location = new System.Drawing.Point(, );
this.resultBox.Name = "resultBox";
this.resultBox.RightToLeft = System.Windows.Forms.RightToLeft.Yes;
this.resultBox.Size = new System.Drawing.Size(, );
this.resultBox.TabIndex = ;
this.resultBox.Text = "";
//
// btnResult
//
this.btnResult.Location = new System.Drawing.Point(, );
this.btnResult.Name = "btnResult";
this.btnResult.Size = new System.Drawing.Size(, );
this.btnResult.TabIndex = ;
this.btnResult.Text = "=";
this.btnResult.UseVisualStyleBackColor = true;
this.btnResult.Click += new System.EventHandler(this.btnResult_Click);
//
// Calculate
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(, );
this.Controls.Add(this.btnResult);
this.Controls.Add(this.resultBox);
this.Controls.Add(this.btnClear);
this.Controls.Add(this.btnSub);
this.Controls.Add(this.btnMul);
this.Controls.Add(this.btnDiv);
this.Controls.Add(this.btnAdd);
this.Controls.Add(this.btn0);
this.Controls.Add(this.btn1);
this.Controls.Add(this.btn2);
this.Controls.Add(this.btn3);
this.Controls.Add(this.btn4);
this.Controls.Add(this.btn5);
this.Controls.Add(this.btn6);
this.Controls.Add(this.btn7);
this.Controls.Add(this.btn8);
this.Controls.Add(this.btn9);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
this.Name = "Calculate";
this.Text = "Calculate";
this.ResumeLayout(false);
this.PerformLayout(); } #endregion private System.Windows.Forms.Button btn9;
private System.Windows.Forms.Button btn8;
private System.Windows.Forms.Button btn7;
private System.Windows.Forms.Button btn6;
private System.Windows.Forms.Button btn5;
private System.Windows.Forms.Button btn4;
private System.Windows.Forms.Button btn3;
private System.Windows.Forms.Button btn2;
private System.Windows.Forms.Button btn1;
private System.Windows.Forms.Button btn0;
private System.Windows.Forms.Button btnAdd;
private System.Windows.Forms.Button btnDiv;
private System.Windows.Forms.Button btnMul;
private System.Windows.Forms.Button btnSub;
private System.Windows.Forms.Button btnClear;
private System.Windows.Forms.TextBox resultBox;
private System.Windows.Forms.Button btnResult;
}
}
//项目文件 Calculate.cs
using 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 = "";
_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.cs
using 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 = ""; }
}
}

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

总结:

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

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

妙用Object的更多相关文章

  1. console中一些不常用的实用方法

    console.group('分组1'); console.table( [ {key1: 1,key2: 2,key3: 3}, {key1: 1,key2: 2,key3: 3}, {key1: ...

  2. js 基础拓展

    1.关于 try catch 的用法 <body> <div>请输出一个 5 到 10 之间的数字:</div> <input id="demo&q ...

  3. Tuple<int, int> Dictionary<string, object>妙用

    Tuple<int, int> Dictionary<string, object>妙用

  4. TestNG中的DataProvider返回Iterator<Object[]>的妙用

    TestNG中使用DataProvider有个好处,就是: 1. 在执行用例的时候dataProvider迭代中的每组数据都是作为一个用例执行 2. 在测试数据有规律的情况下,免去了添加testXML ...

  5. 【优雅代码】深入浅出 妙用Javascript中apply、call、bind

    这篇文章实在是很难下笔,因为网上相关文章不胜枚举. 巧合的是前些天看到阮老师的一篇文章的一句话: “对我来说,博客首先是一种知识管理工具,其次才是传播工具.我的技术文章,主要用来整理我还不懂的知识.我 ...

  6. 【javascript 技巧】Array.prototype.slice的妙用

    Array.prototype.slice的妙用 开门见山,关于Array 的slice的用法可以参考这里 http://www.w3school.com.cn/js/jsref_slice_arra ...

  7. 妙味课堂——HTML+CSS基础笔记

    妙味课堂的课程讲得非常的清楚,受益匪浅.先把HTML和CSS基础课程部分视频的学习笔记记录如下: padding #PS基础 ##前端需要的PS技能 - PS技能(前端需要):切图.修图.测量 - P ...

  8. (转)深入浅出 妙用Javascript中apply、call、bind

    原文连接 深入浅出 妙用Javascript中apply.call.bind 网上文章虽多,大多复制粘贴,且晦涩难懂,我希望能够通过这篇文章,能够清晰的提升对apply.call.bind的认识,并且 ...

  9. View.setTag(key,object)异常:The key must be an application-specific resource id.

    07-11 13:43:26.184: E/AndroidRuntime(10229): FATAL EXCEPTION: main07-11 13:43:26.184: E/AndroidRunti ...

随机推荐

  1. net start sql server (instance)

    如何启动 SQL Server 实例(net 命令) 其他版本   可以使用 Microsoft Windows net 命令启动 Microsoft SQL Server 服务. 启动 SQL Se ...

  2. Dialog 自定义使用2(进度条)

    1:  自定义的Dialog 代码: public class IphoneProgersssDialog extends Dialog { private Context context; priv ...

  3. Luogu 2258 [NOIP2014] 子矩阵

    被普及组虐了,感觉

  4. 在VM12中安装ubuntu系统下的VMTOOLS

    转载自http://www.jb51.net/article/97387.htm 一.下载Ubuntu镜像: Ubuntu官网下载地址 二.创建虚拟机 打开VMware Workstation,点击创 ...

  5. try catch 块中debug时发现错误细节的一次记录

    在解决已有代码的一个问题时,有一个try catch块,基本代码如下: try { //do something } catch { LogHelper.Debug(typeof(myHelper), ...

  6. Linux的.run文件简单制作

    run程序安装包实质上是一个安装脚本加要安装的程序,如下图所示: |-----------------|| || 安装脚本 || ||-----------------|| || 程序 || ||-- ...

  7. ListBox点击改变相应的值

    private void lbCity_SelectedIndexChanged(object sender, EventArgs e) { 写逻辑 }

  8. 【mybatis在控制台打印sql语句配置】

    导入jar包:http://pan.baidu.com/s/1sl8RU37 <strong>############################################### ...

  9. Page_Load事件与IsPostBack属性

    下面是一个登陆的界面: 我们的需求是:        第一次进入登陆界面时,用户名和密码应该为空,所以我们应该在Page_Load中将存放用户名和密码的两个文本框的内容清空.然后当我们单击登陆按钮时, ...

  10. PHP7中Protobuf的安装使用

    PHP7中Protobuf的安装使用 写这篇文章的缘由是最近在关注RPC框架序列化的一些原理.但是在安装Protobuf的时候,发现网上的教程都太老了,加上目前Protobuf官方已经支持PHP了,不 ...