淡若轻风

博客园 首页 新随笔 联系 订阅 管理

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 扩展(如 WhereSelect 等)

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 通过这些特性极大地提升了开发效率,使代码更加简洁、易读

并为数据查询提供了强大的支持,为后续版本的演进打下了坚实的基础。

posted on 2025-01-24 22:19  淡若轻风  阅读(37)  评论(0)    收藏  举报