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);}}
}

总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/62638.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【真正离线安装】Adobe Flash Player 32.0.0.156 插件离线安装包下载(无需联网安装)

网上很多人声称并提供的flash离线安装包是需要联网才能安装成功的&#xff0c;其实就是在线安装包&#xff0c;而这里提供的是真正的离线安装包&#xff0c;无需联网即可安装成功。 点击下面地址下载离线安装包&#xff1a; Adobe Flash Player 32.0.0.156 for IE Adobe Fla…

《Vue 组件化开发:构建可复用的模块》

一、Vue 组件化开发概述 组件化是 Vue.js 的核心概念之一&#xff0c;它允许将界面拆分成独立、可复用的组件&#xff0c;使得开发大型应用变得更加简单和高效。 组件的定义是实现应用中局部功能代码和资源的集合。Vue.js 的组件化用于将 UI 页面分割为若干组件进行组合和嵌套…

Python生日祝福烟花

1. 实现效果 2. 素材加载 2个图片和3个音频 shoot_image pygame.image.load(shoot(已去底).jpg) # 加载拼接的发射图像 flower_image pygame.image.load(flower.jpg) # 加载拼接的烟花图 烟花不好去底 # 调整图像的像素为原图的1/2 因为图像相对于界面来说有些大 shoo…

26页PDF | 数据中台能力框架及评估体系解读(限免下载)

一、前言 这份报告详细解读了数据中台的发展历程、核心概念、能力框架及成熟度评估体系。它从阿里巴巴的“大中台&#xff0c;小前台”战略出发&#xff0c;探讨了数据中台如何通过整合企业内部的数据资源和能力&#xff0c;加速业务迭代、降低成本&#xff0c;并推动业务增长…

C++中输入 不定长数据的方法

在未知 所需要输入数据的长度时 &#xff0c;可以用whilegetchar的方法。 char arr1[60] ;int i 0;char c ;while ((c getchar())! \n && c! EOF){arr1[i] c;i;}arr1[i]\0; 这里正常输入字符都是没问题的&#xff0c;while里面的内容都可以正常执行&#xff0c; 当…

Linux系统硬件老化测试脚本:自动化负载与监控

简介&#xff1a; 这篇文章介绍了一款用于Linux系统的自动化硬件老化测试脚本。该脚本能够通过对CPU、内存、硬盘和GPU进行高强度负载测试&#xff0c;持续运行设定的时长&#xff08;如1小时&#xff09;&#xff0c;以模拟长时间高负荷运行的环境&#xff0c;从而验证硬件的稳…

如何分段存储Redis键值对

说明&#xff1a;本文介绍针对一个value过长的键值对&#xff0c;如何分段存储&#xff1b; 场景 当我们需要存入一个String类型的键值对到Redis中&#xff0c;如下&#xff1a; &#xff08;缓存接口&#xff09; public interface CacheService {/*** 添加一个字符串键值…

C-操作符

操作符种类 在C语言中&#xff0c;操作符有以下几种&#xff1a; 算术操作符 移位操作符 位操作符 逻辑操作符 条件操作符 逗号表达式 下标引用&#xff0c;函数调用 拓展&#xff1a;整型提升 我们介绍常用的几个 算术操作符 &#xff08;加&#xff09;&#xff…

RabbitMQ 客户端 连接、发送、接收处理消息

RabbitMQ 客户端 连接、发送、接收处理消息 一. RabbitMQ 的机制跟 Tcp、Udp、Http 这种还不太一样 RabbitMQ 服务&#xff0c;不是像其他服务器一样&#xff0c;负责逻辑处理&#xff0c;然后转发给客户端 而是所有客户端想要向 RabbitMQ服务发送消息&#xff0c; 第一步&a…

浅析大数据时代下的网络安全

