探秘C# 6.0 的新特性

 更新时间:2020年6月25日 11:32  点击:1472

C# 6.0 中的新特性

我们可以对这些新特性一个一个的进行讨论,而首先要列出 C# 6.0 中这些特性的一个清单

自动的属性初始化器 Auto Property Initializer

主构造器 Primary Consturctor

字典初始化器 Dictionary Initializer

声明表达式 Declaration Expression

静态的Using Static Using

catch 块中的 await

异常过滤器 Exception Filter

用于检查NULL值的条件访问操作符

1. 自动的属性初始化器Auto Property initialzier

之前的方式

初始化一个自动属性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;
}

2. 主构造器

我们使用构造器主要是来初始化里面的值.(接受参数值并将这些参数值赋值给实体属性).

之前的方式

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>

‘主构造器'只在‘实验'性质的语言版本中可用

3. 字典初始化器

之前的方式

编写一个字典初始化器的老办法如下

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" 
  };
}

4. 声明表达式

之前的方式

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;
    }
  }
}

5. 静态的 Using

之前的方式

对于你的静态成员而言,没必要为了调用一个方法而去弄一个对象实例. 你会使用下面的语法

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");
    }
  }
}

6. catch块里面的await

C# 6 之前catch和finally块中是不能用await 关键词的. 在 C# 6 中,我们终于可以再这两个地方使用await了.

try 
{     
 //Do something
}
catch (Exception)
{
 await Logger.Error("exception logging")
}

7. 异常过滤器

异常过滤器可以让你在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;
  }
}

8. 用于检查NULL值的条件访问操作符?.

看看这个实例,我们基于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";

 以上所述就是本文的全部内容了,希望大家能够喜欢。

[!--infotagslink--]

相关文章

  • C#实现简单的登录界面

    我们在使用C#做项目的时候,基本上都需要制作登录界面,那么今天我们就来一步步看看,如果简单的实现登录界面呢,本文给出2个例子,由简入难,希望大家能够喜欢。...2020-06-25
  • 浅谈C# 字段和属性

    这篇文章主要介绍了C# 字段和属性的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下...2020-11-03
  • C#中截取字符串的的基本方法详解

    这篇文章主要介绍了C#中截取字符串的的基本方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
  • C#实现简单的Http请求实例

    这篇文章主要介绍了C#实现简单的Http请求的方法,以实例形式较为详细的分析了C#实现Http请求的具体方法,需要的朋友可以参考下...2020-06-25
  • C#连接SQL数据库和查询数据功能的操作技巧

    本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
  • C#中new的几种用法详解

    本文主要介绍了C#中new的几种用法,具有很好的参考价值,下面跟着小编一起来看下吧...2020-06-25
  • 使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序)

    这篇文章主要介绍了使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#开发Windows窗体应用程序的简单操作步骤

    这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
  • C#从数据库读取图片并保存的两种方法

    这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
  • C#和JavaScript实现交互的方法

    最近做一个小项目不可避免的需要前端脚本与后台进行交互。由于是在asp.net中实现,故问题演化成asp.net中jiavascript与后台c#如何进行交互。...2020-06-25
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • 轻松学习C#的基础入门

    轻松学习C#的基础入门,了解C#最基本的知识点,C#是一种简洁的,类型安全的一种完全面向对象的开发语言,是Microsoft专门基于.NET Framework平台开发的而量身定做的高级程序设计语言,需要的朋友可以参考下...2020-06-25
  • C#变量命名规则小结

    本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-09
  • C#绘制曲线图的方法

    这篇文章主要介绍了C#绘制曲线图的方法,以完整实例形式较为详细的分析了C#进行曲线绘制的具体步骤与相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • c#自带缓存使用方法 c#移除清理缓存

    这篇文章主要介绍了c#自带缓存使用方法,包括获取数据缓存、设置数据缓存、移除指定数据缓存等方法,需要的朋友可以参考下...2020-06-25
  • c#中(&&,||)与(&,|)的区别详解

    这篇文章主要介绍了c#中(&&,||)与(&,|)的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • 经典实例讲解C#递归算法

    这篇文章主要用实例讲解C#递归算法的概念以及用法,文中代码非常详细,帮助大家更好的参考和学习,感兴趣的朋友可以了解下...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#中list用法实例

    这篇文章主要介绍了C#中list用法,结合实例形式分析了C#中list排序、运算、转换等常见操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25