妙用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. 又来一波!Android精品源码分享

    今天又汇总了几个不错的源码给大家!希望能帮到需要的小伙伴~话不多少,直接上源码! 1.Android精品源码:拖动条控件实现源码 此次分享的源码是一个不错的Android控件,建议大家可以细致的看下. ...

  3. 12、IGV-Integrative Genomics Viewer

    1.IGV的网址:http://software.broadinstitute.org/software/igv/(java环境) 常见的几种输入格式bam/sam(比对文件)  TDF(bam的精简 ...

  4. 八数码 Java实现

    参考http://blog.csdn.net/helloworld10086/article/details/41853389 package com.EightNumber.view; import ...

  5. ubuntu-12.04.5安装cacti笔记

    坑啊,磨磨蹭蹭按了一个星期.按了3个版本. 第一次:cacti-0.8.7e.tar.gz 安装完之后,Host: Localhost->Memory Usage...四张图始终出不了.点击进去 ...

  6. hdu1072

    #include <iostream> #include <cstdio> #include <cstring> #include <queue> us ...

  7. NMF非负矩阵分解

    著名的科学杂志<Nature>于1999年刊登了两位科学家D.D.Lee和H.S.Seung对数学中非负矩阵研究的突出成果.该文提出了一种新的矩阵分解思想――非负矩阵分解(Non-nega ...

  8. cargo实现自动化部署远程jetty容器(非安全模式)

    cargo实现自动化部署应用至远程jetty容器 (非安全模式) 一.准备: WAR包:Deployer Web application for the Jetty remote containers ...

  9. <base target="_self"/>标签的用法

    语法 <base target="value"> 属性值 值 描述 _blank 在新窗口中打开被链接文档. _self 默认.在相同的框架中打开被链接文档. _par ...

  10. [Win10] 安装虚拟光驱 用于加载ISO等镜像文件

    百度上找到UltraISO安装 一般来说安装到这就基本会显示一个 若经过上述步骤仍没出现虚拟光驱,则尝试进行加载ISO镜像文件到虚拟光驱然后再看看 这样基本就大功告成了~