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性能追踪及分析。 我们今天就简…

python后面空格报错_python中空格和table混用报错原因

python是一门严格遵守缩进的语言&#xff0c;缩进的规则代表着程序的层级关系。我们来看一段代码。class MyForm(Form):value1 StringField(value1)value2 StringField(value2)value3 StringField(value3) #这行用的是Tab缩进submit SubmitField(Submit)learn pytho…

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;所以利用这个项目开始上手挺合适的。源码、可执行文件可以自…

Struts学习笔记_i18n

1. I18N原理 a) ResourceBundle和Locale的概念 b) 资源文件 c) native2ascii //test.javaimport java.util.Locale; import java.util.ResourceBundle;public class Test {public static void main(String[] args) {ResourceBundle res ResourceBu…

map reduce相关程序

Test_1.java /** * Hadoop网络课程模板程序* 编写者&#xff1a;James*/ import java.io.IOException; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date;import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.co…

用仿ActionScript的语法来编写html5——终篇,LegendForHtml5Programming1.0开源库件

一,LegendForHtml5Programming1.0库件是什么?它是一个javascript库&#xff0c;它模仿了ActionScript的语法&#xff0c;用于html5的开发&#xff0c;目前实现的功能相对较少&#xff0c;还不能称之为引擎&#xff0c;希望将来可以作为html5的开源引擎&#xff0c;为html5开发…

JavaJVM之ClassLoader源码分析

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

python打包库_Python 打包自己的库到 PYPI (可pip安装)

背景在我们安装 Python 库的时候&#xff0c;通常我们都是pip install xxx真是又酷炫又方便那么&#xff0c;当我们自己写了一些自认为不错的库&#xff0c;想要分享给大家使用(或者是想要装X时)能不能也能做到这样呢&#xff1f;环境需求已经写好能正常使用的库/方法/项目 (可…

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;但是打开的时候就会遇到以下错误 这种情况是由于我们放的文件是一个网络路径所导致…

Zookeeper-Zookeeper的配置

前面两篇文章介绍了Zookeeper是什么和可以干什么&#xff0c;那么接下来我们就实际的接触一下Zookeeper这个东西&#xff0c;看看具体如何使用&#xff0c;有个大体的感受&#xff0c;后面再描述某些地方的时候也能在大脑中有具体的印象。本文只关注分布式模式的zookeeper&…

Android插件化开发之动态加载基础之ClassLoader工作机制

类加载器ClassLoader 早期使用过Eclipse等Java编写的软件的同学可能比较熟悉&#xff0c;Eclipse可以加载许多第三方的插件&#xff08;或者叫扩展&#xff09;&#xff0c;这就是动态加载。这些插件大多是一些Jar包&#xff0c;而使用插件其实就是动态加载Jar包里的Class进行…

python运行时间过长怎么优化_Python性能优化的20条建议

1.优化算法时间复杂度算法的时间复杂度对程序的执行效率影响最大&#xff0c;在Python中可以通过选择合适的数据结构来优化时间复杂度&#xff0c;如list和set查找某一个元素的时间复杂度分别是O(n)和O(1)。不同的场景有不同的优化方式&#xff0c;总得来说&#xff0c;一般有分…

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

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

js字符串函数大全

JS自带函数concat将两个或多个字符的文本组合起来&#xff0c;返回一个新的字符串。var a "hello";var b ",world";var c a.concat(b);alert(c);//c "hello,world"indexOf返回字符串中一个子串第一处出现的索引&#xff08;从左到右搜索&…