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