【整理】.Net Framework3.5之隐式类型的本地变量和数组、对象初始值设定项、集合初始值设定项、自动实现的属性和匿名类型

隐式类型的本地变量和数组
---------------------------------------------------------------------------------------------------   
    隐式类型的本地变量

var i = 5;
var str 
= "Hello World!";
var arr 
= new[] { 012 };
var aron 
= new { Name = "Terry", Age = 34 };
var list 
= new List<int>();

    在上面的代码中关键字var是推断"类型",而不是具体的如int、string等这些显示类型;var关键字指示编译器根据初始化右侧的表达式来推断变量类型,此工作在编译时完成;推断类型可以是任何内置类型、匿名类型、用户定义类型、.Net Framework类库中定义的类型或任何表达式。
    我们将鼠标附到上面任何一个var处,即可查看处推断后的类型,截图如下

---------------------------------------------------------------------------------------------------
    隐式类型的数组

var a = new[] { 012 };

var b 
= new[] { "Hello"null"World" };

var c 
= new[] { 
                
new[]{1,2,3,4},
                
new[]{5,6,7,8}
            };

var d 
= new[] { 
                
new[]{"a","b","c","d"},
                
new[]{"a","b","c"}
            };

    注意:只支持隐式类型的交错数组,不支持隐式类型的多为数组;交错数组指的是数组的元素仍是数组。
---------------------------------------------------------------------------------------------------
    var关键字只在下面几种情形下使用:
    1.局部变量:var i=0;
    2.在for初始化语句:for(var i=0;i<10;i++){...};
    3.在foreach的初始化语句:foreach(var item in list){...};
    4.在using语句当中:using(var file=new StreamReader("c:\\text.txt")){...};

对象初始值设定项
    使用对象初始值设定项可以在创建对象时向对象的任何可访问的属性或字段分配值,而无需显式调用构造函数。

using System;
using System.Collections.Generic;
using System.Text;

namespace DotNetFrameworkDemo
{
    
class Program
    { 
        
private class Cat
        {
            
public int Age { getset; }
            
public string Name { getset; }
        }
        
static void Main(string[] args)
        {
            
//对象初始值设定项
            Cat cat = new Cat { Age = 16, Name = "波斯" };
        }
    }
}

等价于下面的代码:

using System;
using System.Collections.Generic;
using System.Text;

namespace DotNetFrameworkDemo
{
    
class Program
    { 
        
private class Cat
        {
            
public int Age { getset; }
            
public string Name { getset; }
        }
        
static void Main(string[] args)
        {
            Cat cat 
= new Cat();
            cat.Age 
= 16;
            cat.Name 
= "波斯";
        }

       
    }
}
    将对象初始值设定项用于匿名类型
using System;
using System.Collections.Generic;
using System.Text;

namespace DotNetFrameworkDemo
{
    
class Program
    { 
        
static void Main(string[] args)
        {
            
//对象初始值设定项用于匿名类型
            var v = new { Amount = 18, Message = "Hello" };
        }
    }
}
    可以用"="将匿名类型的属性改名,如下
    select new {p.ProductName,price=p.UnitPrice};

集合初始值设定项
    1.使用集合初始值设定项可以在一个实现了IEnumerable的集合类时指定一个或多个元素初始值设定项
    2.元素初始值项可以是简单的值,也可以是表达式或对象初始值设定项
    3.通过使用集合初始值设定项,无需在代码中使用Add方法的调用;编译器会添加这些调用
//用简单的值或表达式作为元素初始值项
using System;
using System.Collections.Generic;
using System.Text;

namespace DotNetFrameworkDemo
{
    
class Program
    { 
        
static void Main(string[] args)
        {
            List
<int> digits = new List<int> { 0,1,2,3,4,5,6,7,8,9};
            List
<int> digits2 = new List<int> { 0 + 112 % 3, MarkeInt() };
        }

        
static int MarkeInt()
        {
            
return 4;
        }
    }
}
//将对象初始值设定项作为集合初始值设定项的元素
using System;
using System.Collections.Generic;
using System.Text;

namespace DotNetFrameworkDemo
{
    
class Program
    { 
        
private class Cat
        {
            
public int Age { getset; }
            
public string Name { getset; }
        }
        
static void Main(string[] args)
        {
            List
<Cat> list = new List<Cat> { 
                
new Cat{Age=16,Name="波斯"},
                
new Cat{Age=18,Name="波斯"},
                
new Cat{Age=20,Name="波斯"}
            };
        }       
    }
}
    如果集合的Add方法允许,可以将null作为集合初始值设定项的一个元素,如下
using System;
using System.Collections.Generic;
using System.Text;

namespace DotNetFrameworkDemo
{
    
class Program
    { 
        
private class Cat
        {
            
public int Age { getset; }
            
public string Name { getset; }
        }
        
static void Main(string[] args)
        {
            List
<Cat> list = new List<Cat> { 
                
new Cat{Age=16,Name="波斯"},
                
new Cat{Age=18,Name="波斯"},
                
new Cat{Age=20,Name="波斯"},
                
null
            };
        }       
    }
}
自动实现的属性
    当属性访问器不需要其他逻辑,只是基本的赋值与取值时,自动实现的属性可是属性加倍的简洁。
private class Cat
{
      
public int Age { getset; }
      
public string Name { getset; }
}
自动实现的属性必须同时有get和set访问器。若要创建readonly自动实现属性,请给它付private set访问器。
private class Cat
{
     
public int Age { getset; }
     
public string Name { getprivate set; }
}
自动实现属性不允许有Attribute,若必须使用,则只能使用常规的属性。

匿名类型
    -匿名类型提供了一种方便的方法,可用来将一组只读属性封装到单个对象中去,而无需首先显式定义一个类型。
    -类型名由编译器生成,并且不能在源代码级使用
    -这些属性的类型由编译器推断
using System;
using System.Collections.Generic;
using System.Text;

namespace DotNetFrameworkDemo
{
    
class Program
    { 
        
static void Main(string[] args)
        {
            var v 
= new { Amount = 18, Message = "Hello" };
            Console.WriteLine(v.Amount);
            Console.WriteLine(v.Message);
            Console.ReadLine();
        }       
    }
}
    -匿名类型通常用在查询表达式的select子句中,以便返回源序列中每个对象的属性子集
    -匿名类型是由使用new运算符和对象初始值设定项来实现的
    -匿名类型是由一个或多个公共只读属性组成的类类型。不允许包含其他种类的类成员,如事件和方法
    -匿名类型是直接从对象派生的引用类型。尽管应用程序无法访问匿名类型,但编译器仍会为其提供一个名称
    -如果两个或多个匿名类型以相同的顺序、具有相同数量和种类的属性,则编译器会将这些匿名类型视为相同的匿名类型,并且他们共享编译器生成的相同类型信息。
    -匿名类型具有方法范围
    -匿名类型不能像属性一样包含不安全类型
    -由于匿名类型上的Equals和GetHashCode方法是根据属性的Equals和GetHashCode方法定义的,因此仅当同一匿名类型的两个实例的所有属性都相等时,这两个实例才相等。
posted @ 2009-07-09 17:04  网络渔夫  阅读(371)  评论(0编辑  收藏  举报