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>

 

好了,翻译完了。发现翻译博文比自己写还要累。

希望此博文能给大家带来帮助,如有不妥之处,请指正。虽然本人英语水平一般,但今后还会抽空翻译一些优秀的博文(就怕经我翻译后就成糟粕了),希望和大家多多交流,共同进步。

posted @ 2013-03-25 20:54  zzhi.wang  阅读(3359)  评论(5编辑  收藏  举报