65.9K
CodeProject 正在变化。 阅读更多。
Home

VS2010 和 C# 4.0 的简洁而有趣的特性

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.74/5 (131投票s)

2011年11月10日

CPOL

7分钟阅读

viewsIcon

291873

downloadIcon

1061

VS2010 和 C# 4.0 中一些非常简洁但有趣的特性

引言

VS 2010 和 C# 4.0 引入了许多新特性。在本文中,我将尝试介绍两者中一些非常简洁但非常有用的特性。

1. 隐藏选定的代码部分

很多时候,会出现我们想隐藏某段代码而不是隐藏整个区域的情况。在 VS 2010 中这变得更容易了。只需选择您想隐藏的代码部分,然后右键单击选择 **轮廓 -> 隐藏选定内容**。

与区域代码一样,它也可以折叠和展开。任何时候您想再次移除文本的隐藏,请选择右键单击,然后选择 **轮廓 -> 停止隐藏当前**。

2. DataTips(数据提示)

此选项提供了一种更简单的方式,让我们可以在调试时与任何变量进行交互。在 2010 中,DataTip 可以固定在某个位置,也可以浮动。这使我们在调试时能够更轻松地监视变量及其值。我们可以添加任意数量的 DataTips,它们即使在会话关闭后也会保留在那里。

要将 DataTip 钉住,只需将鼠标指针悬停在任何变量上,您就会看到一个图钉图标,点击它。

您可以将图钉移动到任何位置。图钉提供三个按钮:关闭、取消固定(移除图钉)、展开(添加注释)。

一旦代码已调试完毕,但我们仍想查看变量/表达式在调试时持有何值,那么此功能将非常有用。

您甚至可以导出/导入您的 DataTips。单击 **调试 -> 导出 DataTips** -> 指定要保存 XML 文件的位置。

您可以通过选择 **调试 -> 导入 DataTips** 上的导入选项随时访问您的 XML 文件。

3. String.IsNullOrWhiteSpace

它检查指定的字符串是否为空、`null`,或仅包含空格字符。只有当 `string` 包含这些内容时,方法才会返回 `true`。

  • “`\n`” 用于换行
  • “`\r`” 用于回车
  • “`\v`” 用于垂直空格
  • 普通空格
  • “`\t`” 用于制表符

4. 命名参数和可选参数

VS2010 中,当参数被赋予默认值时,它就变成了可选参数。

在上面的方法中,我们可以省略 `Val1` 和 `Val2`,因为它们有默认值,可以被视为可选参数。当我们开始输入方法时,智能提示会指示哪些参数是可选的。

命名参数允许用户不必记住参数的顺序。如果您知道参数的名称,那么您可以按任何顺序调用它们。智能提示通过参数名后跟冒号来支持命名参数(微笑 | :))。

这是一个展示可选参数和命名参数的完整示例

5. 高亮显示

在代码中的任何位置选择一个标识符,那么该标识符的所有使用之处都会被高亮显示。

在下面的示例中,我选择了标识符 `Val2`,并且它的所有用法都被自动高亮显示。

6. 根据使用情况生成智能提示

这个特性非常有趣。当我创建了一个名为 test 的类,并在声明对象时,不小心写成了 tset,它允许我创建一个对象,并显示一条红线。我体会到了这个特性。

当我看到红线时,我右键单击鼠标,看到了一个名为“生成”的选项,其中有两个选择:`类` 和 `新建` 类型。智能提示的改进如此之大,以至于类中任何缺失的方法都可以先使用,然后再创建。

7. URL 路由

在 ASP.NET 2.0 中,URL 映射在一定程度上是可能的。我们可以定义我们想要显示的 URL,但问题是,在回发的情况下,浏览器中会显示实际的 URL。

URL 路由在 ASP.NET 3.5 中被引入。在其中,回发的问题得到了解决,但我们需要根据 URL 路由的数量创建不同的处理程序类。

在 ASP.NET 4.0 中,为每个路由定义单独处理程序类的需求已被消除,并且有一个内置的辅助函数 `MapPageRoute`,它有助于更快地实现路由。这些路由在 `onApplication_Start` 中注册。

让我们通过一个简单的例子来做路由。我有两个页面 `default` 和 `default2`。每个页面上都有一个按钮带您进入下一个页面。同时,在页面之间移动时,我需要传递一个参数。首先,在 `global.asax` 文件中的 `Application_Start` 部分,我们必须分配我们希望它们在浏览器窗口中显示的 URL。

