源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

探秘C# 6.0 的新特性

  • 时间:2022-05-30 20:00 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:探秘C# 6.0 的新特性
[b]C# 6.0 中的新特性[/b] 我们可以对这些新特性一个一个的进行讨论,而首先要列出 C# 6.0 中这些特性的一个清单 自动的属性初始化器 Auto Property Initializer 主构造器 Primary Consturctor 字典初始化器 Dictionary Initializer 声明表达式 Declaration Expression 静态的Using Static Using catch 块中的 await 异常过滤器 Exception Filter 用于检查NULL值的条件访问操作符 [b]1. 自动的属性初始化器Auto Property initialzier[/b] 之前的方式 初始化一个自动属性Auto Property的唯一方式,就是去实现一个明确的构造器,在里面对属性值进行设置.
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;
    }
  }
}
有了这个特性之后的方式 使用 C# 6 自动实现的带有初始值的属性可以不用编写构造器就能被初始化. 我们可以用下面的代码简化上面的示例:
public class AutoPropertyInCsharp6
{
  public long PostID { get; } = 1;
 
  public string PostName { get; } = "Post 1";
 
  public string PostTitle { get; protected set; } = string.Empty;
}
[b]2. 主构造器[/b] 我们使用构造器主要是来初始化里面的值.(接受参数值并将这些参数值赋值给实体属性). 之前的方式
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; }
}
有了这个特性之后的方式
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 中, 主构造器为我们提供了使用参数定义构造器的一个简短语法. 每个类只可以有一个主构造器. 如果你观察上面的示例,会发现我们将参数初始化移动到了类名的旁边. 你可能会得到下面这样的错误“Feature ‘primary constructor' is only available in ‘experimental' language version.”(主构造器特性只在实验性质的语言版本中可用),为了解决这个问题,我们需要编辑SolutionName.csproj 文件,来规避这个错误 . 你所要做的就是在WarningTag 后面添加额外的设置
<LangVersion>experimental</LangVersion>
[url=http://venkatbaggu.com/wp-content/uploads/2014/10/Feature-primary-constructor-is-only-available-in-experimental-language-version.png][img]http://files.jb51.net/file_images/article/201503/2015032411183349.png[/img] [/url] ‘主构造器'只在‘实验'性质的语言版本中可用 [b]3. 字典初始化器 [/b] [b]之前的方式[/b] 编写一个字典初始化器的老办法如下
public class DictionaryInitializerBeforeCSharp6
{
  public Dictionary<string, string> _users = new Dictionary<string, string>()
  {
    {"users", "Venkat Baggu Blog" },
    {"Features", "Whats new in C# 6" }
  };
}
有了这个特性之后的方式 我们可以像数组里使用方括号的方式那样定义一个字典初始化器
public class DictionaryInitializerInCSharp6
{
  public Dictionary<string, string> _users { get; } = new Dictionary<string, string>()
  {
    ["users"] = "Venkat Baggu Blog",
    ["Features"] = "Whats new in C# 6" 
  };
}
[b]4. 声明表达式[/b] [b]之前的方式[/b]
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;
    }
  }
}
有了这个特性之后的方式 在 C# 6 中你可以在表达式的中间声明一个本地变量. 使用声明表达式我们还可以在if表达式和各种循环表达式中声明变量
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;
    }
  }
}
[b]5. 静态的 Using [/b] [b]之前的方式[/b] 对于你的静态成员而言,没必要为了调用一个方法而去弄一个对象实例. 你会使用下面的语法
TypeName.MethodName

public class StaticUsingBeforeCSharp6
{
  public void TestMethod()
  {
    Console.WriteLine("Static Using Before C# 6");
  }
}
之后的方式 在 C# 6 中,你不用类名就能使用静态成员. 你可以在命名空间中引入静态类. 如果你看了下面这个实例,就会看到我们将静态的Console类移动到了命名空间中
using System.Console;
namespace newfeatureincsharp6
{
  public class StaticUsingInCSharp6
  {
    public void TestMethod()
    {
      WriteLine("Static Using Before C# 6");
    }
  }
}
[b]6. catch块里面的await [/b] C# 6 之前catch和finally块中是不能用await 关键词的. 在 C# 6 中,我们终于可以再这两个地方使用await了.
try 
{     
 //Do something
}
catch (Exception)
{
 await Logger.Error("exception logging")
}
[b]7. 异常过滤器 [/b] 异常过滤器可以让你在catch块执行之前先进行一个if条件判断. 看看这个发生了一个异常的示例,现在我们想要先判断里面的Exception是否为null,然后再执行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;
  }
}
[b]8. 用于检查NULL值的条件访问操作符?. [/b] 看看这个实例,我们基于UserID是否不为null这个条件判断来提取一个UserRanking. 之前的方式
var userRank = "No Rank";
if(UserID != null)
{
  userRank = Rank;
}
 
//or
 
var userRank = UserID != null ? Rank : "No Rank"
有了这个特性之后方式
var userRank = UserID?.Rank ?? "No Rank";
 以上所述就是本文的全部内容了,希望大家能够喜欢。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部