C# using static 声明

d060d08cbc736d2ad37e01872f218bf6.png

许多实际的扩展可以通过扩展方法来实现,并非所有实际的扩展都有可以扩展的类型。对于某些场景,简单的静态方法比较适合。为了更容易调用这些方法,可以使用 using static 声明除去类名。

例如,如果打开了 System.Console 

using static System.Console;

可以把下面的代码

Console.WriteLine("Hello World!");

改为

WriteLine("Hello World!");

在使用此声明之后,就可以使用类 Console 的所有静态成员,如 WriteLine、Write、ReadLine、Read、Beep 等,而不需要编写 Console 类。只需要确保在打开其他类的静态成员时不要陷入冲突,或者在使用静态方法时不要使用基类的方法。

下面看一个实际的例子。高阶函数以函数作为参数,或者返回一个函数,或者返回两个函数。在处理函数时,可以将两个函数合并到一个函数中。

为此可以使用Compose 方法,如下面的代码片段所示:

public static class FunctionalExtensions
{//...public static Func<T1, TResult> Compose<T1, T2, TResult>(Func<T1, T2> fl, Func<T2, TResult> f2) => a => f2(f1(a));
}

该泛型方法定义了三个类型参数和两个委托类型 Func 的参数。请记住,委托 Func<T,TResult>引用了一带有单个参数的方法,其返回类型可以是不同的类型。Compose 方法接受两个 Func 参数,把两个方法组合到一个方法中。传递给Compose 的第一个方法(f1)可以有两个不同的类型,一个用于输入 T,另一个用于输出(T2),而传递的第二个方法(f2)所需要的输入类型(T2)与第一个方法的输出类型(T2)相同,并且可以有不同的输出类(TResult)。Compose 方法本身返回一个 Func 委托,其输入类型与第一个方法相同(T),输出类型与第二个方相同(TResult)。实现可能看起来有点可怕,因为后面跟着连续两个 lambda 操作符。理解了方法返回的内容(一个方法)时,这个构造就将变得清晰。返回的方法是 Func<T1,TResult>。在第一个 lambda 操作符之后,=>f2(f1(2));定义了这个方法。变量的类型为 T1,返回的方法类型为 TResult,与 f2 返回的结果类型相同,f2 以输入作为参数接收 f1。

要使用 Compose 方法,首先创建两个委托 f1 和 f2,在输入中添加 1 或 2。这些委托会与 Compose 方法相结合。由于 usingstatic 声明打开了类 FunctionalExtensions 的静态成员,所以可以不使用类名来调用 Compose 方法。在使用 Compose 方法创建 f3之后,就调用 f3 方法:

