VS2010和C#4.0中简单但有趣的功能
原文地址:http://www.codeproject.com/Articles/281615/Simple-but-Interesting-Features-of-VS-2010
本文并不是对原文逐句翻译,为了尽量通俗易懂,本人对原文有所增删,由于本人英语水平有限,若有歧义或错误请指正,O(∩_∩)O~。
介绍
VS 2010和C#4.0引入了许多新功能。在这篇文章中,我来展示一些简单但非常有用的功能。
1、隐藏选定的部分代码
很多时候,我们想要隐藏指定的一段代码而不是隐藏整个区域。这个在VS2010中很容易实现,只需选择要隐藏的代码,点击鼠标右键选择:大纲显示->隐藏选定内容。如下图:
你选择的代码就隐藏起来了。
同样的方式,如果你想让隐藏的代码片段展示开,选择隐藏的代码片段,点击鼠标右键,选择:大纲显示->停止隐藏当前区域。如下图:
2、数据提示
在调试阶段,这个选项给我们监测变量提供了一个简单的方式。在vs2010中,数据提示既可以被固定在一个位置,也可以浮动。这为我们在调试阶段监测变量及其值提供了方便。我们可以添加尽可能多的数据提示,他们将持续存在直至会话结束。
增加“针”到数据提示,只需将鼠标指针移到任何变量,你可以看到“针”图标,点击它。
您可以将您的“针”定位到任何位置。“针”为您提供了三个按钮,关闭,从源分离(以删除针),扩展(添加任何评论)。如下图:
即使代码已经调试通过,我们仍然希望看到变量/表达式在调试时的值,那么这个功能是非常有用的,如下图:
你甚至可以导出/导入您的数据提示:调试->导出数据提示,你想要的XML文件保存到指定的位置。
选择:调试->导入数据提示,您可以随时访问您的XML文件。
3、String.IsNullOrWhiteSpace
检查指定的字符串是否是空的、null或只包含空白字符。如果字符串中包含一下这些,只则该方法将返回true。如下图:
4、命名参数和可选参数
Vs2010中,如果参数有默认值的话,则为可选参数。
对于上面的方法,我们可以省略val1和val2,因为他们有一个默认值,可以被视为可选的。当指定我们都方法时,智能提示显示哪些参数是可选的。
命名参数让我们可以在调用方法时指定参数名字来给参数赋值,这种情况下可以忽略参数的顺序。如下方法声明:
即使我们的val2和val1参数顺序调换了,也可以编译通过。
5、高亮显示
在代码中选择一个标识符,所有使用该标识符的地方都被高亮显示。
在下面的例子中,我选择了标识符VAL2,所有引用它的地方都高亮显示了。
6、生成
如果你想添加一个类,例如:test类,你可以先写一个test字符串,鼠标放在上面右击:生成->类,然后项目当中会添加一个test.cs 文件。
7、动态语言支持
动态语言不执行编译时类型检查,只能在运行时确定对象的类型。这样写起来更快更容易,但我们无法看到编译时的错误。
如果我们看到以前版本的C#,那么它是完全静态的语言,但4.0又增添了新的活力元素,支持动态特征。使用dynamic关键字告诉编译器关闭编译时检查。
那么,Object 、var、dynamic之间的区别是什么呢?
Object |
Dynamic |
Var |
能够存储任何类型的值,因为对象是.NET框架下所有类型的基类。 |
能够存储任何类型的变量,类似于旧的VB语言变量。 |
能够存储任何类型的值,但它需要在声明时初始化。 |
编译器对此类型的信息很少 |
编译器不知道此类型变量的任何信息 |
编译安全的,编译器拥有所有类型信息,所以在运行时不会出错。 |
既可以作为方法参数也可以作为方法返回参数 |
既可以作为方法参数也可以作为方法返回参数 |
这种类型的变量只能在它的定义的范围内使用。不可以作为方法参数进行传递,也不能作为方法的返回值。 |
使用前必须转换为原始的类型。这可能进行装箱、拆箱,从而增加性能开销 |
不需要类型转换,但你需要知道相关的存储类型的属性和方法 |
不需要转换,因为编译器拥有所有的信息进行操作 |
在运行时如果存储的值是不会转化为底层数据类型将导致问题 |
如果有错误的方法或属性将导致问题,因为所有存储值的信息只在运行时得到。 |
不会造成问题,因为编译器有所有有关存储值的信息。 |
当数据类型没有更多的信息时比较有用 |
适合使用反射或动态语言或COM对象,因为我们需要编写的代码量较少。 |
得到有用的LINQ查询的结果 |
8、使用ClientIDMode定义ClientID
AutoID
ClientID 值是通过将命名为控件的 ID 值的每一父级的 ID 值生成的容器。在控件的多个实例呈现的数据绑定方案中,递增的值在控件的 ID 值之前插入。每段由下划线字符 (_) 分隔。此算法早于 ASP.NET 4. 用于 ASP.NET 的版本。
例如:
<asp:TextBox ID="txtData" runat="server" ClientIDMode="AutoID"></asp:TextBox>
当我们查看源码,产生的clientid是ctl00_MainContent_txtData
<input name="ctl00$MainContent$txtData"
type="text" value="Test" id="ctl00_MainContent_txtData" />
Static
ClientID 值设置为 ID 属性的值。如果该控件是命名容器,控件用作命名容器的层次结构的顶部为其包含的所有控件。
<div id="divVal3" runat="server" clientidmode="Static"></div>
当我们查看源码,产生的clientid是 "divVal3"
<div id="divVal3">a= 3</div>
Predictable
此算法为数据控件中的控件使用。 ClientID 值是通过将命名为控件的 ID 值的父级的 ClientID 值生成的容器。如果该控件是生成多个行的数据绑定控件,在ClientIDRowSuffix 属性指定的数据字段的值添加在末尾。为 GridView 控件,多个数据字段中指定。如果 ClientIDRowSuffix 属性为空,序号添加在末尾而不是数据字段值。此数字开头在零和由 1 增加每行的。每段由下划线字符 (_) 分隔。
<asp:GridView ID="grdTest"
runat="server" AutoGenerateColumns="false"
ClientIDMode="Predictable" >
<Columns>
<asp:TemplateField HeaderText="ID">
<ItemTemplate>
<asp:Label ID="ID"
runat="server" Text='
<%# Eval("ID") %>' />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Name">
<ItemTemplate>
<asp:Label ID="Name"
runat="server" Text='
<%# Eval("Name") %>' />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
查看源码
<table id="grdTest"
style="border-collapse: collapse"
cellspacing="0" rules="all"
border="1">
<tbody>
<tr>
<th scope="col">ID</th>
<th scope="col">Name</th>
</tr>
<tr>
<td><span id="
grdTest_ID_0">1</span></td>
<td><span id="
grdTest_Name_0">ABC</span></td>
</tr>
...
<tr>
<td><span id="
grdTest_ID_1">2</span></td>
<td><span id="
grdTest_Name_1">XYZ</span></td>
</tr>
</tbody>
</table>
Inherit
控件继承其父控件的 ClientIDMode 设置。页的 ClientIDMode 的默认值为 Predictable。控件 ClientIDMode 的默认值是 Inherit。由于控件的默认值为 Inherit,因此默认生成模式为 Predictable。
<div id="divVal1" runat="server"></div>
在不定义ClientIDMode的情况下,默认是 Inherit.
<div id="MainContent_divVal1">a= 1, Val1= Named Val 1, Val2= Named Val 2</div>
我们有3种方式设置这些属性:
1. 控件级别
<div id="divVal3" runat="server" clientidmode="Static"> </div>
2 .页面级别
<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master"
AutoEventWireup="true"
CodeFile="Default.aspx.cs" Inherits="_Default" ClientIDMode="Inherit" %>
3.应用程序级别
<system.web >
<pages clientIDMode="Predictable"> </pages>
</system.web>
好了,翻译完了。发现翻译博文比自己写还要累。
希望此博文能给大家带来帮助,如有不妥之处,请指正。虽然本人英语水平一般,但今后还会抽空翻译一些优秀的博文(就怕经我翻译后就成糟粕了),希望和大家多多交流,共同进步。