首页 > 其他 > 详细

关键字Var 原理详解

时间:2014-04-15 14:41:49      阅读:521      评论:0      收藏:0      [点我收藏+]

MSDN上看到的,觉得不错,所以翻译下来,加上自己的一些理解。

在MSDN上,Var 的原意大体上是以一个“未定义类型”来解释的。

 

  基本变量可以是除了基本数据类型之外的Var型引用数据类型。

var 表达式命令编译器让等式右边的类型去作为var成为其真实类型的引用。

  这种引用可以是内置的数据类型(如int,string...),也可以是用户自定义类型(比如实体类等),或者是匿名类型(稍后会说到有关的知识).  也可以是NET FRAMEWORK内置的类型。

  下面的例子很好的列出了各种类型。

bubuko.com,布布扣
// i 编译为INT
var i = 5;

// s 编译为String
var s = "Hello";

// a 编译成字符串数组
var a = new[] { 0, 1, 2 };

// expr 编译为具有<Customer>泛型的迭代器
// 或者是IQueryable<Customer> 
var expr =
    from c in customers
    where c.City == "London" 
    select c;

// anon编译为匿名类型
var anon = new { Name = "Terry", Age = 34 };

// list is 编译为LIST<int>                       
var list = new List<int>();
bubuko.com,布布扣

重要:理解var的关键,并不在于var是一个“可变化的”以及Var并不是一个代表广泛类型(反正就是包罗万象),或者是后期绑定的。VAR的真实类型只是编译器决定和分配的“最适合” 的类型,只和编译器有关

var 被广泛应用于各种场合。

主要有for,foreach 循环或者 using()语句中,如下所示:

for(var x = 1; x < 10; x++)
foreach(var item in list){...}
using (var file = new StreamReader("C:\\myfile.txt")) {...}

下面来介绍一下var和匿名类型的结合。

在很多场合里使用Var可以让代码变得简单和使用起来方便。

但是如果是匿名类型的话,你又想在稍后的代码中用到这个对象的属性的话,就必须使用var关键字来定义。

这在LINQ中是基本的规定。

下面这段代码中,匿名类型中没有name属性,所以,如果一个变量被定义为了Var,想访问属性name唯一的办法就是返回一个对象的序列,利用迭代器foreach迭代变量。

 

bubuko.com,布布扣
class ImplicitlyTypedLocals2
{
    static void Main()
    {
        string[] words = { "aPPLE", "BlUeBeRrY", "cHeRry" };

    
        var upperLowerWords =
             from w in words
             select new { Upper = w.ToUpper(), Lower = w.ToLower() };

        // Execute the query 
        foreach (var ul in upperLowerWords)
        {
            Console.WriteLine("Uppercase: {0}, Lowercase: {1}", ul.Upper, ul.Lower);
        }
    }
}
/* 输出:
    Uppercase: APPLE, Lowercase: apple
    Uppercase: BLUEBERRY, Lowercase: blueberry
    Uppercase: CHERRY, Lowercase: cherry        
 */
bubuko.com,布布扣

 

 

我们再来说一下隐式类型的Array

我们可以创建隐式类型的数组让他的实例来自指定元素的引用在数组的初始化器中。

其他隐式类型的规则全部适用于数组隐式类型的规则。

隐式类型的数组经常用于匿名类型,对象类型和集合类型的查询表达式里,如上面的例子。

bubuko.com,布布扣
class ImplicitlyTypedArraySample
{
    static void Main()
    {
        var a = new[] { 1, 10, 100, 1000 }; // int[] 
        var b = new[] { "hello", null, "world" }; // string[] 

        // 一维数组
        var c = new[]   
{  
    new[]{1,2,3,4},
    new[]{5,6,7,8}
};

        // 字符串类型的“参差不齐”的数组
        var d = new[]   
{
    new[]{"Luca", "Mads", "Luke", "Dinesh"},
    new[]{"Karen", "Suma", "Frances"}
};
    }
}
bubuko.com,布布扣

上面的例子中,可以注意到等式的左边并没有方括号[],这是时候要用new关键字+方括号的方式去书写。

下面来介绍隐式数组在初始化对象中的用法

看下面的代码

 

bubuko.com,布布扣
        var contacts = new[] 
{
    new {
            Name = " Eugene Zabokritski",
            PhoneNumbers = new[] { "206-555-0108", "425-555-0001" }
        },
    new {
            Name = " Hanying Feng",
            PhoneNumbers = new[] { "650-555-0199" }
        }
};
bubuko.com,布布扣

上面的例子中contacts是一个隐式类型的数组,每个PhoneNumbers 的里面,还有一个数组,大家可以看到

注意一下,在name 和PhoneNumbers 的左边,并没有定义var关键字,这种书写方式要注意一下。

 

 

关键字Var 原理详解,布布扣,bubuko.com

关键字Var 原理详解

原文:http://www.cnblogs.com/kmsfan/p/3663435.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!