using System;
using static System.Console;
using static UsingStatic.FunctionalExtensions;
namespace UsingStatic 
{class Program{static void Main(){//...Func<int, int> f1 = x => x + 1;Func<int, int> f2 = x => x + 2;Func<int, int> f3 = Compose(f1, f2);var xl = f3(39); WriteLine(x1);//...}}
}

写入控制台的结果当然是 42。

d31772c45e82f716c4f94f7c990dfc62.png

声明 Compose 方法时,参数类型可以在输入和输出之间有所不同。在下面的代码片段中,传递给 Compose 方法的第一个方法接收一个字符串,并返回 Person 对象;第二个方法接收 Person 并返回一个字符串。如果编译器不能从变量和返回类型中识别参数类型,就必须指定具体的委托类型,方法是接收字符串并返回一个 Person。只有变量名,并不能帮助编译器确定它的类型。通过传递给 Compose 方法的第二个方法,显然,输入的类型与第一个方法返回的类型相同,因此不需要指定类型。在调用Compose 方法之后,变量 greetPerson 是两个输入方法的组合:

var greetPerson = Compose(new Func<string, Person>(name => new Person(name)),person => $"Hello, {person.FirstName}"); WriteLine(greetPerson("Mario Andretti"));

eb4ef984789941f9d5fbf0b7adcf2204.png

在WriteLine 方法中使用字符串 Mario Andretti 调用greetPerson 方法将字符串 Hello,Mario 写入控制台。

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

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

相关文章

PHP性能追踪及分析工具xhprof的安装与使用

PHP性能追踪及分析工具xhprof的安装与使用 对于本地开发环境来说&#xff0c;进行性能分析xdebug是够用了&#xff0c;但如果是线上环境的话&#xff0c;xdebug消耗较大&#xff0c;配置也不够灵活&#xff0c;因此线上环境建议使用xhprof进行PHP性能追踪及分析。 我们今天就简…

C 语言 int 型乘法溢出问题

2019独角兽企业重金招聘Python工程师标准>>> long l; int a, b; l a*b; 因为 a*b 的结果仍然以 int 型保存, 所以即使 l 为long,仍然会有溢出,并且截去了部分数据.出现问题. 转载于:https://my.oschina.net/simon203/blog/175885

Android插件化开发基础之Java类加载器与双亲委派模型

类加载器 Java虚拟机类加载过程是把Class类文件加载到内存&#xff0c;并对Class文件中的数据进行校验、转换解析和初始化&#xff0c;最终形成可以被虚拟机直接使用的java类型的过程。 在加载阶段&#xff0c;java虚拟机需要完成以下3件事&#xff1a; a.通过一个类的全限定名…

将k8s制作成3D射击游戏,好玩到停不下来,附源码

点击上方蓝字 关注【我的小碗汤】大家好&#xff0c;我是小碗汤&#xff0c;今天演示一个项目&#xff0c;利用Unity做场景、用C#做交互逻辑&#xff0c;将k8s制作成一个3D射击游戏。正好最近在学习Unity&#xff0c;所以利用这个项目开始上手挺合适的。源码、可执行文件可以自…

JavaJVM之ClassLoader源码分析

层次结构和类图 ClassLoader层次结构&#xff1a;UML类图&#xff1a;sun.misc.Launcher.ExtClassLoader sun.misc.Launcher.AppClassLoader 显式加载类 在代码中显式加载某个类&#xff0c;有三种方法&#xff1a;this.getClass().getClassLoader().loadClass()Class.forName(…

ASP.NET Core Web API使用静态swagger.json文件

前言ASP.NET Core Web API默认集成了Swashbuckle&#xff0c;可以在运行时显示Swagger UI&#xff1a;而Swagger UI实际上是解析的动态生成的swagger.json&#xff1a;app.UseSwagger(); app.UseSwaggerUI(c > c.SwaggerEndpoint("/swagger/v1/swagger.json", &qu…

XenApp共享桌面打开文件警告与桌面文件由于Internet文件安全设置无法打开解决办法...

问题现象 1. 在使用了UPM与文件夹重定向后&#xff0c;个人的桌面路径就会变成一个UNC路径&#xff0c;这个时候如果用户登录共享桌面的话可以看到桌面与快速启动栏的文件与快捷方式&#xff0c;但是打开的时候就会遇到以下错误 这种情况是由于我们放的文件是一个网络路径所导致…

周选特辑|一些超棒的开源项目!

编程导航 每周新增资源优选特辑 02编程导航 致力于推荐优质编程资源 &#x1f48e;项目开源仓库&#xff1a;https://github.com/liyupi/code-nav跪求一个 star ⭐️哈喽大家好&#xff01;我是编程导航的小编火宝。美好的一周又过去了&#xff0c;大家有没有认真学习呢&#x…

Android插件化开发之DexClassLoader动态加载dex、jar小Demo

一、温故动态加载ClassLoader机制 如果对Android的ClassLoader加载机制不熟悉&#xff0c;猛戳Android插件化开发动态加载基础之ClassLoader工作机制 http://blog.csdn.net/u011068702/article/details/53248960 二、介绍 我们知道在Android中可以跟java一样实现动态加载jar&…

js监听多个事件_JavaScript中的事件与异常捕获解析

这篇文章主要给大家介绍了关于JavaScript中事件与异常捕获的相关资料&#xff0c;文中通过示例代码介绍的非常详细&#xff0c;写的十分的全面细致&#xff0c;具有一定的参考价值&#xff0c;对此有需要的朋友可以参考学习下。如有不足之处&#xff0c;欢迎批评指正。事件处理…

C#多线程开发-使用并发集合

前言大家好&#xff0c;我是阿辉。在C#语言中当需要处理并发的场景时&#xff0c;就需要程序员使用最合理的数据结构。那么哪些数据结构是支持和可以在并行计算中被使用的呢。首先这些数据结构具备可伸缩性&#xff0c;尽可能地避免锁(会造成多个线程的等待&#xff0c;防止资源…

windows 下安装wamp环境

一直以来都是学习在Linux下安装lanmp环境&#xff0c;在Windows下都是用的集成工具比如appserv现在来安装Windows版本的lamp都是从官网下载的资源在Windows下以后还会编辑更多的东西。我的文章都会以后都有更新&#xff0c;因为有时候有点想法&#xff0c;如果不实践的话会忘记…

应用环境下的TIME_WAIT和CLOSE_WAIT

转载自&#xff1a;http://blog.csdn.net/shootyou/article/details/6622226 昨天解决了一个HttpClient调用错误导致的服务器异常&#xff0c;具体过程如下&#xff1a;http://blog.csdn.net/shootyou/article/details/6615051里头的分析过程有提到&#xff0c;通过查看服务器网…

当社恐和社恐相亲时,场面会有多尴尬?

1 俄国人真实在&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 alone和lonely的区别&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 她可能怕她男朋友伤害到别人&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 真正的笋到家了&#xff08;…

FlexPod上安装vSphere 5.5配置中的排错(1)

delxu原创文档&#xff0c;转发请一定要标记本文出处和原文URL。 这些日子在进行FlexPod上的vSphere 5.5的安装和配置&#xff0c;过程中遇到一些故障、困难&#xff0c;都一一解决了。觉得有必要和大家分享一下。可能会有好多篇&#xff0c;也可能和以前一样&#xff0c;虎头蛇…

Android插件化开发之动态加载三个关键问题详解

本文摘选自任玉刚著《Android开发艺术探索》&#xff0c;介绍了Android插件化技术的原理和三个关键问题&#xff0c;并给出了作者自己发起的开源插件化框架。 动态加载技术&#xff08;也叫插件化技术&#xff09;在技术驱动型的公司中扮演着相当重要的角色&#xff0c;当项目越…