C#种类小说之性质

属性,允许源代码用简化语法来调用方法。CL奇骏援助二种属性:无参属性和有参属性(索引器)。

壹.1无参属性特征

 
 由于某个不适合使用字段会破坏对象的状态,所以1般会将兼具字段都设为private。要允许用户或项目获取或安装情状音信,须求提供包装了字段访问的法子(访问器)。

public class Employee
{
   private string name;
   public string GetName(){return name;}
   public string SetName(string value){name = value;}
}      

地点实行数据封装不得不达成额外的章程,类型用户必须调用方法,不可能一贯引用字段名。为此CL科雷傲提供一个名叫属性的编写制定。

 

public class Employee
{
    private string name;
    public string Name
    {
       get{return name;}
       set{name=value;}                          
    }
}

 每一种属性都知名称和档次(类型不能够是void)。属性无法重载。

 C#编写翻译器发现赢得或安装属性时,实际会转移如下代码,在属性名此前自动叠加get_,set_前缀。

public class Employe
{
    private string name;
    public string get_Name()
    {
        return n_Name;
    }
    pubic void set_Name()
    {
       n_Name=value;
    }
}

本着源代码中定义的种种属性,编写翻译器会在托管程序集的元数据中生成贰个属性定义项,包罗部分标志以及质量类型。同时还引用了get和set访问器方法。那几个干活儿将质量那种抽象概念与它的访问器方法之间确立起1个联络。

一.二 自动完结属性

   
 若是仅为了封装三个扶助字段而成立属性,C#提供了名叫自动属性的简练语法。public
string Name{get;set;}C#会在里边自行声喜宝个私家字段。

   
 优点:访问该属性的其它代码实际都会调用get和set方法。要是未来决定本身完毕get和set方法,则做客属性的此外轮代理公司码都无须再一次编写翻译。可是将Name证明为字段,现在想改为属性,那么访问字段的具备代码都必须再一次编写翻译才能访问属性方法。

   
 缺点:AIP的支撑字段名称由编写翻译器决定,每一趟重复编写翻译都大概改变名称。由此任何项目涵盖八个AIP,就不能够对该类型的实例进行反序列化。而运作时系列化引擎会将字段名持久存款和储蓄到体系化流中。任何想要系列化或反系列化的档次中都决不选取AIP功用。此外利用AIP不能够加断点,手动达成的品质则是能够,方便调试。使用AIP属性必然是可读可写的,只写字段不可能读取值有怎么着用?只读肯定是有暗中同意值,所以AIP成效于1体属性的,不能够显式完结贰个访问器方法,而让另二个电动完结。

壹.三 属性使用时需注意的点:

  • 借使定义属性,最佳还要为它提供get,set访问器方法
  • 品质方法只怕抛出12分;字段访问永远不会
  • 品质或不可能看做out和ref参数字传送给方法;字段可以
  • 质量方法大概花较长期执行,大概须求分外内部存款和储蓄器
  • 性情只是简化了语法,不会升级代码的品质,最佳规矩达成GetXXX和SetXXX方法。

一.四 对象和聚合开头化器

  C#支撑壹种奇特的靶子早先化语法 Employee e = new
Employee(){Name=”abc”,Age =
45}。那句话将组织二个指标,调用它的无参构造函数,将国有Name属性设为”abc”等,等同于e.Name
= “abc”;e.Age =
四伍;三种办法转变的IL代码相同。同时C#还允许组合四个函数,比如

Employee e = new Employee(){Name=”abc”,Age = 45}.ToString().ToUpper();

 
 假使属性类型完成了IEnumerable或IEnumerable<T>接口,属性就被认为是集结,而集合的开首化是1种相加操作。如下:

public class ClassRoom
{
  private List<string> students = new List<string>();
  public List<string> Students{get{return students;}}

//初始化,实际上是调用集合自带的Add方法,将数据添加到集合中
 ClassRoom classRoom = new ClassRoom{Students = {"sd","sdf","fgd"};}

}
//对于字典类型初始化
var table = new Dictionary<string,int>{  {"abc",1},  {"def",2}  }

一.5 匿名类型

 
匿名类型的机能能够自行注明不可变的元组类型。元组类型涵盖一组属性的花色。var
o一 = new {Name=”abc”,Year = 1玖八陆}

 
编写翻译器会推断每一种表明式的门类,创造估算类型的村办字段,为种种字段创设公共只读属性,并创建三个构造器来经受全体表达式,在里面会用传给他的表达式求值结果来开头化私有字段。还会重写Object的Equals,GetHashCode和ToString方法,生成全数那个办法的代码。

 
即便在源代码中定义了多个匿名类型,而且这几个类别具有相同的协会(每种属性都有同一的花色和称号,而且这一个属性的钦点顺序相同),那么它只会创制一个匿名类型定义,并创造该项目八个实例。

 
壹般匿名类型常常和LINQ协作使用。方法原型无法接受匿名类型参数,因为不知底是哪些项目,也不可能回来对匿名类型的引用,想要传递元组,能够动用System.Tuple类型。

string myDocuments = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

var query = from pathname in Directory.GetFiles(myDocuments)
            let LastWriteTime = File.GetLastWriteTime(pathname)
            where LastWriteTime>(DateTime.Now - TimeSpan.FromDays(7))
            orderby LastWriteTime
            select new {Path = pathname,LastWriteTime};

 一.陆 有参属性

C#利用数组风格的语法公开有参属性(索引器),可将索引器是C#开发人士对[]操作符的重载。比如定义三个类Student

public class Student
    {
        public string this[int n]
        {
           get { return Name; }
            set { Name = n > 0 ? "大于0" : "小于0"; }
        }
       private string Name;
     }

当执行Student stu = new Student();stu[4] =
“NNN”;时实施set方法,将Name设为大于0;执行stu[4]时输出超越0字样。

一.7 调用属性访问器方法时的习性

     
对于简易的get和set访问器方法,JIT编写翻译器会将代码内联(将艺术相当于访问器方法的代码直接编写翻译到调用它的点子中),幸免在运营时发生调用所产生的支出,代价是编写翻译好的秘籍变得更加大。注意:JIT在调节和测试代码时不会内联属性方法,因为那将难以调节和测试,发行版本会动用内联,质量会快。

1.8
既然属性本质上是措施,而C#和CLOdyssey帮衬泛型方法,可是C#不允许属性引进自己的泛型类型参数,最关键原因属性本来应该代表可供查询或设置某些对象特征。1旦引进泛型类型参数就象征恐怕变动查询/设置行为,但质量不应有和行事沾边,公开对象的表现无论是或不是泛型,都应该定义方法而非属性。

  

 

相关文章