.NET 核心:Func 与 Action 委托(从入门到实战)

.NET委托与Lambda表达式核心用法与最佳实践 委托是.NET中实现类型安全回调的核心机制,本质上是定义了方法签名的函数指针。其技术价值在于解耦调用方与被调用方,支持运行时动态绑定方法。Action/Func泛型委托大幅简化了常见场景的声明,而Lambda表达式则通过=>运算符提供了更简洁的语法糖。在事件处理、LINQ查询、策略模式等场景中,委托与Lambda配合能显著提升代码灵活性。特别值得注意的是,闭包机制虽然强大,但可能引发内存泄漏问题,C# 9.0引入的静态Lambda可有效避免意外捕获。对于高频调用的委托,缓存实例和弱事件模式是提升性能的关键技 阅读详情

在 .NET 开发中,委托(Delegate) 是实现“方法作为参数传递”的核心机制。而 Func 与 Action 是 .NET 框架内置的预定义泛型委托,几乎覆盖了 90% 的委托使用场景——不用再手动定义自定义委托,直接用它们就能高效实现“方法传参”。

一句话核心区分(新手必记):

Func:有返回值,核心是“算出结果”
Action:无返回值,核心是“执行动作”

本文从 定义 → 示例 → 实战场景 → 易错点 → 对比总结 五个维度,把 Func/Action 讲透,看完就能直接用在项目里。

一、核心定义与语法(新手友好版)

1. Action 委托:只做事,不返回

核心特征:

  • 无返回值(返回类型为 void),仅执行逻辑(比如打印、日志、修改状态)
  • 支持 0 ~ 16 个输入参数(满足绝大多数业务场景)
  • 框架已预定义,无需手动写 delegate 关键字

基础语法(常用版):

Action               // 无参数,仅执行动作
Action<T>            // 1个参数,无返回值
Action<T1, T2>       // 2个参数,无返回值
// 最多支持 Action<T1,T2,...,T16>

2. Func 委托:算结果,必返回

核心特征:

  • 必须有返回值(无参版本也得返回),核心是“计算并产出结果”
  • 支持 0 ~ 16 个输入参数,最后一个泛型参数固定是返回值类型(新手最易混点)
  • 同样是框架预定义,开箱即用

基础语法(常用版):

Func<TResult>        // 无参数,返回 TResult 类型结果
Func<T1, TResult>    // 1个参数,返回 TResult 类型结果
Func<T1, T2, TResult>// 2个参数,返回 TResult 类型结果
// 最多支持 Func<T1,T2,...,T16, TResult>

二、Action 委托实战示例(带详细注释)

示例代码(可直接复制运行)

using System;

class ActionPracticalDemo
{
    static void Main()
    {
        // 1. 无参数 Action:执行简单动作(打印固定内容)
        Action printWelcome = () => Console.WriteLine("✅ 欢迎使用 Action 委托!");
        printWelcome(); // 调用:直接执行,无返回值
        
        // 2. 1个参数 Action:接收字符串,打印姓名
        Action<string> printUserName = name => 
            Console.WriteLine($"👤 用户名:{name}");
        printUserName("李四"); // 传入参数执行
        
        // 3. 2个参数 Action:接收两个整数,打印求和过程(仅输出,不返回结果)
        Action<int, int> printAddProcess = (num1, num2) => 
        {
            int sum = num1 + num2; // 仅内部使用,不返回
            Console.WriteLine($"🧮 {num1} + {num2} = {sum}");
        };
        printAddProcess(15, 25); // 传入两个参数执行
    }
}

控制台输出结果

✅ 欢迎使用 Action 委托!
👤 用户名:李四
🧮 15 + 25 = 40

新手提示:
Action 的“价值”体现在“执行动作的副作用”(比如修改控制台输出、写入日志文件、更新UI),而非返回数据。

三、Func 委托实战示例(带详细注释)

示例代码(可直接复制运行)

using System;

