C#3.0语法新特性集合
隱式類型局部變量
C#3.0提供了一個新的關(guān)鍵字var,使用該關(guān)鍵字,編譯器會根據(jù)用于初始化局部變量的初始值推斷出變量的數(shù)據(jù)類型。
示例代碼:
using System;using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TestVar
{
class Program
{
static void Main(string[] args)
{
//定義int數(shù)組
int[] intAry = new int[] { 1, 2, 3, 4, 5, 6 };
//var varSet = intAry.Where(x => x > 3);
//執(zhí)行Linq查詢
var varSet = from i in intAry where i > 3 select i;
//遍歷查詢結(jié)果
foreach (var v in varSet)
{
Console.WriteLine(v);
}
//輸出varSet的類型名稱與命名空間
Console.WriteLine(varSet.GetType().Name);
Console.WriteLine(varSet.GetType().Namespace);
Console.ReadKey();
}
}
}
運行結(jié)果如下:
使用隱式類型變量的限制:
1. 隱式類型只能用于方法或?qū)傩詢?nèi)局部變量的聲明,不能用var來定義返回值、參數(shù)的類型或類型的數(shù)據(jù)成員。
2. 使用var進行聲明的局部變量必須在聲明時進行賦值,且不能以null為初始值。
隱式類型局部變量最終會產(chǎn)生強類型數(shù)據(jù)。實際上,編譯器在編譯時,會為隱式類型局部變量推斷出一個數(shù)據(jù)類型,所以最終的IL代碼中,這個變量的類型已經(jīng)被確定了。
為什么需要隱式類型變量?
主要是為了與Linq查詢技術(shù)相結(jié)合,我們也只有在定義Linq查詢返回的數(shù)據(jù)時才應(yīng)用使用var關(guān)鍵字。
自動屬性
示例代碼:
using System;using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TestVar
{
class AutoProperty
{
public string Name { get; private set; }
public AutoProperty() { }
}
}
上例中使用自動屬性語法為AutoProperty創(chuàng)建了一個名為Name,類型為string的屬性。該屬性的get方法為public,set方法為private。
擴展方法
擴展方法用于對一個現(xiàn)成類型進行擴展,而不去修改現(xiàn)成類型的源碼。
示例代碼:
using System;using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TestVar
{
public static class Extend
{
//第一個參數(shù)指定對String類型進行擴展
public static string ReplaceA(this string str, string destStr)
{
//將大寫字母A轉(zhuǎn)換為指定字串
return str.Replace("A", destStr);
}
}
}
上例中對String類型進行擴展,將字串中的大寫字母A轉(zhuǎn)換為指定字串。定義時必須注意,擴展方法必須在非泛型靜態(tài)類中定義,且擴展方法也必須是靜態(tài)的。使用時,必須導(dǎo)入擴展方法所在的命名空間。
上例的使用方法:"AAAA".ReplaceA("B"); //將大寫字母A轉(zhuǎn)換為B
其實擴展方法被編譯后,在IL代碼中只不過將目標類型上的擴展方法調(diào)用轉(zhuǎn)換為了對靜態(tài)擴展方法的直接調(diào)用。
分部方法
C#3.0中擴大了partial關(guān)鍵字使用的范圍,我們可以把它應(yīng)用在方法級別。它允許我們在一個文件中構(gòu)建方法原型,而在另一個文件中實現(xiàn)。但有諸多限制:
1. 分部方法只可以定義在分部類中。
2. 分部方法必須返回void類型。
3. 分部方法參數(shù)不能有out修飾符。
4. 分部方法總是隱式私有的,這個限制比較大,所以分部方法很少使用。
示例語法:
定義:partial void PartialMethod(string str);
實現(xiàn):partial void PartialMethod(string str) { ...... }
對象初始化器
我們可以使用對象初始化器為對象的初始化工作簡化語法。
示例:
class ClassA{
public int X { get; set; }
public int Y { get; set; }
public ClassA(int x)
{
X = x;
}
}
static void Main(string[] args)
{
//普通類對象初始化,使用對象初始化器為Y賦值
ClassA a = new ClassA(1) { Y = 2 };
//集合的初始化
List<Point> points = new List<Point>
{
new Point { X = 2, Y = 2 },
new Point { X = 3, Y = 3 },
};
Console.ReadKey();
}
匿名類型
有時我們可能需要定義類來封裝一些臨時數(shù)據(jù),但并不需要任何關(guān)聯(lián)的方法、事件和其他自定義功能。這時我們可以使用匿名類型。
所有匿名類型都自動繼承System.Object,我們可以在匿名類型對象上調(diào)用ToString、GetHashCode、Equals、GetType方法。
示例代碼:
using System;using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TestVar
{
class Program
{
static void Main(string[] args)
{
//定義兩個匿名類型對象,屬性名稱、值均相同
var firstCar = new { Color = "Red", Name = "BMW" };
var secondCar = new { Color = "Red", Name = "BMW" };
//Object.Equals方法比較兩個匿名類型對象是否相等
Console.WriteLine(firstCar.Equals(secondCar));
//使用==操作符比較兩個匿名類型對象是否相等
Console.WriteLine(firstCar == secondCar);
//比較兩個匿名類型是否同一類型
Console.WriteLine(firstCar.GetType().Name == secondCar.GetType().Name);
Console.ReadKey();
}
}
}
該代碼輸出如下圖:
上例中可看出我們使用Euqals比較兩個匿名類型對象返回了true,這是因為編譯器重寫了匿名類型的Equals方法,比較了匿名類型每一個數(shù)據(jù)成員的值。但在使用==操作符比較時,卻得出了false,這是因為匿名類型沒有重載==操作符,所以==操作符比較的是兩個對象的引用,而非兩個對象的內(nèi)容。有意思的是,兩個匿名類型對象的類型比較返回了true。這說明當兩個匿名類型的聲明相同時(即相同的屬性名稱和個數(shù)),編譯器只會為這兩個匿名類型生成同一個匿名類型的定義。
匿名類型的限制:
1. 匿名類型不支持事件、自定義方法、自定義運算符、自定義重寫。
2. 匿名類型是隱式封閉的。
3. 匿名類型的實例創(chuàng)建只使用默認構(gòu)造函數(shù)。
4. 匿名類型中還可以包含匿名類型。
何時使用匿名類型:大多在Linq查詢時使用。
轉(zhuǎn)載于:https://www.cnblogs.com/free722/archive/2011/04/05/2006015.html
總結(jié)
以上是生活随笔為你收集整理的C#3.0语法新特性集合的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小说网jsp源码_基于jsp+mysql
- 下一篇: activex 控件的id 定义位置+使