探秘C# 6.0 的新特性
C# 6.0 中的新特性
我們可以對(duì)這些新特性一個(gè)一個(gè)的進(jìn)行討論,而首先要列出 C# 6.0 中這些特性的一個(gè)清單
自動(dòng)的屬性初始化器 Auto Property Initializer
主構(gòu)造器 Primary Consturctor
字典初始化器 Dictionary Initializer
聲明表達(dá)式 Declaration Expression
靜態(tài)的Using Static Using
catch 塊中的 await
異常過(guò)濾器 Exception Filter
用于檢查NULL值的條件訪問(wèn)操作符
1. 自動(dòng)的屬性初始化器Auto Property initialzier
之前的方式
初始化一個(gè)自動(dòng)屬性Auto Property的唯一方式,就是去實(shí)現(xiàn)一個(gè)明確的構(gòu)造器,在里面對(duì)屬性值進(jìn)行設(shè)置.
public class AutoPropertyBeforeCsharp6
{
private string _postTitle = string.Empty;
public AutoPropertyBeforeCsharp6()
{
//assign initial values
PostID = 1;
PostName = "Post 1";
}
public long PostID { get; set; }
public string PostName { get; set; }
public string PostTitle
{
get { return _postTitle; }
protected set
{
_postTitle = value;
}
}
}
有了這個(gè)特性之后的方式
使用 C# 6 自動(dòng)實(shí)現(xiàn)的帶有初始值的屬性可以不用編寫構(gòu)造器就能被初始化. 我們可以用下面的代碼簡(jiǎn)化上面的示例:
public class AutoPropertyInCsharp6
{
public long PostID { get; } = 1;
public string PostName { get; } = "Post 1";
public string PostTitle { get; protected set; } = string.Empty;
}
2. 主構(gòu)造器
我們使用構(gòu)造器主要是來(lái)初始化里面的值.(接受參數(shù)值并將這些參數(shù)值賦值給實(shí)體屬性).
之前的方式
public class PrimaryConstructorsBeforeCSharp6
{
public PrimaryConstructorsBeforeCSharp6(long postId, string postName, string postTitle)
{
PostID = postId;
PostName = postName;
PostTitle = postTitle;
}
public long PostID { get; set; }
public string PostName { get; set; }
public string PostTitle { get; set; }
}
有了這個(gè)特性之后的方式
public class PrimaryConstructorsInCSharp6(long postId, string postName, string postTitle)
{
public long PostID { get; } = postId;
public string PostName { get; } = postName;
public string PostTitle { get; } = postTitle;
}
在 C# 6 中, 主構(gòu)造器為我們提供了使用參數(shù)定義構(gòu)造器的一個(gè)簡(jiǎn)短語(yǔ)法. 每個(gè)類只可以有一個(gè)主構(gòu)造器.
如果你觀察上面的示例,會(huì)發(fā)現(xiàn)我們將參數(shù)初始化移動(dòng)到了類名的旁邊.
你可能會(huì)得到下面這樣的錯(cuò)誤“Feature ‘primary constructor' is only available in ‘experimental' language version.”(主構(gòu)造器特性只在實(shí)驗(yàn)性質(zhì)的語(yǔ)言版本中可用),為了解決這個(gè)問(wèn)題,我們需要編輯SolutionName.csproj 文件,來(lái)規(guī)避這個(gè)錯(cuò)誤 . 你所要做的就是在WarningTag 后面添加額外的設(shè)置
<LangVersion>experimental</LangVersion>
‘主構(gòu)造器'只在‘實(shí)驗(yàn)'性質(zhì)的語(yǔ)言版本中可用
3. 字典初始化器
之前的方式
編寫一個(gè)字典初始化器的老辦法如下
public class DictionaryInitializerBeforeCSharp6
{
public Dictionary<string, string> _users = new Dictionary<string, string>()
{
{"users", "Venkat Baggu Blog" },
{"Features", "Whats new in C# 6" }
};
}
有了這個(gè)特性之后的方式
我們可以像數(shù)組里使用方括號(hào)的方式那樣定義一個(gè)字典初始化器
public class DictionaryInitializerInCSharp6
{
public Dictionary<string, string> _users { get; } = new Dictionary<string, string>()
{
["users"] = "Venkat Baggu Blog",
["Features"] = "Whats new in C# 6"
};
}
4. 聲明表達(dá)式
之前的方式
public class DeclarationExpressionsBeforeCShapr6()
{
public static int CheckUserExist(string userId)
{
//Example 1
int id;
if (!int.TryParse(userId, out id))
{
return id;
}
return id;
}
public static string GetUserRole(long userId)
{
////Example 2
var user = _userRepository.Users.FindById(x => x.UserID == userId);
if (user!=null)
{
// work with address ...
return user.City;
}
}
}
有了這個(gè)特性之后的方式
在 C# 6 中你可以在表達(dá)式的中間聲明一個(gè)本地變量. 使用聲明表達(dá)式我們還可以在if表達(dá)式和各種循環(huán)表達(dá)式中聲明變量
public class DeclarationExpressionsInCShapr6()
{
public static int CheckUserExist(string userId)
{
if (!int.TryParse(userId, out var id))
{
return id;
}
return 0;
}
public static string GetUserRole(long userId)
{
////Example 2
if ((var user = _userRepository.Users.FindById(x => x.UserID == userId) != null)
{
// work with address ...
return user.City;
}
}
}
5. 靜態(tài)的 Using
之前的方式
對(duì)于你的靜態(tài)成員而言,沒(méi)必要為了調(diào)用一個(gè)方法而去弄一個(gè)對(duì)象實(shí)例. 你會(huì)使用下面的語(yǔ)法
TypeName.MethodName
public class StaticUsingBeforeCSharp6
{
public void TestMethod()
{
Console.WriteLine("Static Using Before C# 6");
}
}
之后的方式
在 C# 6 中,你不用類名就能使用靜態(tài)成員. 你可以在命名空間中引入靜態(tài)類.
如果你看了下面這個(gè)實(shí)例,就會(huì)看到我們將靜態(tài)的Console類移動(dòng)到了命名空間中
using System.Console;
namespace newfeatureincsharp6
{
public class StaticUsingInCSharp6
{
public void TestMethod()
{
WriteLine("Static Using Before C# 6");
}
}
}
6. catch塊里面的await
C# 6 之前catch和finally塊中是不能用await 關(guān)鍵詞的. 在 C# 6 中,我們終于可以再這兩個(gè)地方使用await了.
try
{
//Do something
}
catch (Exception)
{
await Logger.Error("exception logging")
}
7. 異常過(guò)濾器
異常過(guò)濾器可以讓你在catch塊執(zhí)行之前先進(jìn)行一個(gè)if條件判斷.
看看這個(gè)發(fā)生了一個(gè)異常的示例,現(xiàn)在我們想要先判斷里面的Exception是否為null,然后再執(zhí)行catch塊
//示例 1
try
{
//Some code
}
catch (Exception ex) if (ex.InnerException == null)
{
//Do work
}
//Before C# 6 we write the above code as follows
//示例 1
try
{
//Some code
}
catch (Exception ex)
{
if(ex.InnerException != null)
{
//Do work;
}
}
8. 用于檢查NULL值的條件訪問(wèn)操作符?.
看看這個(gè)實(shí)例,我們基于UserID是否不為null這個(gè)條件判斷來(lái)提取一個(gè)UserRanking.
之前的方式
var userRank = "No Rank";
if(UserID != null)
{
userRank = Rank;
}
//or
var userRank = UserID != null ? Rank : "No Rank"
有了這個(gè)特性之后方式
var userRank = UserID?.Rank ?? "No Rank";
以上所述就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。
相關(guān)文章
WinForm IP地址輸入框控件實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了WinForm IP地址輸入框控件的實(shí)現(xiàn)代碼,基于VS2010模擬windows系統(tǒng)自帶IP輸入框,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05
.NET連接MongoDB數(shù)據(jù)庫(kù)實(shí)例教程
這則小竅門將講述如何開(kāi)發(fā)一個(gè).NET應(yīng)用來(lái)連接Mongo數(shù)據(jù)庫(kù)并執(zhí)行多種操作。同時(shí)還稍微涉及了Mongo數(shù)據(jù)庫(kù)和多種命令2013-11-11
HttpWebRequest實(shí)現(xiàn)下載圖片至本地
這篇文章主要為大家詳細(xì)介紹了HttpWebRequest實(shí)現(xiàn)下載圖片至本地,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
IIS下調(diào)用證書出現(xiàn)異常的解決方法 (C#)
這篇文章主要為大家詳細(xì)介紹了IIS下調(diào)用證書出現(xiàn)異常的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
基于C#編寫經(jīng)理評(píng)分系統(tǒng)
最近接了這樣一個(gè)項(xiàng)目,要求使用c#編寫經(jīng)理評(píng)分系統(tǒng),需求,要顯示員工信息,實(shí)現(xiàn)項(xiàng)目經(jīng)理給員工評(píng)分功能,今天小編分步驟給大家介紹,需要的的朋友參考下2017-03-03


