隐含类型局部变量
var i = 5; var h = 13.4; var s = "C Sharp"; var intArr = new[] {1,2,3 }; var a = new[] {1,10,100,1000 }; //int[]
var为关键字,可以根据后面的初始化语句自动推断类型。
初始化语句必须为表达式,且编译时可推断类型。
var声明的仅限于局部变量,亦可用于foreach、using等语句中。
数组也可以作为隐含类型。
扩展方法
class Program { static void Main(string[] args) { //扩展方法 string s = "hello world"; s.Foo(); } } public static class Extensions { public static void Foo(this string s) { //***** Console.WriteLine("Foo"); Console.Read(); } }
分析:
s.Foo() 编译器会由实例方法转换为静态方法:Extendsion.Foo(s)。
实例方法被编译的分析:
有一个类:class Person{public void Bar();}
调用:Person p=new Person(); p.Bar();
编译器会把上面的方法转换为void Bar(Person this),然后调用:Bar(p)
这就是我们所说的实例函数里面有一个隐含的this指针。bar方法虽然没有参数,但是在编译的时候,编译器会把它编译出一个参数来,就是它所在的类型(它在person类里面),编译器编译出来的是一个全局函数,有一个this指针,所以在实例函数里可以访问this指针,但是在静态函数里不能访问静态指针。静态函数没有按照这个规则来编译。
其实在编译完之后,根本就不知道所谓的对象、实例函数、静态函数。所有的东西都是全局函数。
总结(扩展一个类的方法):
1、继承它。
2、用包含(组合)的方法,把一个类做为另一个类的字段。
3、反射,可以动态的给一个类添加更多的行为,运行时的方式。
4、扩展,只允许添加不允许更改。(允许我们在不改变源代码的情况下扩展【即添加】现有类型中的实例方法)
对象与集合初始化器
//对象与集合初始化器 public class Point { public int X { get; set; } public int Y { get; set; } }
使用:
var test = new Point { X = 0, Y = 1 };
//集合初始化器 List<int> num = new List<int> { 0,1,2,3,4,5,6};
对象与集合初始化器要点
对象初始化器实际上利用了编译器对对象中对外可见的字段和属性进行按序赋值。
集合初始化器会对初始化器中的元素进行按序调用ICollection<T>.Add(T)。
注意对象初始化器和集合初始化器中成员的可见性和调用顺序。
对象与集合初始化器同样是一编译时技术。
匿名类型
//匿名类型 var p1 = new {Name="LiuShuai",Age=23 }; var p2 = new { Name="Frank",Age=23}; p1 = p2; Console.WriteLine(p2.Name); Console.Read();大家看一下运行的结果:
可以使用new关键字调用匿名初始化器创建一个匿名类型的对象。
匿名类型直接继承自System.Object。
匿名类型的成员是编译器根据初始化器推断而来的一些读写属性。