class FuncPracticalDemo
{
    static void Main()
    {
        // 1. 无参数 Func:返回固定字符串(核心是“产出结果”)
        Func<string> getSystemMessage = () => "✅ 欢迎使用 Func 委托!";
        string msg = getSystemMessage(); // 调用:接收返回值
        Console.WriteLine(msg);
        
        // 2. 2个参数 Func:计算两个整数的和,返回结果
        Func<int, int, int> calculateSum = (a, b) => a + b;
        int sumResult = calculateSum(15, 25); // 接收返回值
        Console.WriteLine($"🧮 求和结果:{sumResult}");
        
        // 3. 2个参数 Func:计算两个小数的乘积(多行逻辑版)
        Func<double, double, double> calculateProduct = (x, y) =>
        {
            // 可写复杂逻辑,最终必须返回值
            double product = x * y;
            return product;
        };
        double productResult = calculateProduct(4.5, 2.0);
        Console.WriteLine($"🔢 乘积结果:{productResult}");
    }
}

控制台输出结果

✅ 欢迎使用 Func 委托!
🧮 求和结果:40
🔢 乘积结果:9

新手提示:
Func 调用后必须接收返回值(或直接使用),如果只调用不处理返回值,就失去了 Func 的核心意义。

四、实际开发中的高频场景(LINQ + 业务逻辑)

Func 和 Action 最常用在 LINQ 查询、集合操作、异步编程、回调函数 中,以下是项目中最常见的示例:

示例代码(LINQ 实战)

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

class LinqWithFuncAction
{
    static void Main()
    {
        // 模拟业务数据:商品列表
        List<Product> products = new()
        {
            new Product { Id = 1, Name = "手机", Price = 2999 },
            new Product { Id = 2, Name = "耳机", Price = 199 },
            new Product { Id = 3, Name = "电脑", Price = 5999 }
        };

        // 1. Func 场景:LINQ Where 筛选(需要返回布尔结果判断是否符合条件)
        Func<Product, bool> isExpensiveProduct = p => p.Price > 2000;
        var expensiveProducts = products.Where(isExpensiveProduct).ToList();
        Console.WriteLine("💰 高价商品:");
        foreach (var p in expensiveProducts)
        {
            Console.WriteLine($"- {p.Name}({p.Price}元)");
        }

        // 2. Action 场景:遍历集合执行动作(仅打印,无返回值)
        Action<Product> printProductInfo = p => 
            Console.WriteLine($"📦 商品:{p.Name},价格:{p.Price}元");
        Console.WriteLine("\n📋 所有商品:");
        products.ForEach(printProductInfo);
    }

    // 定义商品类(模拟业务实体)
    class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public decimal Price { get; set; }
    }
}

控制台输出结果

💰 高价商品:
- 手机(2999元)
- 电脑(5999元)

📋 所有商品:
📦 商品:手机,价格:2999元
📦 商品:耳机,价格:199元
📦 商品:电脑,价格:5999元

核心结论:

  • LINQ 中 Where/Select/FirstOrDefault 等需要“返回判断/转换结果”的方法,底层都是 Func 委托;
  • 集合 ForEach、事件回调、日志记录等“只执行动作”的场景,优先用 Action 委托。

五、新手易错点提醒(避坑指南)

  1. Func 泛型参数顺序:新手容易把返回值类型放错位置,记住「Func 的最后一个泛型参数永远是返回值」,比如 Func<int, string> 是“接收 int 参数,返回 string”,而非反过来;
  2. Action 并非不能有逻辑内部的变量:Action 可以在内部定义变量、执行复杂逻辑,只是最终不返回值;
  3. 避免过度封装:简单逻辑直接用 lambda 表达式(如示例中的 p => p.Price > 2000),无需单独定义委托变量,减少冗余代码。

六、Func vs Action 核心差异对比表

对比维度Func 委托Action 委托
返回值必须有(最后一个泛型参数为返回类型)无(返回 void)
泛型参数含义前 N 个是输入参数,最后 1 个是返回值所有参数都是输入参数,无返回值参数
核心用途计算、筛选、转换(需要结果)打印、日志、遍历(仅执行动作)
调用方式接收返回值后使用直接调用,无需接收返回值
常见场景LINQ 查询、业务计算、条件判断集合遍历、事件处理、日志记录

