作者: 中科院计算所培训中心 王宇
如果想了解更多关于DotNet方面的技术资料,文章以及视频,请到本团队的主页:http://www.warensoft.cn
Visual stutio2005中新增加的代码段(code snippet)功能大大提高了我们开发的速度,我们只要写简单的几个字就可以实现一大段代码的编写,比如:
我们要写MessageBox.Show();只要写mbox然后再点两下Tab键就可以了,这种作法叫做“可扩展式代码段(Expension)”,除此之外,VS2005还支持”外围式代码段(surround with)”的功能,使用时,先用鼠标选中要处理的代码,然后点右键,选中”外侧代码”,如下图:
这里会出现如下菜单:
我们要作的是在外侧代码提示下输入你想要的代码段,比如”if”,然后点一下TAB键,这时我们选中的代码就会被外围起来,如下图:
在vs2005中,绝大多数的代码都有代码段功能.那么大家就会问,我们能不能把自己常用的代码也做成code snippet呢?
我们当然可以,那么我们先要弄清楚MS已经实现的代码段是怎么写的呢?
首先打开”工具->代码片段管理器(或者按住ctrl 再连续按下k和b)”
选择visual C#,并且展开
先来看看if语句的代码片段,这里可以看到它的路径,是一个扩展名为.snippet的文件,我们把它打开,可以看到原代码:
<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
<CodeSnippet Format="1.0.0">
<Header>
<Title>if</Title>
<Shortcut>if</Shortcut>
<Description>if 语句的代码段</Description>
<Author>Microsoft Corporation</Author>
<SnippetTypes>
<SnippetType>Expansion</SnippetType>
<SnippetType>SurroundsWith</SnippetType>
</SnippetTypes>
</Header>
<Snippet>
<Declarations>
<Literal>
<ID>expression</ID>
<ToolTip>要计算的表达式</ToolTip>
<Default>true</Default>
</Literal>
</Declarations>
<Code Language="csharp"><![CDATA[if ($expression$)
{
$selected$ $end$
}]]>
</Code>
</Snippet>
</CodeSnippet>
</CodeSnippets>
大家可以看到,其实这个文件是一个XML文件,并且包含多个子节点,我们可以把这个XML文件的根合并,然后一级一级的分析:
这里面包含两个可以展开的子节点:<Header>子节点和<Snippet>子节点
<Header>子节点:用于表示当前Code Snippet文件的一些声明信息,包括(“//”表示作者添加的注解):
<Title>if</Title>//代码片段的标题
<Shortcut>if</Shortcut>//该代码片段的快捷方式(也就是说你输入什么字母能出来)
<Description>if 语句的代码段</Description>//输入快捷方式后和提示
<Author>Microsoft Corporation</Author>//哪个公司出的
<SnippetTypes>
<SnippetType>Expansion</SnippetType>//指明该代码段可以用作扩展的
<SnippetType>SurroundsWith</SnippetType>//指明该代码段可以用作外围的
</SnippetTypes>
<Snippet>子节点是代码段的正文,其中包括两个子节<Declarations>子节和<Code >子节,如下图:
<Declarations>子节用于定义代码变量,在该子节中可以包括多个<literal>子节,每一个<literal>子节都是一个变量,说到这里,大家会问,难道CodeSnippet中还需要有变量吗?是的,一定要有!原因如下:
当我们利用代码段写完一个语句块时,总有一些内容是需要再次修改的,比如:输入完if语句的代码段之后,生成的代码如下:
If语句的默认条件是true,用户可能将其改为自己想要的条件,这时true就是一个变量,因此if语句就有一个变量.再比如说,输入完for语句的代码段后,代码如下:
这里用于循环计数的i可能会发生改变,表示循环的length也会被修改,因此length也是一个变量.在for语句的代码段中就包括两个参数.了解这些之后,我们来看一下,if语句中的参数是如何定义的,
<Literal>
<ID>expression</ID>//变量的名
<ToolTip>要计算的表达式</ToolTip>//变量的提示(当鼠标停留在变量上面)
<Default>true</Default>//默认的值
</Literal>
下面我们来说一下<Code >子节,该节是代码段实现的正文,内容如下:
<Code Language="csharp"><![CDATA[if ($expression$)
{
$selected$ $end$
}]]>
</Code>
在该节中,Language属性说明该代码段是在C#语言中使用的.CDATA表示后面的内容为字符串.灰色的文字表示要输出的文字,在要输出的文字中,有两种字符,一种是没有任何标记的,如if,表示它将直接输出.另外一种字符前后都有$符号,该符号表明这是一个前面定义好的变量,比如$expression$就是我们前面看到的<Literal>节中定义的那个变量,这种字符在输出的时候会按着该变量的默认值输出,这里$expression$变量的默认值是true.
后面的$selected$ $end$标记表明在输入完代码段时,我们按下回车键中光标所处的位置.
经过上面的讲解,大家应该明白代码段是怎么定义的了吧?:)
下面,我们来根据上面的经验来自己定义一个代码段吧.代码如下:
<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
<CodeSnippet Format="1.0.0">
<Header>
<Title>def</Title>
<Shortcut>def</Shortcut>
<Description>defining a new object </Description>
<Author>www.MakingMyMoney.com</Author>
<SnippetTypes>
<SnippetType>Expansion</SnippetType>
</SnippetTypes>
</Header>
<Snippet>
<Declarations>
<Literal>
<ID>DataType</ID>
<ToolTip>数据类型</ToolTip>
<Default>object</Default>
</Literal>
<Literal>
<ID>Variant</ID>
<ToolTip>变量</ToolTip>
<Default>var</Default>
</Literal>
</Declarations>
<Code Language="csharp">
<![CDATA[$DataType$ $Variant$=new $DataType$();$selected$ $end$
]]>
</Code>
</Snippet>
</CodeSnippet>
</CodeSnippets>
该代码段实现的功能是帮助我们快速定义变量.我们可以想象一下,定义一个变量的时候,我们的代码通常是这样的:
DataSet ds = new DataSet();
这里数据类型及构造函数是一个样,并且可能是经常改变的,因此,我这里将它定义为一个变量 “DataType”,另外上面一行代码中的变量名也会改变,因此这里又定义第二个变量” DataType”.
呵呵到这里,另的我就不说了,大家一起学习一下吧.