void Application_Start(object sender, EventArgs e)
{
   // Code that runs on application startup

   System.Web.Routing.RouteTable.Routes.MapPageRoute
	("StoreRoute","MyFirstPage/{Name}","~/Default.aspx");
   System.Web.Routing.RouteTable.Routes.MapPageRoute
	("Route1", "MySecondPage/{Name}", "~/Default2.aspx");
}

`default` 将拥有 URL `MyfirstPage/Value`,其中 `Value` 是参数的名称;`default2` 将拥有 URL `MySecongPage/value`,其中 `value` 是参数的名称。

在 default 页面的按钮单击事件中,我添加了以下代码来调用 `default2` 页面。

protected void btnBack_Click(object sender, EventArgs e)
{
    Response.Redirect(ResolveUrl("~/MySecondPage/") + "An");
}

这里“`An`”是参数 `Name` 的值,在 `default2` 页面上添加了类似的 C# 代码以返回到 `default` 页面。

protected void btnMove_Click(object sender, EventArgs e)
{
    Response.Redirect(ResolveUrl("~/MyFirstPage/") + "Test");
}

路由变得更加简单和容易。我们也可以传递多个参数。

8. 动态语言支持

动态语言是指那些不执行编译时类型检查,而是仅在运行时识别对象类型的语言。编写起来更快、更容易,但我们无法看到编译时错误。因此,我们必须确保应用程序的行为符合预期。

如果我们查看 C# 的早期版本,那么它是一种完全静态的语言,但 4.0 添加了一个新的 `dynamic` 关键字来支持动态特性。使用 `dynamic` 关键字意味着告诉编译器关闭编译时检查。

现在有一个很明显的问题:`Object`、`Var` 和 `Dynamic` 类型之间有什么区别?我们来看看。

对象 动态 Var
编译器对变量类型的信息很少 编译器没有相关信息 编译器拥有完整的信息
变量在使用前需要强制类型转换 无需强制类型转换 无需强制类型转换,因为编译器已经拥有完整的信息
当我们对数据类型没有更多信息时,它很有用 当我们想写更少的代码并使用动态语言时 通常与 Linq 一起使用

9. 使用 ClientIDMode 进行 ClientID 生成

在 ASP.NET 中,如果我们查看客户端,很难预测页面将渲染哪个 `ClientId`。ASP.NET 使用一个唯一的命名系统来生成 `ClientId`。

但现在有了 ASP.NET 4.0,处理 `ClientId` 变得非常容易。到目前为止,我们看到,如果我们向 aspx 页面添加任何控件并查看其源代码,我们可以看到控件的 ID 类似于“`ctl00_MainContent_txtName`”。现在通过 `ClientIDMode` 属性,我们可以按照我们希望生成 ID 的方式来设置它。

ASP.NET 4.0 为 `ClientIDMode` 属性提供了四种模式。

自动

ASP.NET 2.0/3.0/3.5 之前生成的 ID。

示例

<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" />

静态

此模式使客户端 ID 成为 `static`,意味着服务器端分配给控件的 ID 将与客户端 ID 相同。但如果为重复控件设置了 `static` 模式,那么开发者有责任确保客户端 ID 的唯一性。

示例

 <div id="divVal3" runat="server" clientidmode="Static"></div>

当我们查看其源代码时,生成的 Client Id 是 `“divVal3”`。

<div id="divVal3">a= 3</div>

Predictable (可预测)

Predictable 依赖于父命名控件的 `ClientID` 来构建自己的客户端 ID 值。它会取父名称下划线控件名称,排除 `ctxxx`。这对于 `DataBound` 控件特别有用。

示例

<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 (继承)

这是每个控件的默认行为。它会查找其父控件以获取 `ClientIDModel` 的值。

示例

<div id="divVal1" runat="server"></div>

如果我们不设置任何模式,那么默认值是 `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. 应用程序级别

    在您的 `web.config` 文件中,在 `system.web` 下进行设置。当我们将应用程序从 2.0/3.0/3.5 升级到 4 时,这非常有用。那时默认模式是 auto,所以所有控件 ID 都将以 auto 形式渲染,但一旦您升级到 4.0,它将是 Predictable。因此,为了使代码正常工作,我们可以在 `web.config` 中设置 `clientIDMode="Auto"`。

    <system.web >
    <pages clientIDMode="Predictable"> </pages>
    </system.web>

结论

我创建了一个使用上述所有特性的示例应用程序。这并非终点,只是我探索 VS2010 特性之旅的开始。在深入研究这些特性时,它变得非常有趣,还有很多有待探索。

历史

  • 2011 年 11 月 9 日:初始版本
  • 2011 年 11 月 15 日:修改了标题并添加了一个新特性
  • 2011 年 11 月 17 日:添加了一个新特性“`ClientIdMode`”
© . All rights reserved.