七、总结(面试 + 实战速记)

核心要点

  1. 选 Func:当你需要一段逻辑“产出结果”(比如计算、筛选、转换数据)时使用;
  2. 选 Action:当你只需要一段逻辑“执行动作”(比如打印、写日志、更新状态)时使用;
  3. 新手技巧:写代码前先问自己「这段逻辑需要返回值吗?」—— 需要用 Func,不需要用 Action。

实战建议

  • 日常开发优先使用框架预定义的 Func/Action,而非手动定义 delegate,减少代码量;
  • LINQ 操作中,Func 是“主角”,Action 仅用于遍历输出;
  • 异步编程中(如 Func<Task>、Action),核心区分逻辑和同步场景一致。

C#委托与事件:从核心原理到实战避坑指南 在C#编程中,委托与事件是实现松耦合、高内聚架构的核心机制。委托本质上是一种类型安全的函数指针,它允许将方法作为参数传递或变量存储,是实现回调、策略模式的基础。事件则基于委托构建了安全的发布-订阅模型,为组件间通信提供了标准化方案。从技术价值看,它们极大地提升了代码的灵活性和可维护性,尤其在WinForms/WPF等UI框架、插件系统、异步编程等场景中不可或缺。本文聚焦于委托与事件的实战应用,深入剖析多播委托、内存泄漏防范及线程安全等关键问题,并结合【闭包】与【异步编程】等热词,帮助开发者掌握这一构建响应式 阅读详情

相关推荐

C#委托机制详解与实战示例代码

在C#中,委托是类型安全的函数指针机制,它允许开发者将方法作为参数传递、存储于变量之中,并在运行时动态调用。虽然.NET框架提供了Action和Func等泛型内置委托来满足大多数常见场景,但在复杂系统设计或领域特定抽象中,往往需要定义自定义委托以提升代码语义清晰度、增强类型安全性并实现更精确的方法契约控制。本章深入探讨如何从零开始构建自定义委托,涵盖其声明语法、签名匹配原则、返回值处理机制以及泛型扩展技巧,为后续高级编程模式打下坚实基础。匹配维度是否必须一致示例说明。

weixin_36059856的博客 1208

C#内置泛型委托:Action委托

1、什么是Action泛型委托 Action<T>是.NET Framework内置的泛型委托,可以使用Action<T>委托以参数形式传递方法,而不用显示声明自定义的委托。封装的方法必须与此委托定义的方法签名相对应。也就是说,封装的方法必须具有一个通过值传递给它的参数,并且不能有返回值。 2、Action委托定义 查看Action的定义: using Syst...

weixin_30750335的博客 991

本体(Ontology)概述

认识本体        本体(Ontology)的概念源自于哲学领域,在哲学中的定义为“对世界上客观事物的系统描述,即存在论”。哲学中的本体关心的是客观现实的抽象本质。而在计算机领域,本体可以在语义层次上描述知识,可以看成描述某个学科领域知识的一个通用概念模型。德国学者Studer在1998年给出了本体的相关定义“本体是共享概念模型的形式化规范说明”。这个定义包含了四层含义:即共享(share)...

baijinswpu的博客 7万+

.NET Action 与 Func

Action 与 Func是.NET类库中增加的内置委托,以便更加简洁方便的使用委托 内置委托类型,顾名思义Action和Func本身就是已经定义好的委托类型。两种委托类型的区别在于:Action委托签名不提供返回类型,而Func提供返回类型。 Action委托具有Action、Action<T1,T2>、Action<T1,T2,T3>……Action<T1,...

1467

SRCNN超分辨率Pytorch实现,代码逐行讲解,附源码

超分辨率,就是把低分辨率(LR, Low Resolution)图片放大为高分辨率(HR, High Resolution)的过程。通过CNN将图像Y 的特征提取出来存到向量中。用一层的CNN以及ReLU去将图像Y 变成一堆堆向量,即feature map。把提取到的特征进一步做非线性映射,加大网络深度,提高网络复杂性。结合了前面得到的补丁来产生最终的高分辨率图像。实验步骤。

