原文地址: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>
好了,翻譯完了。發現翻譯博文比自己寫還要累。
希望此博文能給大家帶來幫助,如有不妥之處,請指正。雖然本人英語水平一般,但今后還會抽空翻譯一些優秀的博文(就怕經我翻譯后就成糟粕了),希望和大家多多交流,共同進步。