C#3.0新特性旧题新说之一

一,自动属性(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 { getset; }
        
public string LastName { getset; }
        
public int Age { getset; }
    }
    对于这个类,现在可以如此初始化:
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日修改
    
    
作者:sban
出处:http://sban.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
posted @ 2007-12-06 03:43 sban 阅读(2486) 评论(13)  编辑 收藏 网摘 所属分类: Default

  回复  引用    
#1楼2007-12-06 08:40 | je[未注册用户]
与AS对比
除了最后一句提到了as,感觉没做对比
哈哈

  回复  引用  查看    
#2楼2007-12-06 08:52 | 阿不      
AS有什么不同之处?
  回复  引用  查看    
#3楼2007-12-06 09:02 | Enzo      
--引用--------------------------------------------------
阿不: AS有什么不同之处?
--------------------------------------------------------

  回复  引用  查看    
#4楼2007-12-06 09:06 | craboYang      
AS 也遵循 ECMAScript 标准, 当成Javascript看就可以了。
  回复  引用  查看    
#5楼2007-12-06 09:14 | henry      
总得来说这些都是编译器支持得到,这些东西编译完全可以在只有dot 2.0的系统中运行.
  回复  引用  查看    
#6楼2007-12-06 09:23 | 装配脑袋      
在AS中,var是定义变量的关键字。
……大家都已经把Pascal给遗忘了吗

  回复  引用  查看    
#7楼2007-12-06 09:36 | 阿不      
@装配脑袋
确实给忘了
记得我们刚上程序语言那会儿,我们班就我可以听懂。呵呵,老师可劲的表扬,那个骄傲啊。:)

  回复  引用    
#8楼2007-12-06 09:59 | 书生2007[未注册用户]
看来又要有一堆东西需要了解了.

VAR.好熟悉呵

  回复  引用  查看    
#9楼2007-12-06 10:15 | Klesh Wong      
我不明白的是,这样的Property和直接public的Field有何区别??
  回复  引用  查看    
#10楼[楼主]2007-12-06 10:26 | sban      
@Klesh Wong
如果对Field的存取没有任何限制,或者说其约束逻辑不由其自己保证,public的field我想就可以,这样效率也会提高,因Property其实是get与set函数。直接存取field,可免去函数调用的额外开销。

如果是只读的field,并且对读取没有约束,可以用readonly Field。

但如果是只写的,就要实现Property的set了。

出于扩展考虑,一般还是用Property,即使它的set与get没有任何约束代码。
在CodeSmith的模板中,很多便是这样处理的。

  回复  引用    
#11楼2007-12-06 12:53 | 过客1[未注册用户]
....
很多地方和python相似

  回复  引用  查看    
#12楼2007-12-06 14:42 | 根号贰      
微软的技术升级太快,也会给我们造成烦恼。
.net Framework1.1开发的程序用了不到一年,就到2.0了。还不能直接向后兼容。。
不知道3.0会不会在兼容性上面好一点。

  回复  引用    
#13楼2007-12-08 19:51 | Kerry Jiang[未注册用户]
这是3.5的新特性吧...

3.0是在2.0基础上增加了WCF,WWF,WPF




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 984564




相关文章:

相关链接: