zoukankan      html  css  js  c++  java
  • VS2015预览版中的C#6.0 新功能(二)

    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;}=100;
    
            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);
            //}
        }
  • 相关阅读:
    我国自主研发的先进辅助驾驶系统(ADAS)控制器产品实现量产配套
    国务院印发《新一代人工智能发展规划》
    如何删除svn标签
    【转载】DHCP流程
    1-1 如何进行自我规划?
    人要像鹰一样重生、蜕变、成长
    人的一生好像乘坐北京地铁一号线
    【转载】接触Matlab10年后的一个总结,随时使用Matlab要掌握的一些要点
    【转载】BAT 批处理脚本教程
    SNAT 和 DNAT
  • 原文地址:https://www.cnblogs.com/dereklovecc/p/4127454.html
Copyright © 2011-2022 走看看