weixin_52261094的博客 3万+

QT | QT打包生成单个EXE文件

1.以release方式运行程序 2.在release文件夹中找到.exe文件 如果没有找到exe,可能是因为在项目中勾选了shadow build,你可以在构建目录中找到exe 3.将exe放在一个新建的文件夹中,因为待会儿会生成很多dll文件 4.点击电脑左下角搜索QT,打开Qt 5.8 for Desktop (MinGQW 5.3.0 32bit) 5.进入刚刚新建的文件夹,输入wi...

⊳ideal world⊲~ヽ(゚︺゚)Hi 1238

.Net类库预定义委托之Action

委托Action,Func,Predicate是平时开发中使用的较多的系统预定义委托类型。三者均位于.Net类库的System 命名空间下。本文将对三者中的Action委托做一个简单的介绍,希望能为那些对此感兴趣的朋友带来一定的帮助。 说明(必须的):这里的Action委托指的是委托定义中含有Action关键字的一类委托。我们知道这样的一类委托包括:“Action 委托”(就是怕和你混淆了),“

三五月儿的专栏 3447

sap 新增科目表_SAP系统中四大科目表的总结

操作科目表定义-OB13 2国家科目表定义-OB13 3集团科目表定义-OB13 4合并科目表(ECCS)定义-CX10 4分配操作科目表到公司代码-OB62 5分配国家科目表到公司代码-OB62 6分配集团科目表到操作科目表-OB13 6分配集团科目表到合并科目表-CXNF 7Operation 8定义集团科目表的科目-FSP0 8定义国家科目表的科目-FSP0 8定义操作科目表的科目-FSP0...

weixin_39585463的博客 1721

.NET Framework中自带的泛型委托Action

Action是.NET Framework中自带的泛型委托,可以接收一个或多个输入参数,但不返回任何参数,可传递至多16种不同类型的参数类型。在Linq的一些方法上使用的比较多。

风清扬的专栏 1017

(秋招)vins中的光流法

那么下一层基于这个初值也会得到一个解,就这样进行迭代,直到达到金字塔的最底层,也即第0层,就是原始分辨率的那张图片,此时光流法就会给出一个速度值,这个值是比较可靠的(相比对原始图片直接使用光流法来说)。2.小运动,这个也必须满足,就是时间的变化不会引起位置的剧烈变化,这样灰度才能对位置求偏导(换句话说,小运动情况下我们才能用前后帧之间单位位置变化引起的灰度变化去近似灰度对位置的偏导数),这也是光流法不可或缺的假定。可以看到光流法是来估计物体运动的(估计的是物体运动的速度,根据速度再计算相对应的特征点)。

努力coding 651

免费升级哨兵2号分辨率!用SRCNN深度学习模型实现10米→2.5米超分重建

本文详细介绍了如何利用SRCNN深度学习模型,将哨兵2号遥感影像的分辨率从10米免费提升至2.5米。文章提供了从数据准备、模型训练到部署应用的全流程实战指南,旨在通过AI应用技术,为农业监测、城市规划等领域提供更高精度的影像数据支持。

coffee的博客 523

.net Core学习之控制器中Action概述

前段时间一直在做Asp mvc 迁移到Asp net mvc Core中的采坑,头发掉了不少。现在我要准备记录一下这些坑: 做过asp net 都知道 我们在action中通常返回的是 JsonResult,ActionResult等,迁移过程中需要将System.web.mvc一致改为Microsoft.AspNetCore.Mvc 且返回的类型都改为IActionResult: 接下来我来详细说一下IActionResult的使用: 2-1控制器 2-1-1 概述 在MVC Web框架中,路由

丘鸣山的博客 2833

Type-C快充移动电源芯片避坑指南:IP5356配置全流程(支持PD3.0)

本文详细解析了英集芯IP5356芯片在Type-C快充移动电源中的应用,提供了从芯片选型、原理图设计、PCB布局到PD协议调试的全流程实战指南。文章重点剖析了如何避免散热、EMI及协议握手等常见设计陷阱,并分享了量产前的关键测试验证方法,旨在帮助硬件开发者高效打造稳定可靠的快充产品。

