一,自动属性(automatic properties)
顾名思义,即自动补全属性。
在VS08里敲入prop,按Tab键,VS自动生成如下:
借助C#3.0的自动属性,这时候我们只需修改类型int和MyProperty即可,例如:
public int ID { get; set; }
而对于一惯添加的私有变量private int _id;则无需再手工添加。VS编译器会自动帮我们补齐,查看编译之后的IL代码,发现编译器自动加了一个<ID>k__BackingField的int32变量,如果添加一个string Name的属性,编译器则添加<Name>k__BackingField的string变量。其中规律不言自明。
自动补齐的私有变量,其前缀用<>括起来,是为了避免编程命名重复。在C#中,变量名称是不充许用<开始的,所以这可以有效的避免程序自定义的变量名与自动补齐的变量名重复。至少后面为什么加k__BackingField,而不加别的,可能是微软团队的内部开发约定。
二,以{}初始化对象
class Person
{
public Person()
{
//
}
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
}
对于这个类,现在可以如此初始化:
Person p = new Person { FirstName = "sban" };
花括号内参数个数随意,没有也行。但是用这个方法初始化对象,必须保证类含有一个公开的空参构造器,如果把上文中的
public Person()改成private Person()编译是通不过的。以花括号初始化对象,实际上也是先new()一个对象,然后再逐个赋值,只不过这个繁锁的事情让编译器去做了。这一点可以从查看编译之后的IL看出来。
以{}新建对象,对于集合也是适用的:
List<Person> list = new List<Person> {
new Person{FirstName = "sban"},
new Person{LastName="Lee"}
};
在ActionScript3中,{}本来就是新建一个对象的方法,并且充许以空{}创建一个空对象。而在c#中是不行的,如果:
var o = { };
那么编译将报错。这说明,C#中的{}与AS中的{}是不同的,虽然两者很相似。在C#中,{}在某种程度上说,只代表调用对象的默认无参公有构造器。所以以下代码也是合法的:
var o = new object { };
它仅相当于:
var o = new object();
在AS中,充许用[]新建数组,对于新建数组对象,可以这样定义:
var arr:Array = [{ID:1,Name:"cnblogs"},
{ID:2,Name:"flex5"}
]
但是在C#中,不能用[]定义数组。此外,在C#中使用{},为什么前面还要加一个new ObjectName?如果可以这样使用,岂不更好:
List<Person> list = {
{FirstName = "sban"},
{LastName="Lee"}
};
这样,编译器靠前面的List<Person>获取对象的类型。对于外层的{},我想也可以用[]替掉,表示这是一个数组集合。而{}则仅表示是对象的声明。
优秀的语言,不应该让我多提供一丁点儿多余的信息。如果我提供的信息足够了,那么现在它就应该知道我想做什么了。
三,C#中的var关键字
在AS中,var是定义变量的关键字。c#3.0+中,引进了var关键字,定义变量时,可以不告诉编译器这是一个什么类型的变量,对于以前的:
string name = "sban"; 现在只需用
var name = "sban";
C#是一种强类型语言,编译器会根据等号后面的内容判断该变量的类型。其实,两者编译产生的代码是完全相同的。这一点可以通过分别查看两者的IL代码得出。
由于var要靠变量值来判断变量类型,所以var变量必须赋以有效值。
C#3.0是一种强类型语言,但是编程体验上却借鉴了弱类型语言(如AS)的语法,在编译阶段支持。
sban 2007年12月5日首发于
博客园sban 2007年12月6日修改
文章评论(0条评论)
登录后参与讨论