C# 3.0 于 2007 年 随 .NET Framework 3.5 发布,主要专注于**语言集成查询(LINQ)**的引入,同时引入了一系列新特性,使代码更加简洁、可读性更高。
C# 3.0 主要新增特性
1. 语言集成查询(LINQ - Language Integrated Query) 🚀
LINQ(Language Integrated Query)是 C# 3.0 的核心新增特性,提供了统一的查询语法,支持查询对象、数据库、XML 等数据源。
示例(LINQ 查询语法):
int[] numbers = { 1, 2, 3, 4, 5 }; // 查询所有偶数 var evenNumbers = from n in numbers where n % 2 == 0 select n; foreach (var num in evenNumbers) { Console.WriteLine(num); // 输出: 2, 4 }
示例(LINQ 方法语法):
var evenNumbers = numbers.Where(n => n % 2 == 0);
LINQ 优势:
- 统一数据访问方式
- 类型安全,避免运行时错误
- 延迟执行,提高性能
- 更清晰的可读性
2. 隐式类型(var 关键字)
C# 3.0 引入了 var 关键字,允许编译器根据右侧的表达式自动推断变量类型,减少冗余代码。
示例:
var name = "Alice"; // 推断为 string var age = 25; // 推断为 int var numbers = new List<int> { 1, 2, 3 }; // 推断为 List<int>
优点:
- 代码更简洁,避免重复类型声明
- 适合 LINQ 查询等复杂类型
注意: var 仅适用于局部变量,不能用在类字段或方法参数中。
3. 对象和集合初始化器(Object & Collection Initializers)
C# 3.0 允许在创建对象或集合时直接初始化其属性或元素,简化对象创建过程。
示例(对象初始化器):
public class Person { public string Name { get; set; } public int Age { get; set; } } var person = new Person { Name = "Bob", Age = 30 };
示例(集合初始化器):
var numbers = new List<int> { 1, 2, 3, 4 }; var people = new List<Person> { new Person { Name = "Alice", Age = 25 }, new Person { Name = "John", Age = 35 } };
优势:
- 提高可读性,减少冗余代码
- 与
var结合使用,代码更简洁
4. 自动属性(Auto-Implemented Properties)
在 C# 3.0 之前,需要手动创建字段和访问器,而自动属性提供了更简洁的方式,允许直接定义属性,而无需显式声明私有字段。
示例:
public class Product { public string Name { get; set; } public decimal Price { get; set; } }
等价于传统写法:
private string _name; public string Name { get { return _name; } set { _name = value; } }
优势:
- 减少样板代码(boilerplate code)
- 适合简单的属性封装
5. 匿名类型(Anonymous Types)
C# 3.0 引入了匿名类型,允许在不定义类的情况下创建对象,通常与 LINQ 结合使用。
示例:
var person = new { Name = "Charlie", Age = 28 }; Console.WriteLine(person.Name); // 输出: Charlie Console.WriteLine(person.Age); // 输出: 28
特点:
- 只能包含只读属性
- 不能在类的外部使用
- 适用于临时存储数据,如 LINQ 查询
6. Lambda 表达式(Lambda Expressions)
C# 3.0 引入了Lambda 表达式,简化了匿名方法的语法,常用于 LINQ 查询和委托。
示例:
Func<int, int> square = x => x * x; Console.WriteLine(square(5)); // 输出: 25
示例(用于 LINQ):
var evenNumbers = numbers.Where(n => n % 2 == 0);
语法格式:
(parameters) => expression;
优势:
- 语法简洁
- 适合回调、事件、LINQ 操作
- 易于与
Func<>和Action<>泛型委托配合使用
7. 扩展方法(Extension Methods)
扩展方法允许为现有类型添加新方法,而无需修改原始类,尤其适用于 LINQ 扩展。
示例:
public static class StringExtensions { public static bool IsCapitalized(this string str) { return char.IsUpper(str[0]); } } Console.WriteLine("Hello".IsCapitalized()); // 输出: True
应用场景:
- 扩展第三方库或系统类
- 用于 LINQ 扩展(如
Where、Select等)
8. 查询表达式(Query Expressions)
C# 3.0 提供了一种类似 SQL 的查询语法,可以查询集合、数据库、XML 等。
示例:
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 }; var evenNumbers = from num in numbers where num % 2 == 0 select num; foreach (var num in evenNumbers) { Console.WriteLine(num); // 输出: 2, 4 }
优势:
- 直观易读,类似 SQL
- 与方法链式调用等价
9. 表达式树(Expression Trees)
C# 3.0 引入了表达式树,它允许将代码作为数据结构进行操作,主要用于 LINQ 提供的查询优化。
示例:
Expression<Func<int, int>> expr = x => x * x; Console.WriteLine(expr.Body); // 输出: x * x
优势:
- 可用于动态构造 LINQ 查询
- 代码分析和转换
C# 3.0 新特性的总结
| 特性 | 描述 |
|---|---|
| LINQ 查询 | 统一数据查询语言 |
var 隐式类型 |
自动推断变量类型 |
| 对象/集合初始化器 | 简化对象创建 |
| 自动属性 | 简化属性定义 |
| 匿名类型 | 临时存储数据的类型 |
| Lambda 表达式 | 简化回调和查询 |
| 扩展方法 | 无需修改即可扩展类型 |
| 查询表达式 | SQL 风格的查询语法 |
| 表达式树 | 代码可作为数据处理 |
C# 3.0 通过这些特性极大地提升了开发效率,使代码更加简洁、易读,
并为数据查询提供了强大的支持,为后续版本的演进打下了坚实的基础。
浙公网安备 33010602011771号