weixin_29235525的博客 848

C# 简述委托,Func与Action委托。 他们之前有什么区别?

C#中的委托机制:Func、Action与自定义委托 摘要: C#提供了三种委托机制实现方法回调:1)自定义Delegate需明确定义签名,适用于事件等需明确语义的场景;2)Func代表有返回值的方法,最后一个泛型参数为返回类型;3)Action表示无返回值(void)的方法。现代开发中优先使用Func和Action,它们作为.NET内置委托可减少代码量,Func适用于需要返回值的计算逻辑(如LINQ),Action适用于执行操作(如异步回调)。三者核心区别在于:返回值要求(Action必须无、Func必须

ultramand的博客,重生之我在cad上二次开发猛猛敲C#代码~ 1234

CryoEM - 使用 ChimeraX 工具 操作 冷冻电镜的 MRC 密度图(Density Map) 教程

由冷冻电镜 CryoSparc 软件所生成的 Volume,需要观察其内部结构,建议使用 ChimeraX 进行操作。

AGI 4959

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

C# 委托、Action 和 Func 详解:从概念到实战

本文系统介绍了C#中的三种委托机制:自定义委托、Action和Func泛型委托。通过完整代码示例展示了它们的核心概念、使用场景和区别:自定义委托提供灵活性但代码冗长;Action用于无返回值方法,Func用于有返回值方法;Lambda表达式可简化委托实例化。文章建议优先使用Action和Func配合Lambda表达式,仅特殊需求时采用自定义委托,并强调了多线程环境下的线程安全问题。这些委托机制在异步编程、事件处理和函数式编程等场景中发挥重要作用,掌握它们能显著提升C#开发效率。

德仔 391

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

*C# 中的 Action 和 Func 委托

Action和Func是.NET框架中两种常用的委托类型,分别用于封装不同功能的方法。Action用于无返回值的操作(如执行命令),Func用于有返回值的计算(如数据查询)。它们的优势在于标准化方法签名、提高代码通用性和灵活性,是事件处理、LINQ查询等场景的基础。最佳实践包括优先使用内置委托、控制参数数量、避免过度抽象等。注意当参数过多时应改用参数对象封装,在异步编程中需使用专门的Task委托类型。合理使用这两种委托能显著提升代码的可读性和可维护性。

leohu0723的博客 746

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

.NET使用Action及Func泛型委托

来自:http://www.csharpwin.com/csharpspace/13432r2726.shtml 委托,在C#编程中占有极其重要的地位,委托可以将函数封装到委托对象中,并且多个委托可以合并为一个委托,委托对象则可以像普通对象一样被存储、传递,之后在任何时刻进行调用,因此,C#中函数回调机制的实现基本上依赖于委托。C#的delegate关键字用于声明委托,它具有将声明委托类

码农 1062

Action和Func

