Whidbey 初体验之局部类型 ( partial 类型)

Whidbey 初体验 之 局部类型 ( partial 类型)
Visual Studio 2005 [ Whidbey ] 抢先体验版 [ Express Beta 1 ] 出来有一段时间了,并且在微软的官方网站上有免费的下载( 下载地址: http://lab.msdn.microsoft.com/vs2005/ )。就本人而言是非常喜欢c#这一新生的语言的。也许并不能说它是新生的,它是对以往各种语言的提炼,或许它是站在巨人的肩膀上的,所以才显得如此的优秀。伴随体验版而来的c# 2.0 给我们带来了新的语言特性( **generics: 泛型 ; iterators: 迭代 ; partial classes: 局部类型 ; anonymous methods: 匿名方法 ** ; ),使我们能更容易的编写出简洁明快的代码,当然这些新特性给我们带来的远不止简洁明快的代码。这只有在我们使用的过程中自己体会和别人的交流中了解。

分别用2003和2005 新建两个WindowsApplication1
2003和2005 解决方案资源管理器 中都会默认建立一个从System.Windows.Forms.Form 类继承的窗体类Form1
那我们比较下两个不同的IDE环境为我们自动生成的Form1的代码是怎么样的。
选中Form1.cs察看代码
2003:
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.Button button1;
///

1<summary>   
2///  必需的设计器变量。   
3/// </summary>

private System.ComponentModel.Container components = null;

public Form1()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();
//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}

///

1<summary>   
2///  清理所有正在使用的资源。   
3/// </summary>

protected override void Dispose( bool disposing )
{
if ( disposing )
{
if (components != null )
{
components.Dispose();
}
}
base .Dispose( disposing );
}

region Windows 窗体设计器生成的代码

///

1<summary>   
2///  设计器支持所需的方法 - 不要使用代码编辑器修改   
3///  此方法的内容。   
4/// </summary>

private void InitializeComponent()
{
this .button1 = new System.Windows.Forms.Button();
this .SuspendLayout();
//
// button1
//
this .button1.Location = new System.Drawing.Point(88, 72);
this .button1.Name = "button1";
this .button1.Size = new System.Drawing.Size(72, 32);
this .button1.TabIndex = 0;
this .button1.Text = "button1";
this .button1.Click += new System.EventHandler( this .button1_Click);
//
// Form1
//
this .AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this .ClientSize = new System.Drawing.Size(292, 273);
this .Controls.Add( this .button1);
this .Name = "Form1";
this .Text = "Form1";
this .ResumeLayout( false );

}
#endregion

///

1<summary>   
2///  应用程序的主入口点。   
3/// </summary>

[STAThread]
static void Main()
{
Application.Run( new Form1());
}

private void button1_Click(object sender, System.EventArgs e)
{

}
}
**2005:
partial class Form1 : Form
{
public Form1 ()
{
InitializeComponent();
} **

** private void button1_Click( object sender, EventArgs e)
{ **

**}
}
** 察看两个环境下Form1的代码文件 Form1.cs文件里对Form1的代码差别很大,2005中只有那么一点点,对button1的定义没有,Click事件委托也没有只有一个button1_Click()显然是有问题的。如果而且我们很快发现Class Form1是被定义成 partial 的也就是C# 2.0种的新的语言特征 局部类型。然后我们再点一下2005 IDE 解决方案资源管理器 上 的Show All Files按钮,会发现Form1.cs下多了个文件 Form1.Designer.cs 这是2003环境下是没有的, 察看该文件我们会发现对Class Form1的另一部份定义。

partial class Form1
{
///

1<summary>   
2/// Required designer variable.    
3///  </summary>

private System.ComponentModel. IContainer components = null ;

///

1<summary>   
2/// Clean up any resources being used.   
3///  </summary>

protected override void Dispose(bool disposing)
{
if (disposing && (components != null ))
{
components.Dispose();
}
base .Dispose(disposing);
}

#region Windows Form Designer generated code

///

1<summary>   
2/// Required method for Designer support - do not modify   
3/// the contents of this method with the code editor.   
4///  </summary>

private void InitializeComponent()
{
this .button1 = new System.Windows.Forms. Button ();
this .SuspendLayout();
//
// button1
//
this .button1.Location = new System.Drawing. Point (75, 49);
this .button1.Name = " button1 ";
this .button1.Size = new System.Drawing. Size (96, 46);
this .button1.TabIndex = 0;
this .button1.Text = " button1 ";
this .button1.Click += new System.EventHandler(this.button1_Click);
//
// Form1
//
this .AutoScaleBaseSize = new System.Drawing. Size (6, 14);
this .ClientSize = new System.Drawing. Size (292, 273);
this .Controls.Add(this.button1);
this .Name = " Form1 ";
this .Text = " Form1 ";
this .ResumeLayout( false );

}

#endregion

private System.Windows.Forms. Button button1;
}
现在好像2005对Form1的描述好像全了,2005中Form1.cs 和 Form1.Designer.cs 两个文件中对Class Form1的描述相加 就是 2003 Form1.cs 中对Class Form1的描述。由此看来 partial 类型可以使我们把对某个类的描述写在不同地方,甚至写到两个或多个不同的文件中去。 partial 信息只对编译器有用,编译器在编译时看到对某个类的描述是“碎”的( partial 的 ),它会去其他地方收集该类的其他碎片,然后把所有的该类的碎片组合成完整的一个类,再对其编译。所以 partial 体现不到编译好的 IL中去的。至于 partial 类型给我们带来怎么样的意义呢?我们以后再讨论。

#结束
qq:14754875
email:[email protected]
bbs:www.shixm.com/bbs

Published At
Categories with Web编程
Tagged with
comments powered by Disqus