首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

LINQ 核心語法基石:C# 3.0 新特性完整解析

     編輯:關於.NET

前言

LINQ (Language Integrated Query) 是 .NET 3.5 的里程碑功能,而 LINQ to SQL 只是其眾多 Provider 之一。要駕馭 LINQ 查詢語法,必須先精通 C# 3.0 引入的六大語法糖:隱含型別變數、匿名型別、擴充方法、自動屬性、物件/集合初始化器、Lambda 運算式。本文逐一解析並給出實戰範例,為後續 LINQ 學習鋪路。

一、隱含型別區域變數

var age = 26;
var username = "zhuye";
var userlist = new [] { "a", "b", "c" };
foreach (var user in userlist) Console.WriteLine(user);
  • 編譯器推斷型別,IL 中仍為強型別
  • 限制:必須宣告時初始化、不可為 null、僅限區域變數(不可用於欄位/屬性/參數)
  • 配合匿名型別、LINQ 查詢結果極為常見

二、匿名型別

var data = new { username = "zhuye", age = 26 };
Console.WriteLine($"username:{data.username} age:{data.age}");
  • 編譯器自動產生唯讀屬性的密封類別
  • 屬性名若省略則以變數名為準:`new { x, y }` → `x`, `y`
  • 相同屬性名稱/順序/型別在同一組件內共用同一型別
  • LINQ `select new { ... }` 投影、DTO 轉換核心技術

三、擴充方法

public static class StringHelper
{
    public static string MD5Hash(this string s)
        => FormsAuthentication.HashPasswordForStoringInConfigFile(s, "MD5");

    public static bool In(this object o, IEnumerable source)
        => source.Cast<object>().Any(item => item == o);
}

// 呼叫
"123456".MD5Hash();
"1".In(new[] { "1", "2", "3" });
  • 定義於 靜態類別、方法為 static、第一參數加 this
  • 命名空間匯入後,對擴充型別所有實例可用
  • 同名實例方法優先,擴充方法失效
  • LINQ 標準查詢運算子(Where、Select、OrderBy...)皆為擴充方法

四、自動屬性

public class Person
{
    public string Username { get; protected set; }
    public int Age { get; set; }
    public Person() { Username = "zhuye"; }
}
  • 編譯器自動產生背景欄位、get/set
  • 可分別指定存取等級(如 `protected set`)
  • 無法自訂存取邏輯、無法直接存取背景欄位
  • 純粹減少樣板碼

五、物件與集合初始化器

5.1 物件初始化器

var p = new Person { Username = "zhuye", Age = 26 };
// 等同於
var p = new Person(); p.Username = "zhuye"; p.Age = 26;
  • 可部分指定屬性、可結合建構函式(建構函式先執行)
  • 內部屬性亦可設定

5.2 集合初始化器

var list = new List<Person> {
    new Person { Username = "a", Age = 1 },
    new Person { Username = "b", Age = 2 }
};
  • 編譯器自動呼叫 `Add` 方法
  • Dictionary 等同雙重物件初始化器:`new Dictionary<int,string> { {1,"a"}, {2,"b"} }`

六、Lambda 運算式

6.1 基本語法

(參數列表) => 運算式或語句區塊
  • 參數可 0~N 個:`() => ...`、`x => ...`、`(x,y) => ...`
  • 主體為單一運算式時隱含 `return`;語句區塊需 `{ ...; return ...; }`

6.2 實戰範例

var list = new[] { "aa", "bb", "ac" };
var result = Array.FindAll(list, s => s.IndexOf("a") > -1);
// 等同 delegate(string s) { return s.IndexOf("a") > -1; }

6.3 進階:搭配擴充方法與委派

public delegate int MyDg(int a, int b);
public static class LambdaTest
{
    public static int Oper(this int a, int b, MyDg dg) => dg(a, b);
}

Console.WriteLine(1.Oper(2, (a, b) => a + b)); // 3
Console.WriteLine(2.Oper(1, (a, b) => a - b)); // 1

七、查詢語法

var persons = new List<Person> {
    new Person { Username = "a", Age = 19 },
    new Person { Username = "b", Age = 20 },
    new Person { Username = "a", Age = 21 }
};

var q = from p in persons
        where p.Age >= 20
        select p.Username.ToUpper();
  • 編譯器轉譯為方法語法:`persons.Where(p => p.Age >= 20).Select(p => p.Username.ToUpper())`
  • 關鍵字順序:`from` → `where` → `orderby` → `select`/`group`
  • Visual Studio 完整 IntelliSense、編譯期型別檢查
  • 實現 90%+ T-SQL 功能,且語法更簡潔靈活

八、總結:六大特性關係圖

C# 3.0 特性關係
  • var + 匿名型別 → LINQ 投影結果承接
  • 擴充方法 + Lambda → 標準查詢運算子實作基石
  • 自動屬性 + 初始化器 → 實體/DTO 定義與建構極簡化
  • 查詢語法 → 編譯器轉譯為上述方法鏈,提供聲明式可讀性

掌握這六大特性,即擁有駕馭 LINQ to SQL、LINQ to XML、LINQ to Objects、PLINQ 等所有 LINQ 風味的通用鑰匙。下一篇正式進入 LINQ to SQL 實戰查詢語法篇。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved