随笔 - 57  文章 - 0 评论 - 352 trackbacks - 10
<2008年1月>
303112345
6789101112
13141516171819
20212223242526
272829303112
3456789

与我联系

搜索

 

留言簿(4)

我管理的小组

随笔分类(48)

随笔档案(51)

积分与排名

  • 积分 - 74250
  • 排名 - 536

最新评论

阅读排行榜

评论排行榜

在c#3.0里允许我们这样定义变量
var age = 10;
var name = "james";
var time = DateTime.Now;
var books = new string[]{"aa","bb"};
但是也仅此而已,var只允许我们定义c#编译器通过上下文推断出类型的变量。
var x;                 // 错误,没有用来推断类型的初始化器
var y = { 1, 2, 3 };  // 错误,不允许使用集合初始化器
var z = null;        // 错误,不允许出现空类型
像这样也是不允许的
var a= 10;
a= "james";
来看看隐私类型的IL实现。
c#2.0
.method public hidebysig instance void  oldvar() cil managed
{
  // 代码大小       8 (0x8)
  .maxstack  1
  .locals init ([0] string name)
  IL_0000:  nop
  IL_0001:  ldstr      "james"
  IL_0006:  stloc.0
  IL_0007:  ret
} // end of method testvar::oldvar

c#3.0
.method public hidebysig instance void  newvar() cil managed
{
  // 代码大小       8 (0x8)
  .maxstack  1
  .locals init ([0] string name)
  IL_0000:  nop
  IL_0001:  ldstr      "james"
  IL_0006:  stloc.0
  IL_0007:  ret
} // end of method testvar::newvar
完全一样。


我猜想var的出现其实完全是为了配合匿名类型而出现的。

            var a = new { Name = "james" ,Age = 25};
            Console.WriteLine(a.Name);
            Console.WriteLine(a.Age);

在linq中应用也比较多

int[] numbers = 5413986720 };
var queryLowNums 
=
    from num 
in numbers
    
where num < 5
    select num;
foreach (var s in queryLowNums)
{
    Console.Write(s.ToString() 
+ " ");
}

也就是说对象是匿名类型,或者对象是难以预测的类型的时候。
像这样的代码var age = 10;还是少写为好,一是类型安全,再是也为代码阅读尽量少造成障碍。
posted on 2008-01-06 18:20 tianyamoon 阅读(1031) 评论(7)  编辑 收藏 所属分类: c#技术Visual Studio 2008

FeedBack:
#1楼  2008-01-06 18:47 Shinn      
.net 3.0我了解不多,但最反对的就是这个功能

我觉得代码不仅仅是写给编译器看懂就好,最重要还是人也能看懂。

哪天要是团队要增加一个人的话,光这些var就够他忙活了。

最重要的是往往过段时间后你自己还得看自己的代码,如果都这样我自己肯定也会出现上述新增成员的烦恼的
  回复  引用  查看    
#2楼 [楼主] 2008-01-06 19:07 tianyamoon      
所以我推荐大家不在非用不可的时候尽量少用。
  回复  引用  查看    
#3楼  2008-01-06 19:50 冬冬      
var在foreach中用着最爽。
  回复  引用  查看    
#4楼  2008-01-06 20:13 Allen Lee      
SQL查询可以看作一种“即兴”查询,你通常不会为了执行一条SQL语句特意定义一个表来容纳查询结果。LINQ查询也具有SQL查询的“即兴”性格,那么问题就来了,你如何安置查询结果?你会特意为了某次查询创建一个类或者数据结构吗?或者你会,但你所定义的类或者数据结构很有可能只用在一个地方,此时为了避免这种低效,就导致了匿名类型的产生。然而,匿名类型又导致了另一个问题,就是你的变量类型如何表达?为了解决这个问题,C# 3.0引入了var关键字来定义隐式变量。var只是语言层面的东西,编译器会在编译的时候通过类型推断把它换成真正的类型,这就是为什么你不能使用var obj = null;,因为编译器无法推断它的类型,你也不能用var来声明类的成员变量甚至属性,你只能把它用于方法或属性内部的局部变量的声明上。

其实C# 3.0的很多特性都是为LINQ做准备的,明白这点对理解C# 3.0的新特性是很有帮助的。

Hope that helps.
  回复  引用  查看    
#5楼  2008-01-07 22:50 BirdsHover      
个人不是很喜欢var,还是喜欢强类型
  回复  引用  查看    
#6楼  2008-01-10 14:56 zhoucloud [未注册用户]
我看这东西完全是为了LINQ而做的,
本人用过几种脚本语言,基本上都有这种东西,
但是C# 3.0的这个功能还是和其他的语言有区别的,
个人认为语言提供的功能好用就行,只要使用的时候小心点就OK了
  回复  引用    
#7楼  2008-03-11 14:09 pretty      
当程序员不知道将要定义个什么类型,就可以用VAR.
分析:
1) var a = new { Name = "james" ,Age = 25};
既有字符串,又有整型,这个编译器会编译什么样的?
有NEW关键字,那就是说这是引用类型.
这个变量的用法:
Console.WriteLine(a.Name); //james
Console.WriteLine(a.Age); //25
这种用法跟类属性的用法相似,那么在这里VAR变量a是类的实例,但是不知道它的类型,也就是匿名的实例.

2) var i=10;
这句话怎么解释?表示它为一个整型变量.
总结:VAR既可以为引用类型的对象,也可以为值类型的变量,

只是为了解决匿名类型的变量吗?没有其他想法吗?
如果定义成VAR,那么编译器就会多做一件事情,微软把这些都封装了,什么都做好了,这样做,对程序员是好是坏?承认一点:Visual Studio工具越来越强大了;
  回复  引用  查看    

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-01-06 19:43 编辑过


相关链接: