匿名属性 anonymous property

利用匿名属性可以用很简洁的语法来自动声明不可变(immutable)的元组(tuple)类型。

属性:在字段用来表示类型和对象的状态的前提下,希望状态不被随意的更改,字段一般应该设置为private,这也符合面向对象编程的数据封装,而可以通过方法来更改字段的值,这时候属性的出现简化了这些语法。

var o=new {property1 = expression1, ....,propertyN = expressionN}

编译器会推断每个表达式的类型,创建推断类型的私有字段,为每个字段创建公共只读属性,并创建一个构造器来接受这些表达式。在构造器中根据表达式结果来初始化私有只读字段。

除此之外,还会重写Objects的Equals,GethashCode和ToString方法。属性只读防止HashCode被改,而匿名实例能放在哈希表集合中,就防止了哈希码被改后找不到key。

var people = new[]
{
    new {Name = "James", Age=29}
    new {Name = "Obama", Age=45}
}

匿名类型经常被用与LINQ(Language Intergrated Query)配合使用。

string myDocs=Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
var query=
    from pathname in Directory.GetFiles(myDocs)
    let LastWriteTime = File.GetLastWriteTime(pathname)
    where LastWriteTime  > (DateTime.Now - TimeSpan.FromDays(5))
    orderby LastWriteTime 
    select new {Path = pathname, LastWriteTime }

Path = pathname也不是必要的,即之后的属性名就为pathname,这个前面只是定义属性名,倘若不定义就为原名。

 

System.Tuple:

public class Tuple<T1,T2,T3,T4,T5,T6,T7,TRest>

var t=Tuple.Create(0,1,2,3,4,5,6,Tuple.Create(7,8))

 

System.Dynamic.ExpandoObject

dynamic e = new System.Dynamic.ExpandoObject();
e.x = 6;
e.y = "Henry";
e.z = null;

foreach (var v in (IDictionary<string,Object>)e)
{
    Console.WriteLine(v.Key+v.Value);
}

 

posted @ 2016-07-01 12:00  AshLeakey  阅读(683)  评论(0编辑  收藏  举报