C# 3.0 之 var 声明语法

var 声明语法也即是匿名类型声明,

一如 JavaScript 中的 var 语法,其在编写代码时也是不需要确定其类型的,

但是,需要注意的是,在 C# 3.0 中的 var 和 JavaScript 中的 var 是不同的,

JavaScript 属于弱类型语言,无所谓类型,而 C# 是强类型语言,

各种类型之间严密区分,

对于 JavaScript ,其数据的类型要等到在 RunTime 也就是执行时才能确定,

也就是各个数据的类型只有在你执行该部分代码或者需要使用这个数据时,

这个数据的类型才会被确定,

而对于 C# 则不是这样的,C# 是在编译时确定数据的类型的,

所以,如果使用 var 语法来声明一个数组,而这个数组中既有 int ,又有 string,

那么会编译不通过而直接报错,这是因为在进行编译时,

C# 便会确定这个数组的类型,而这个数组中既有 int 又有 string ,

所以无法在编译时使用基本数据类型来确定这个 var 声明的数组的类型,所以会报错,

所以,说到底, var 类型的还是一个强类型的语法,

只不过是在编写代码时是不确定的类型而已。

至于 Microsoft 为何要发明这个 var 声明语法,

事实上是为了在 Linq 中使用,

其结合 Linq 可以发挥出更大的潜力。

虽然使用 var 声明语法非常方便,

但是事实上,在使用时还是会有诸多的限制的,

最主要的有如下几条:

不能再 Class/Struct/Interface 层面上使用,

不能声明全局变量,

不能作为方法的返回值类型,

不能作为方法的参数的类型,

而使用的场合也是比较广的,

可以使用在 foreach 中,

可以使用在 for 中,

可以使用在 using 语句中,

可以使用在 Linq 技术中,

对于 var 的基本的语法,就看下面的一个实例吧

using System;
using System.Linq;

namespace CSharpLanguage
{
    public partial class Demo__1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            MethodOne();
            MethodTwo();
        }
        //var 声明语法的使用
        public void MethodOne()
        {
            //使用 var 声明语法声明一个隐式类型数组,并且数据为 double 类型
            //在这里定义时,数组中的内容必须均是同一种数据类型,
            //不能同时定义多种数据类型在同一个 var 声明的数组中
            //比如不能定义 {12,"BaoBeiMe",13,434} 之类的数组
            //如果这样定义的话,这个数组在进行编译时便无法确定其这个数组的类型了
            //从而会在编译时便失败

            var myNumArray = new[] { 12, 23, 43.5, 49.3, 32, 4, 0.76 };
            Response.Write("<br/><br/>使用 myNumArray[i] 方式遍历:<br/>");
            for (int i = 0; i < myNumArray.Length; i++)
            {
                Response.Write(myNumArray[i] + "----");
            }
            Response.Write("<br/><br/>使用 myNumArray.ElementAt(i) 方式遍历:<br/>");
            for (int i = 0; i < myNumArray.Length; i++)
            {
                Response.Write(myNumArray.ElementAt(i) + "----");
            }
            Response.Write("<br/><br/>使用 foreach 方式遍历:<br/>");
            foreach (var value in myNumArray)
            {
                Response.Write(value + "----");
            }
            Response.Write("<br/><br/>使用 Linq to Object 方式遍历:<br/>");
            //这里则是使用了 Linq to Object 方式来查询数组中的内容了
            var result = from p in myNumArray
                         select p;

            foreach (var p in result)
            {
                Response.Write(p + "----");
            }
            //在这里通过反射操作获取这个使用 var 语法声明的数组的类型,
            //这样便可以观察出,实质上,这个 var 数组还是一个基本类型的数组
            //只不过类型是在编译时才确定

            Response.Write("<br/><br/>myNumArray 在进行编译时会转化为强类型:" +
                            myNumArray.GetType());
        }

        public void MethodTwo()
        {
            //这个匿名类型 person 中的所有数据都是只读的
            //您不能在后续的代码中的任何数据内容进行写操作
            //比如不能进行 person.Name="BaoBeiMe";

            var person = new
            {
                Name = "XiaoZhen",
                Sex = "男",
                Age = "20",
                BlogName = "BaoBeiMe"
            };

            Response.Write("<br/><br/>" + String.Format("姓名为:{0} ,性别是:{1} ," +
                                                   "年龄是:{2} , 博客名是:{3} ",
                               person.Name, person.Sex, person.Age, person.BlogName));           
        }
    }
}

以上就是是这个Demo的所有的 .aspx.cs Code-Behind 了

而范例的结果,我想是很容易的

不过也还是给出个截图,保证 Demo 的完整性

image

                                                                         2010—2—01

 

posted @ 2010-03-01 13:14  小宝马的爸爸  阅读(1465)  评论(0编辑  收藏  举报