VS2015预览版中的C#6.0 新功能(一)

VS2015预览版中的C#6.0 新功能(三)

自动属性的增强

  • 只读自动属性

以前自动属性必须同时提供setter和getter方法,因而只读属性只能通过先声明field,然后property只提供getter方法来实现,无法通过自动属性来实现。在c#6.0中,可以通过如下的形式声明只读的自动属性:

public string FirstName { get; }

对于只读的自动属性,其backing field是readonly的,其值可以在属性初始化器(下面会详细讲解属性初始化器)或者类的构造函数中给予。在下面的例子中FirstName和LastName属性是通过自动属性初始化器赋值的,而TimeOfStartingWrite是通过构造函数赋值的。

public class Author
{
public DateTime TimeOfStartingWrite { get; } public string FirstName { get; } = "Dery"; public string LastName { get; } = "Xu"; public Author(DateTime timeOfStartingWrite)
{
TimeOfStartingWrite = timeOfStartingWrite;
}
}

由于只读属性没有setter方法,它的值是通过直接赋给其backing field的。

  • 自动属性初始化器

在上面的例子中可以看到对于自动属性,我们可以使用属性初始化器来为其赋值。例子如下:

 public class Book
{
public int Number { get;}=; public string Abstract { get; set; }="this is abstract"; public string Name { get; set; } public float Price { get; set; } public Author PrimaryAuthor { get; set; } public List<Author> Authors { get; set; }
}

其中Number是一个只读自动属性,我们通过属性初始化器为其赋值100,而Abstract是一个可读写的自动属性,我们通过属性初始化器为其赋值为字符串"this is abstract"。自动属性初始化器直接赋值给后台生成的field,不会走自动属性的setter方法。它和field初始化器一样具有如下的一些特点:

  1. 按照书写顺序执行,所以在上例中,先执行Number属性的初始化,再执行Abstract属性的初始化
  2. 不能使用this,因为它是在对象完全初始化之前运行的

自动属性初始化器中可用来赋给属性的值似乎很有限,而下面的主构造函数可以帮助它获得跟多可能的值。

主构造函数

主构造函数功能把构造函数的声明合并到了类的声明中。让我们可以编写如下所示的代码:

[Serializable]
public class Patent(string title, string yearOfPublication)
{
public Patent(string title, string yearOfPublication,
IEnumerable<string> inventors)
:this(title, yearOfPublication)
{
Inventors.AddRange(inventors);
}
private string _Title = title;
public string Title
{
get
{
return _Title;
}
set
{
if (value == null)
{
throw new ArgumentNullException("Title");
}
_Title = value;
}
}
}

然而,这次的release中还不支持该功能,会在以后的更新中进一步说明。

表达式体函数和属性

对于Lambda表达式,我们知道可以通过表达式体或者在语句块中的普通函数来声明,现在这个功能也可以应用到类的函数成员上。

  • 函数成员
 public int Add(int op1, int op2) => op1 + op2;

 public void Print(string message) => Console.WriteLine("Hello " + message);

使用表达式体函数的效果和只有单一return语句的函数体一样,所以上面的例子和下面的code是一样的

public int Add(int op1, int op2)
{
return op1 + op2;
} public void Print(string message)
{
Console.WriteLine("Hello " + message);
}

请注意Add方法是有返回值的,而Print是没有返回值的,对于没有返回值的函数,Lambda表达式体必须是语句Lambda即new, call, decrement,increment,赋值等表达完整语句的操作而非表达式,这个要求和lambda是一样的。

  • 属性和索引器

属性和索引器有getter和setter方法,表达式体可以用来写只读的属性和索引器,表达式体就是对应getter方法的方法体,例子如下:

public Author this[int id] => store[id];
public string FullName => firstName + lastName;

注意这里不需要给出get关键字,编译器会做隐式推断。

完整例子如下

    internal class ExpressionBody
{
private string firstName = "first name";
private string lastName = "lastName"; private List<Author> store = new List<Author> { new Author(DateTime.Now), new Author(DateTime.Now) }; public int Add(int op1, int op2) => op1 + op2; public void Print(string message) => Console.WriteLine("Hello " + message); public Author this[int id] => store[id]; public string FullName => firstName + lastName; //public int Add(int op1, int op2)
//{
// return op1 + op2;
//} //public void Print(string message)
//{
// Console.WriteLine("Hello " + message);
//}
}

