【整理】.Net Framework3.5之隐式类型的本地变量和数组、对象初始值设定项、集合初始值设定项、自动实现的属性和匿名类型
隐式类型的本地变量和数组
---------------------------------------------------------------------------------------------------
隐式类型的本地变量
var str = "Hello World!";
var arr = new[] { 0, 1, 2 };
var aron = new { Name = "Terry", Age = 34 };
var list = new List<int>();
在上面的代码中关键字var是推断"类型",而不是具体的如int、string等这些显示类型;var关键字指示编译器根据初始化右侧的表达式来推断变量类型,此工作在编译时完成;推断类型可以是任何内置类型、匿名类型、用户定义类型、.Net Framework类库中定义的类型或任何表达式。
我们将鼠标附到上面任何一个var处,即可查看处推断后的类型,截图如下
---------------------------------------------------------------------------------------------------
隐式类型的数组
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.Collections.Generic;
using System.Text;
namespace DotNetFrameworkDemo
{
class Program
{
private class Cat
{
public int Age { get; set; }
public string Name { get; set; }
}
static void Main(string[] args)
{
//对象初始值设定项
Cat cat = new Cat { Age = 16, Name = "波斯" };
}
}
}
等价于下面的代码:
using System.Collections.Generic;
using System.Text;
namespace DotNetFrameworkDemo
{
class Program
{
private class Cat
{
public int Age { get; set; }
public string Name { get; set; }
}
static void Main(string[] args)
{
Cat cat = new Cat();
cat.Age = 16;
cat.Name = "波斯";
}
}
}
using System.Collections.Generic;
using System.Text;
namespace DotNetFrameworkDemo
{
class Program
{
static void Main(string[] args)
{
//对象初始值设定项用于匿名类型
var v = new { Amount = 18, Message = "Hello" };
}
}
}
集合初始值设定项
1.使用集合初始值设定项可以在一个实现了IEnumerable的集合类时指定一个或多个元素初始值设定项
2.元素初始值项可以是简单的值,也可以是表达式或对象初始值设定项
3.通过使用集合初始值设定项,无需在代码中使用Add方法的调用;编译器会添加这些调用
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 + 1, 12 % 3, MarkeInt() };
}
static int MarkeInt()
{
return 4;
}
}
}
using System.Collections.Generic;
using System.Text;
namespace DotNetFrameworkDemo
{
class Program
{
private class Cat
{
public int Age { get; set; }
public string Name { get; set; }
}
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="波斯"}
};
}
}
}
using System.Collections.Generic;
using System.Text;
namespace DotNetFrameworkDemo
{
class Program
{
private class Cat
{
public int Age { get; set; }
public string Name { get; set; }
}
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
};
}
}
}
当属性访问器不需要其他逻辑,只是基本的赋值与取值时,自动实现的属性可是属性加倍的简洁。
{
public int Age { get; set; }
public string Name { get; set; }
}
{
public int Age { get; set; }
public string Name { get; private set; }
}
匿名类型
-匿名类型提供了一种方便的方法,可用来将一组只读属性封装到单个对象中去,而无需首先显式定义一个类型。
-类型名由编译器生成,并且不能在源代码级使用
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();
}
}
}
-匿名类型是由使用new运算符和对象初始值设定项来实现的
-匿名类型是由一个或多个公共只读属性组成的类类型。不允许包含其他种类的类成员,如事件和方法
-匿名类型不能像属性一样包含不安全类型
-由于匿名类型上的Equals和GetHashCode方法是根据属性的Equals和GetHashCode方法定义的,因此仅当同一匿名类型的两个实例的所有属性都相等时,这两个实例才相等。