C# 匿名类型和匿名方法

在C#中,匿名类型和匿名方法是两个非常有用的特性,它们可以帮助我们更方便地处理数据和简化代码的编写。

一、匿名类型 (Anonymous Types)

匿名类型允许你在不显式定义类的情况下创建对象。编译器会自动为你生成一个类,其属性由你在对象初始化表达式中指定的属性决定。这在只需要临时使用一个对象,并且不需要为其定义一个单独的类时非常有用。

在使用显性方法的时候,我们需要根据它定义好的类,进行赋值

public class Student
{
    public string Name { get; set; }
    public int Age { get; set; }
}

Student student = new Student { Name = "王五", Age = 20 };

// 访问属性
Console.WriteLine($"姓名: {student.Name}, 年龄: {student.Age}");

需要根据已有的《模版》对需要的进行赋值,而我们如果需要多一些属性或者少一些属性,且复用性考虑不高的情况下,可以利用匿名类型进行临时定义。

var student = new
{
    Name = "王五",
    Age = 20,
    Gender = "男",
    Major = "计算机科学",
    GPA = 3.8 // 学术绩点
};

// 匿名类型的属性可以像访问普通对象的属性一样访问
Console.WriteLine($"姓名: {student.Name}, 年龄: {student.Age}, 性别: {student.Gender}, 专业: {student.Major}, GPA: {student.GPA}");

特点

  1. 只读:匿名类型的属性是只读的。一旦赋值,不能再更改。
  2. 类型推断:编译器自动推断类型,因此使用var是必须的。
  3. 类型安全:匿名类型提供强类型检查。

使用场景:

  • LINQ 查询结果:匿名类型常用于 LINQ 查询,将查询结果转换为包含所需属性的对象。
  • 方法的临时返回值:当方法只需要返回一些简单的属性时,使用匿名类型可以避免定义额外的类。
  • 数据结构的简化:在只需要临时使用某些数据,并且不需要定义一个完整的类时,匿名类型可以简化代码。

二、匿名方法 (Anonymous Methods)

匿名方法允许你定义一个没有名称的方法。这在需要将一个简单的代码块作为委托参数传递时非常有用,可以避免定义一个单独的方法。

C# 3.0 引入了匿名方法,而 C# 3.0 之后,Lambda 表达式逐渐取代了匿名方法,因为 Lambda 表达式更加简洁和灵活。

假设你想要创建一个委托来处理计算,可以使用关键字delegate来定义一个匿名方法

Func<int, int, int> add = delegate (int x, int y) {
    return x + y;
};

Console.WriteLine(add(3, 4)); // 输出: 7

Lambda表达式

从C# 2.0开始,匿名方法在C# 3.0中被引入了更简洁的语法——Lambda表达式。Lambda表达式的语法更加简洁,例如上面的代码可以用Lambda表达式重写为:

Func<int, int, int> add = (x, y) => x + y;
Console.WriteLine(add(3, 4)); // 输出: 7

特点

  1. 简化代码:使用匿名方法可以减少显式定义方法的需要,减少冗余代码。
  2. 局部作用域:匿名方法可以在创建它们的作用域内部访问变量。
  3. 与LINQ结合:常用于LINQ查询中,配合Lambda表达式使用更加灵活。

匿名方法与LINQ

假设我们有一个整型列表,我们想要从中筛选出所有偶数,并将这些偶数的平方保存到另一个列表中。我们可以利用LINQ和匿名方法来实现这个需求。

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

        // 使用匿名方法筛选偶数并计算平方
        var squaresOfEvens = numbers.Where(delegate(int n) {
            return n % 2 == 0; // 筛选出偶数
        }).Select(delegate(int n) {
            return n * n; // 计算平方
        });

        // 输出结果
        foreach (var square in squaresOfEvens)
        {
            Console.WriteLine(square);
        }
    }
}
  • 我们使用Where方法筛选出偶数,匿名方法指定筛选条件(n % 2 == 0)。
  • 使用Select方法来计算这些偶数的平方,匿名方法定义了平方的计算逻辑。

以上代码使用Lambda表达式进行简写

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

        // 使用Lambda表达式筛选偶数并计算平方
        var squaresOfEvens = numbers.Where(n => n % 2 == 0) // 筛选出偶数
                                     .Select(n => n * n); // 计算平方

        // 输出结果
        foreach (var square in squaresOfEvens)
        {
            Console.WriteLine(square);
        }
    }
}

总结

特性匿名类型显式类型匿名方法命名方法
简洁性提供快速创建对象的能力,减少样板代码需要额外的类定义简单且快速,适用于一次性操作更清晰,适用于复杂逻辑
灵活性局限于局部范围,无法复用可重用并可以在其他地方使用可在特定上下文中使用更加模块化和可维护
可读性简单场景下更易读复杂场景下更具可读性一次性逻辑可能导致代码难以阅读清晰的函数名有助于理解意图
性能性能开销较小(由于编译时优化)建立类时可能有开销开销小创建方法时可能有轻微的性能影响
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值