VS2015预览版中的C#6.0 新功能(二)的更多相关文章

  1. VS2015预览版中的C#6.0 新功能(三)

    VS2015预览版中的C#6.0 新功能(一) VS2015预览版中的C#6.0 新功能(二) Using static 使用using StaticClass,你可以访问StaticClass类里的 ...

  2. VS2015预览版中的C#6.0 新功能(一)

    VS2015预览版中的C#6.0 新功能(二) VS2015预览版中的C#6.0 新功能(三) VS2015的预览版在11月12日发布了,下面让我们来看看C#都提供了哪些新的功能. 字符串添写(Str ...

  3. VS2015预览版体验

    .NET开源了,JAVA颤抖吧... 据说VS2015可以开发android,ios,wp应用程序了,还可以开发能运行在mac,linux上的ASP.NET网站,如果真是这样就太爽啦,上微软官网下载了 ...

  4. Windows 10 开发人员预览版中的新增功能(转自 IT之家)

    Windows 10 开发人员预览版中的新增功能 在Win10预览版中安装工具与SDK后,即可着手创建Windows通用应用或先浏览目前的环境与此前相比都发生了什么变化. 应用建模 文件资源管理器: ...

  5. 关于在Visual Studio 2019预览版中的用户体验和界面的变化

    原文地址:https://blogs.msdn.microsoft.com/visualstudio/2018/11/12/a-preview-of-ux-and-ui-changes-in-visu ...

  6. 根据 Power BI Desktop(预览版)中的报表页创建工具提示

    根据 Power BI Desktop 中创建的报表页,可创建直观丰富的报表工具提示,这些提示在你将鼠标悬停在视觉对象上时显示. 通过创建用作工具提示的报表页,使自定义工具提示包含视觉对象.图像以及在 ...

  7. 挑战中英实时语音翻译——Skype Translator 中文预览版登陆中国

    Translator 中文预览版登陆中国" title="挑战中英实时语音翻译--Skype Translator 中文预览版登陆中国"> 今天,我们正式宣布在中国 ...

  8. 【译】.NET 7 预览版 1 中的 ASP.NET Core 更新

    原文 | Daniel Roth 翻译 | 郑子铭 .NET 7 预览版 1 现已推出!这是 .NET 下一个主要版本的第一个预览版,其中将包括使用 ASP.NET Core 进行 Web 开发的下一 ...

  9. .NET 7 预览版2 中的 ASP.NET Core 更新

    .NET 7 预览版2 现已推出,其中包括对ASP.NET Core 的许多重大改进. 以下是此预览版中新增内容的摘要: 推断来自服务的API 控制器操作参数 SignalR 集线器方法的依赖注入 为 ...

随机推荐

  1. 空值排序(oracle和sqlserver)

    oracle认为 null 最大. 升序排列,默认情况下,null值排后面. 降序排序,默认情况下,null值排前面. 改变空值办法: (1)用nvl函数或decode函数将null转换为一特定值 替 ...

  2. UI基础视图----UILabel总结

    UILabel是UIKit框架中非常常用的视图类,是UIView的子类,是UIWindow,UIImageView等的兄弟类,因为继承自UIView,所以继承了UIView中的属性和方法,大部分都可以 ...

  3. winPcap_1_开篇

    什么是WinPcap WinPcap是一个基于Win32平台的,用于捕获网络数据包并进行分析的开源库. 因为有些应用程序需要直接访问网络中的数据包.也就是说,那些应用程序需要访问原始数据包,即没有被操 ...

  4. java基础知识再学习--maven

    maven 下载安装: Eclipse中创建maven项目: 查询jar包的坐标:search.maven.org 添加完一个jar包的依赖以后,这个jar包所依赖的其他jar包也被导入到项目的bui ...

  5. Nutch的日志系统

    一.Nutch日志实现方式 1.Nutch使用slf4j作为日志接口,使用log4j作为具体实现.关于二者的基础,请参考 http://blog.csdn.net/jediael_lu/article ...

  6. 数据画图 jpgraph & chart.js

    今天想到要研究下“用图表的形式来呈现数据”这个主题.对比了下两种实现的方法: 方法一:通过php代码在服务器端生成图像,再将图像传回客户端.使用jpGraph类库. 方法二:通过js和html5技术, ...

  7. 锋利jQuery 学习整理之 第六章 jQuery 与Ajax 的应用

    1.Ajax 的XMLHttpRequest 对象 XMLHttpRequest 是Ajax 的核心,它是Ajax 实现的关键---发送异步请求.接受响应及执行回调都是通过它来完成的.XMLHttpR ...

  8. 【面试】Spring问答Top 25

    本文由 ImportNew - 一直在路上 翻译自 howtodoinjava.欢迎加入翻译小组.转载请见文末要求. 本人收集了一些在大家在面试时被经常问及的关于Spring的主要问题,这些问题有可能 ...

  9. 实现Web虚拟现实的最轻松方案—A-Frame框架

    问题 随着vr的热度那么web虚拟现实是否可行 1. 实现Web虚拟现实的最轻松方案 A-Frame A-Frame是一款开源的可通过定制HTML元素构建WebVR方案的框架.有了这个框架,Web程序 ...

  10. ViewDragHelper的使用

    一.ViewDragHelper的原理 是一个能够自用移动ViewGroup内部View的控件. 通过获取ViewGroup的点击事件,之后通过Scroller滑动来进行对ViewGroup内部控件的 ...