1.隐含类型局部变量
var i = 5;
var h=23.56;
var s = “C Sharp";
var intArr = new[] {1,2,3,4} ;
var a = new[] { 1, 10, 100, 1000 };// int[]
•var为关键字,可以根据后面的初始化语句自动推断类型。
•初始化语句必须为表达式,且编译时可以推断类型。
•var声明的仅限于局部变量,亦可以用于foreach, using等语句中。
•数组也可以作为隐含类型。
2.扩展方法
using System;
public static class Test
{
static void Main()
{
string s="Hello,World";
s.Foo(); //=Test.Foo(s).Foo();
}
public static void Foo(this string s) //扩展方法;静态类中只能有静态方法;
{
Console.WriteLine(s);
}
}
扩展方法允许我们在不改变源代码的情况下扩展(即添加)现有类型中的实例方法。
扩展方法要点
•扩展方法的本质为将实例方法调用在编译期改变为静态类中的静态方法调用。
•注意扩展方法的优先级:现有实例方法优先级最高,其次为最近的namespace下的静态类的静态方法,最后为较远的namespace下的静态类的静态方法。
•扩展方法是一种编译时技术,注意与反射等运行时技术进行区别,并慎重使用。
3.对象与集合初始化器
public class Point
{
int x, y;
public int X { get { return x; } set { x = value; } }
public int Y { get { return y; } set { y = value; } }
}
var a = new Point { X = 0, Y = 1 };
相当于:var a = new Point(); a.X = 0; a.Y = 1;
集合初始化器:
List num= new List { 0, 1, 2, 6, 7, 8, 9 };
对象与集合初始化器要点
•对象初始化器实际上利用了编译器对对象中对外可见的字段和属性进行按序赋值。
•集合初始化器会对初始化器中的元素进行按序调用ICollection.Add(T)。
•注意对象初始化器和集合初始化器中成员的可见性和调用顺序。
•对象与集合初始化器同样是一种编译时技术。
4.匿名类型
using System;
public class Test
{
static void Main()
{
//匿名类型;
var p1 = new { Name = "Lawnmower", Price = 495.00 };
var p2 = new { Name = "Shovel", Price = 26.95 };
Console.WriteLine(p2.Name);
}
}
•可以使用new关键字调用匿名初始化器创建一个匿名类型的对象。
•匿名类型直接继承自System.Object。
•匿名类型的成员是编译器根据初始化器推断而来的一些读写属性。