在深入Action和Func之前,必须理解委托。定义:委托是一种类型安全的函数指针。它存储对一个或多个方法的引用。本质:委托是一个类,它定义了方法的签名(返回类型和参数列表)。任何与该签名匹配的方法都可以被赋值给这个委托变量。作用将方法作为参数传递:实现高阶函数和回调机制。事件处理:事件的底层就是基于委托实现的。定义回调方法:例如,在异步操作完成时执行某个方法。Action和Func就是 .NET 为我们预先定义好的、最常用的两种委托“模板”。Action是一个委托,它封装一个没有返回值(即返回。

DU9999999的博客 996

C#委托与函数式编程:从Action/Func到柯里化实战

在C#编程中,委托是实现回调、事件处理和异步操作的核心机制,它允许将方法作为参数传递,极大地提升了代码的灵活性和模块化。其原理是通过类型安全的函数指针封装方法调用,支持同步与异步执行模式。这一技术价值在于解耦调用者与被调用者,促进代码复用和可测试性,广泛应用于事件驱动架构、LINQ查询以及任务调度等场景。匿名方法和Lambda表达式作为委托的简洁语法糖,进一步简化了代码书写,而泛型委托Action和Func则提供了标准化的契约,成为现代C#开发的基础构件。在此基础上,函数式编程思想如柯里化(Currying

weixin_33910759的博客 360

C#中Func与Action的理解及其lambda表达式的写法

委托,在C#编程中占有极其重要的地位,委托可以将函数封装到委托对象中,并且多个委托可以合并为一个委托,委托对象则可以像普通对象一样被存储、传递,之后在任何时刻进行调用,因此,C#中函数回调机制的实现基本上依赖于委托。这些泛型委托分为Func、Action中,它们借助于泛型特性,可以替代C#中几乎所有的委托类型,也就是说一般情况下,在我们的程序中不必再声明任何新的委托类型,就可以包装所有的函数了。//********************************lambda表达式的写法示例。

u011555996的博客 3252

C#委托进阶:Action/Func与柯里化实战指南

在C#编程中,委托作为类型安全的函数指针,是实现回调、事件处理和函数式编程的核心机制。其原理是通过定义方法签名模板,允许将方法作为参数传递或赋值给变量,从而实现了代码的灵活解耦。这一技术价值在于提升了代码的模块化和可复用性,尤其在处理异步操作、事件驱动架构以及LINQ查询等场景中不可或缺。随着语言发展,匿名方法和Lambda表达式进一步简化了委托的使用,而泛型委托Action和Func则标准化了常见函数签名的声明。在这些基础之上,柯里化技术通过将多参数函数转化为单参数函数链,实现了参数复用和函数组合,为构建

weixin_30482383的博客 416

【.net6第二章】委托与事件

委托是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用。在实例化委托时,你可以将其实例与任何具有兼容签名和返回类型的方法相关联。跟方法有点类似,有参数有返回值,拥有关键字delegate,是一种特殊的访问。委托的本质是个一个类,继承自特殊类MulticastDelegate(无法继承),MulticastDelegate继承自Delegate类。委托可以通过new实例化,要求传递一个和这个委托的参数和返回值完全匹配的方法。//初始化关联信息//学校公告发布者Id = 111,

CZ_TyT的博客 2595

C#.Net筑基-解密委托与事件

委托是一种用来包装方法的特殊类型,可以将方法包装为对象进行传递、调用,类似函数指针。delegate关键字用来定义一个委托类型,语法类似方法申明,可以看做是一个“方法签名模板”,和方法一样定义了方法的返回值、参数。用delegate定义的委托是一个类,继承自 System.MulticastDelegate、System.Delegate,“方法名”就是委托类型的名称。委托的使用同其他普通类型,实例指向一个方法的引用,该方法的申明和委托定义的“方法签名模板”须匹配(支持协变逆变。

李赛赛的专栏 1471

C# 中的 Func 委托详解

1.Func的定义与基础用法Func​输入参数表示方法的输入参数类型(最多 16 个)。​返回值TResult表示方法的返回值类型。示例// 定义一个接受两个整数参数并返回字符串的 Func// 返回 "8"应用场景​动态调用方法:将方法作为参数传递,例如在算法中注入自定义逻辑。​LINQ 查询:LINQ 的SelectWhere等方法依赖Func实现数据转换和过滤。

品质生活,极致编程。 3112

C#之Func委托

Func是.NET框架中定义的一个泛型委托类型,位于System命名空间下。ininoutFunc可以有1到16个输入参数最后一个类型参数始终是返回类型in关键字表示参数是按引用传递但只能由调用方修改(协变)out关键字表示返回类型是按引用传递但只能由被调用方修改(逆变)Func提供了类型安全的回调机制是LINQ查询的基础支持从简单到复杂的各种转换和计算可以与异步编程无缝结合掌握Func委托的使用可以大大提高代码的灵活性和表达力,特别是在需要抽象算法或实现策略模式时。

Major_S的博客 868
上一篇: C# 反射(Reflection)超全解析
下一篇: 23 种设计模式分类与核心解析
bugcome_com
博客等级 码龄3年 32粉丝 131原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bugcome_com

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值