Whidbey 初体验之局部类型 ( partial 类型)
2024-07-21 02:17:06
供稿:网友
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;
/// <summary>
/// 必需的设计器变量。
/// </summary>
private system.componentmodel.container components = null;
public form1()
{
//
// windows 窗体设计器支持所必需的
//
initializecomponent();
//
// todo: 在 initializecomponent 调用后添加任何构造函数代码
//
}
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.dispose();
}
}
base.dispose( disposing );
}
#region windows 窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </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
/// <summary>
/// 应用程序的主入口点。
/// </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
{
/// <summary>
/// required designer variable.
/// </summary>
private system.componentmodel.icontainer components = null;
/// <summary>
/// clean up any resources being used.
/// </summary>
protected override void dispose(bool disposing)
{
if (disposing && (components != null))
{
components.dispose();
}
base.dispose(disposing);
}
#region windows form designer generated code
/// <summary>
/// required method for designer support - do not modify
/// the contents of this method with the code editor.
/// </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