C#函数式编程示例

前一篇介绍了TypeScript函数式编程示例,这次再写一个C#的代码示例。 作为OOP语言,C#对FP的支持并没有TS那么好,不过也可以通过delegate,Func,Action,甚至是扩展方法(对delegate、Func等进行扩展)实现。

下面是代码示例,该示例假设有Product对象,其stock属性为bool类型,根据其值决定对quantity属性赋值,还是记录log。普通的代码方式如下:

namespace FP {     class Product     {         public bool stock;         public int quantity;         public int count;     }      class Normal {         public Normal() {             var prod = new Product() { stock=true, quantity=100, count=10 };             if(prod.stock) {                 prod.quantity *= 2;             }             else {                 Console.WriteLine("no stock");             }         }     } } 

下面再来看采用delegate方式改造的结果

    delegate bool IfElse<P>(P p);     delegate void True<T, U>(T t, U u);     delegate void False<T>(T t);      class FPDemo {         static IfElse<Product> HasStock = (p) => p.stock;         static True<Product, int> SetQuantity = (p, qty) => {             p.quantity = qty;         };          static False<Product> LogError = (p) => {             Console.WriteLine(p.quantity);         };          static Action<Product, IfElse<Product>, True<Product, int>, False<Product>> StockFunc = (prod, HasStock, SetQuantity, LogError) => {             if(HasStock(prod))             {                 SetQuantity(prod, prod.quantity*2);             }             else {                 LogError(prod);             }         };          public FPDemo() {             var prod = new Product() { stock=true, quantity=100, count=10 };             StockFunc(prod, HasStock, SetQuantity, LogError);         }     } 

这么做的好处很明显,把业务逻辑处理独立出来,方便阅读和复用。

推荐这些技术文章:

Blazor 模板化组件开发指南

翻译自 Waqas Anwar 2021年4月15日的文章 《A Developer’s Guide To Blazor Templated Components》 [1]

在我之前的一篇文章 Blazor 组件入门指南中,我介绍了组件参数,并向您展示了如何将数据作为参数传递给 Blazor 组件以定制化其功能。在这篇文章中,我将更进一步向您展示,如何将一个或多个 UI 模板作为参数传递...

ssm整合小项目(书籍管理系统)

数据库准备

CREATE DATABASE `ssmbuild`;

USE `ssmbuild`;

DROP TABLE IF EXISTS `books`;

CREATE TABLE `books` (
`bookID` INT(10) NOT NULL AUTO_INCREMENT COMMENT '书id',
`bookName` VARCHAR(100) NOT NULL COM...

让我手把手教你写一个强大、方便使用的 IOC 容器

一、介绍
    1、介绍
        最近无聊,也没什么事做,没事做总是要给自己找点事情做吧,毕竟人的生活在与折腾。于是,决定自己手动写一个 IOC 的框架。我们知道在 NetCore 的版本里面已经内置了 IOC 容器,它就是 ServiceCollection,一般情况下,该容器还是够用的,但是有时候还会有力不从心的时候,比如:我想要实现属性注入或者方法注入,NetCore 内置的框架...

IDEA搭建SSM项目并实现简单案例,步骤超详细

前言
最近手头上没啥活儿,就想用IDEA搭建一个SSM项目,结果发现不百度根本搭不出来,就算是搭建好了也是有很多问题,为了以后方便上手,在此一步一步记录一下。
一、搭建SSM框架
【File】-->【New】-->【Project】

选择左侧【Maven】,在【Create from archetype】前面打【√】,选择【org.apache.maven.archetype:ma...

.Net Core3.0 WebApi 项目框架搭建 十七:使用NewLife.Redis替换掉原来的Redis

 
 .Net Core3.0 WebApi 项目框架搭建:目录
 
介绍

NewLife.Redis主要作者及经验介绍来源:大石头
源码: https://github.com/NewLifeX/NewLife.Redis
Nuget:NewLife.Redis
NewLife.Redis是一个Redis客户端组件,以高性能处理大数据实时计算为目标。
Redis...

黑马程序员-传智健康项目(第六章)

传智健康项目

黑马程序员-传智健康项目(第一章)
黑马程序员-传智健康项目(第二章)
黑马程序员-传智健康项目(第三章)
黑马程序员-传智健康项目(第四章)
黑马程序员-传智健康项目(第五章)
黑马程序员-传智健康项目(第六章)
黑马程序员-传智健康项目(第七章)
黑马程序员-传智健康项目(第八章)
黑马程序员-传智健康项目(第九章)
黑马程序员-传智健康项目(第十章)
黑马程序员-传智健康项...

通用Mapper简单使用介绍

通用Mapper使用介绍
  通用Mapper是简化mybatis操作的一个框架,使用它就不需要再建立xml映射文件了,也不用在dao接口(注解开发)写sql语句,只需要将pojp用注解跟数据库的表和字段建立映射关系,然后在dao接口继承Mapp类并指定泛型(你要对哪个pojo操作就指定哪个pojo),在service实现类中,直接调用相关方法,就可以执行简单的CRUD,这样dao接口中也不需要...

领域驱动设计实战-DDD

领域驱动设计实战

领域驱动(DDD,Domain Driven Design)为软件设计提供了一套完整的理论指导和落地实践,通过战略设计和战术设计,将技术实现与业务逻辑分离,来应对复杂的软件系统。本系列文章准备以实战的角度来介绍 DDD,首先编写领域驱动的代码模型,然后再基于代码模型,引入 DDD 的各项概念,先介绍战术设计,再介绍战略设计。
> DDD 实战1 - 基础代码...

你真的熟悉ASP.NET MVC的整个生命周期吗?

一、介绍
    我们做开发的,尤其是做微软技术栈的,有一个方向是跳不过去的,那就是MVC开发。我相信大家,做ASP.NET MVC 开发有的有很长时间,当然,也有刚进入这个行业的。无论如何,如果有人问你,你知道ASP.NET MVC的生命周期吗?你知道它的来世今生吗?你知道它和 ASP.NET WEBFORM 有什么区别吗?估计,这些问题,有很多人会答不上来,或者说不清楚。今天,我就把我的理解...

Blazor Server 应用程序中进行 HTTP 请求

翻译自 Waqas Anwar 2021年5月4日的文章 《Making HTTP Requests in Blazor Server Apps》 [1]

Blazor Server 应用使用标准的 ASP.NET Core 应用程序,在服务端执行 .NET 代码。在 Blazor Server 应用程序中,我们可以像在 ASP.NET Core Web 应用程序中那样,使用相同的方式访...

文章标题:C#函数式编程示例
文章链接:https://www.dianjilingqu.com/2833.html
本文章来源于网络,版权归原作者所有,如果本站文章侵犯了您的权益,请联系我们删除,联系邮箱:saisai#email.cn,感谢支持理解。
THE END
< <上一篇
下一篇>>