一、大数据时代下网络安全的现状 在全球化进程不断深入发展的情况下&#xff0c;互联网行业发展速度也更加迅猛&#xff0c;人们对网络信息的需求量不断增加&#xff0c;所以目前已经进入了大数据时代。 随着计算机技术的不断发展&#xff0c;我国互联网网络规模、网民数量、…

【SQL常用日期函数(二)】

SQL 常用日期函数-基于 Impala 3.4.0 接之前 SQL常用日期函数&#xff08;一&#xff09;介绍了实现计算上年末、上级末、上月末、上年同期的方法和函数&#xff0c;这次继续分享常用的SQL日期函数及使用场景。包括&#xff1a;DAYOFWEEK 函数、TRUNC 函数、LAST_DAY 函数。 …

计算机基础 原码反码补码问题

整数的二进制的表示形式&#xff1a;其实有三种 原码&#xff1a;直接根据数值写出的二进制序列就是原码 反码&#xff1a;原码的符号位不变&#xff0c;其他位按位取反就是反码 补码&#xff1a;反码1&#xff0c;就是补码 负数&#xff1a;-1 以补码形式存放在内存 写出 -1…

题海拾贝——生成元(Digit Generator,ACM/ICPC SEOUL 2005,UVa1583)

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 欢迎点赞关注&#xff01; 1、题目描述 如果x加上x的各个数字之和得到y&#xff0c;就说x是y的生成元。给出(1<n<10…

笑话故事 第十七期

好久不见&#xff0c;以下是为您准备的笑话&#xff0c;希望能让您捧腹大笑&#xff1a; 1. 名字的误会 小明新交了一个女朋友&#xff0c;带回家给父母看。 妈妈问&#xff1a;“姑娘&#xff0c;你叫什么名字啊&#xff1f;” 女朋友&#xff1a;“阿姨&#xff0c;我叫小芳…

Clean Docker Images and Container by Cron Job

1.Cretae a clean_docker_containers.sh to clean containers (status: exited, dead) #!/bin/bash# 找到所有状态不正常的容器 containers$(docker ps -a --filter "statusexited" --filter "statusdead" --format "{{.ID}}")if [ -z "$…

欧科云链研究院:比特币还能“燃”多久?

出品&#xff5c; OKG Research 作者&#xff5c;Hedy Bi 本周二&#xff0c;隔夜“特朗普交易” 的逆转趋势波及到比特币市场。比特币价格一度冲高至约99,000美元后迅速回落至93,000美元以下&#xff0c;最大跌幅超6%。这是由于有关以色列和黎巴嫩有望达成停火协议的传闻引发…

Linux系统管理基础指南--习题

目录 一、基础知识与命令 二、 Linux的用户接口 三、文件权限与目录管理 四、shell相关知识 五、软件安装与网络 六、网络进程管理 一、基础知识与命令 1. (操作题)分别执行下述命令 ls -al cd ~ cd man -f man man –k cd man --help cal --help date --help bc --he…

hint: Updates were rejected because the tip of your current branch is behind!

问题 本地仓库往远段仓库推代码时候提示&#xff1a; error: failed to push some refs to 192.168.2.1:java-base/java-cloud.git hint: Updates were rejected because the tip of your current branch is behind! refs/heads/master:refs/heads/master [rejected] (…

设计模式面试大全:说一下单例模式,及其应用场景?

定义 单例模式&#xff08;Singleton Pattern&#xff09;是 Java 中最简单的设计模式之一&#xff0c;此模式保证某个类在运行期间&#xff0c;只有一个实例对外提供服务&#xff0c;而这个类被称为单例类。 单例模式也比较好理解&#xff0c;比如一个人一生当中只能有一个真…

go-zero使用自定义模板实现统一格式的 body 响应

前提 go环境的配置、goctl的安装、go-zero的基本使用默认都会 需求 go-zero框架中&#xff0c;默认使用goctl命令生成的代码并没有统一响应格式&#xff0c;现在使用自定义模板实现统一响应格式&#xff1a; {"code": 0,"msg": "OK","d…