C#委托(1基础)

C#中委托的+=和-=深入研究 主要介绍了C#中委托的+=和-=深入研究,本文深入研究+=和-=在执行时都做了哪些事情,加深对C#委托的理解和使用,需要的朋友可以参考下 立即下载

文章不定时更新,有问题的话欢迎各位dalao指正。

什么是委托

委托是拥有一个或多个方法的引用类型,委托可以将可执行的代码从一个方法传递到另一个方法。
官方文档中说:委托表示对具有特定参数列表和返回类型的方法的引用
看下面这个例子:

//第一步、声明委托类型
    delegate void MyDel(int Value);
    
    class Program
    {
        void oodNumber(int Value) { 
            Console.WriteLine($"{Value} is ood Number!"); 
        }

        void evenNumber(int Value) { 
            Console.WriteLine($"{Value} is even Number!"); 
        }

        static void Main(string[] args)
        {

            Program program = new Program();
            //2、声明委托变量
            MyDel myDel;
            //创建一个随机数,范围在0到99之间
            Random random = new Random();
            int randomValue = random.Next(99);

            //3、创建委托对象,将符合条件的委托对象赋值给myDel变量
            myDel =(randomValue % 2 == 0) 
                ? new MyDel(program.evenNumber) 
                : new MyDel(program.oodNumber);
            //4、调用委托
            myDel(randomValue);

        }
    }

上面的代码可以对随机生成的0到99之间的整数进行判断,判断该整数是奇数还是偶数。
输出如下:

42 is even Number!

上面的代码中,

第二步声明的委托变量myDel,这只是产生了一个委托对象的引用,而并没有创建对象,只是创建了一个含有委托对象引用的变量。
在第三步中,如果随机数的值为偶数,那么会创建program.evenNumber这个委托对象,然后将其赋值给这个委托变量myDel。
第四部调用委托的时候,委托变量myDel的持有方法(evenNumber或oodNumber)被执行

委托的概述

官文中这样描述:
委托具有以下属性:

  • 委托类似于 C++ 函数指针,但委托完全面向对象,不像 C++ 指针会记住函数,委托会同时封装对象实例和方法。
  • 委托允许将方法作为参数进行传递。
  • 委托可用于定义回调方法。
  • 委托可以链接在一起;例如,可以对一个事件调用多个方法。
  • 方法不必与委托类型完全匹配。 (变体:协变,逆变)
  • 使用 Lambda 表达式可以更简练地编写内联代码块。 Lambda 表达式(在某些上下文中)可编译为委托类型。

具体的用法会在之后的文章中说明,该文章讲解基础用法。

委托和类一样,是用户自定义的类型,但类表示的是数据和方法的集合,而委托则持有一个或多个方法,以及一系列预定义操作。
使用委托的操作步骤:

  • 1、声明委托类型
  • 2、使用1中声明的委托类型声明一个委托变量
  • 3、创建委托类型的对象,把它赋值给委托变量
  • 4、可以给委托对象增加其他的方法
  • 5、调用委托

我们可以把delegate看做一个包含有序方法列表的对象,这些方法具有相同的签名(参数)和返回类型
方法的列表成为调用列表
委托保存的方法可以来自任何类或结构,但需要满足
(1)委托的返回类型与方法的返回类型相匹配
(2)委托的签名与方法的签名相匹配(包括ref和out关键字,这两个关键字会在后面的文章进行补充说明)

  • 委托{
    调用列表{方法1、方法2、…}
    }

声明委托类型

格式:

delegate void MyDel ( int x );

delegate为声明委托的关键字,
void为返回类型,
MyDel为委托的类型名,
括号里面包含的叫做签名。

其中返回类型和签名指定了委托接受方法的形式。

委托虽然看上去和方法的声明相同,但是他不需要在类的内部进行声明,因为它是类型声明

创建委托对象

格式:

MyDel delVar;

MyDel是刚才声明的委托类型,
delVar是声明的变量。

创建委托对象的两种方式:
我们先声明两个方法,一个是实例方法,一个是静态方法:

class myInstObj
    {
        public void MyM1(int x)
        {
            Console.WriteLine("实例方法MyM1被调用");
        }
    }
static class SClass
    {
        public static void OtherM2(int x)
        {
            Console.WriteLine("实例方法OtherM2被调用");
        }
    }

第一种方法:使用new运算符的对象创建表达式

MyDel delVar;
myInstObj m = new myInstObj();
delVar = new MyDel(m.MyM1);

m.MyM1是实例方法

MyDel deVar;
deVar = new MyDel(SClass.OtherM2);

SClass.OtherM2是静态方法
第二种,快捷语法方式:与上面的方式等价

MyDel delVar;
myInstObj m = new myInstObj();
delVar = m.MyM1;
MyDel deVar;
deVar = SClass.OtherM2;

使用这种快捷语法是因为方法名称和其相应的委托类型之间存在隐式转换。
声明多个委托变量的时候可以以,分隔:

MyDel delVar,deVar;

我们可以使用初始化语法在同一条语句中创建变量和初始化对象:

myInstObj m = new myInstObj();
MyDel delVar = new MyDel( m.MyM1 );
MyDel deVar = new MyDel( SClass.OtherM2 );

再使用快捷语法:

myInstObj m = new myInstObj();
MyDel delVar = m.MyM1;
MyDel deVar = SClass.OtherM2 ;

这种快捷语法的方式可以减少很多的代码量

给委托赋值

MyDel delVar;
delVar = m.MyM1;
delVar = SClass.OtherM2;

在上面的代码中,我们给委托变量多次赋值,但是实际上,只有最后赋值的委托对象才能被委托变量引用,而旧的委托对象会被垃圾回收器回收。(也就是说委托变量只会引用新赋值的委托变量)

组合委托

上面的委托中,在委托的调用列表中都只有一个方法,而委托是可以使用运算符进行组合委托的:

MyDel delA = m.MyM1;
MyDel delB = SClass.OtherM2;
//组合调用列表
MyDel delC = delA + delB;

委托是恒定的,委托对象在被创建之后不能再改变
上面的代码中只是在delC中创建了具有组合调用列表的新委托,而delA和delB未改变

给委托添加方法

我们创建一个类

class Inst
    {
        public void m1(int v)
        {
            Console.WriteLine("m1");
        }
        public void m2(int v)
        {
            Console.WriteLine("m2");
        }
        public void m3(int v)
        {
            Console.WriteLine("m3");
        }
    }
Inst inst = new Inst();
MyDel delVar = inst.m1;
delVar += inst.m2;
delVar += inst.m3;

上面的代码中使用+=运算符给委托添加了两个方法,而实际上,由于委托是恒定的所以委托调用列表中添加三个方法后的结果实际上是变量指向了一个全新的委托。

在+=时,实际上是创建了一个新的委托,调用列表是+=号左边 的委托加上右面方法的组合,然后把新的委托赋值给delVar。

每次添加方法,都会在委托的调用列表中创建一个新的元素。

从委托中移除方法

delVar -= inst.m3;

与添加方法相同,实际上也是创建新委托,而新的委托是旧委托的copy版,只是没有已经被移除方法的引用。
在-=时需要注意,是从掉用哪个列表的最后一个开始向前搜索,删除第一个搜索到的方法,如果删除空委托则会抛出异常。

调用委托

MyDel delVar = inst.m1;
delVar += inst.m2;
delVar += inst.m3;
delVar(1);

输出

m1
m2
m3

如果一个方法在调用列表中出现多次,当委托被调用时,每次在列表中遇到这个方法他都会被调用一次。

MyDel delVar = inst.m1;
delVar += inst.m2;
delVar += inst.m1;
delVar(1);

输出

m1
m2
m1

调用带返回值的委托

如果委托中有返回值并且在调用列表中有一个以上的方法,调用列表中最后一个方法返回的值就是委托调用返回的值,调用列表中所有其他方法的返回值都会被忽略

调用带引用参数的委托

先介绍一下ref:
在方法的参数列表中使用 ref 关键字时,它指示参数按引用传递,而非按值传递。
ref 关键字让形参成为实参的别名,这必须是变量。 换而言之,对形参执行的任何操作都是对实参执行的。
比如:

class A { 
        public void add(ref int a)
        {
            a++;
        }
    }


    class reftest
    {

        static void Main()
        {
            A a = new A();
            int b = 0;
            a.add(ref b);
            Console.WriteLine(b);
        }
        
        
    }

输出:

1

可以看到从add方法中传进去的参数是实参,在add方法中的b++改变的原本b的值。
使用ref参数的时候,方法定义和调用方法必须都使用ref关键字
介绍完ref的用法之后,再来看带有引用参数的委托:

delegate void MyDel(ref int X);

    class reftest
    {
        public void Add2(ref int x) { x += 2; }
        public void Add3(ref int x) { x += 3; }

        static void Main()
        {
            reftest re = new reftest();
            MyDel md = re.Add2;
            md += re.Add3;
            md += re.Add2;
            int x = 5;
            md(ref x);
            Console.WriteLine($"Value:{x}");
        }
        
        
    }

输出:

Value:12

在调用委托列表中的下一个方法时,参数的新值(不是初始值)会传给下一个方法。

匿名方法

匿名方法是在初始化委托的时候内联(inline)声明的方法
对于方法只会被使用一次的委托,可以使用匿名方法来简化写法。
正常写法:

class NoName
    {
        public static int Add20(int x)
        {
            return x + 20;
        }
        delegate int OtherDel(int InParam);
        static void Main()
        {
            OtherDel del = Add20;
            Console.WriteLine($"{del(5)}");
            Console.WriteLine($"{del(6)}");
        }
    }

匿名方法:

class NoName
    {
        
        delegate int OtherDel(int InParam);
        static void Main()
        {
            OtherDel del = delegate(int x) { return x + 20; };
            Console.WriteLine($"{del(5)}");
            Console.WriteLine($"{del(6)}");
        }
    }

二者输出相同

25
26

使用匿名方法

  • 声明委托变量时作为初始化表达式
  • 组合委托时在赋值语句的右边
  • 为委托增加事件时在赋值语句的右边

语法

delegate (Parameters) {ImplementationCode}

delegate:关键字
Parameters:参数列表
ImplementationCode:语句块

关于params参数:
如果委托声明的参数列表中包含了params参数,那么匿名方法的参数列表将忽略params关键字,也就是说在声明的时候可以省略params。

lambda表达式

在匿名方法语句中delegate关键字是可以省略的,我们可以将匿名方法转换成lambda表达式:

MyDel del = delegate(int x){return x+1;};//匿名方法
MyDel del = (int x)=>{return x+1;};//lambda

语句变得更加简洁,而lambda表达式还可以进一步进行简化:

MyDel del = x=>{return x+1;};

lambda可以让我们省略类型参数(int),使其变为隐式类型(省略类型的参数列表);
如果只有一个隐式类型参数,我们可以省略参数周围的圆括号;

同时如果语句中只包含一个返回语句,我们可以把箭头后面的语句块替换为返回值表达式;

MyDel del = x => x+1 ;

参考书籍《C#图解教程》。

Windows下飞桨PaddlePaddle 2.6.1 GPU版环境搭建全攻略(含CUDA 11.7配置避坑指南) 本文详细介绍了在Windows系统下搭建飞桨PaddlePaddle 2.6.1 GPU版环境的完整流程,特别针对CUDA 11.7和cuDNN的安装提供了避坑指南。从Anaconda环境配置、CUDA Toolkit安装到飞桨GPU版的验证,手把手帮助开发者高效完成深度学习环境搭建,解决常见问题并优化性能。 阅读详情

相关推荐

从零开始:手把手教你设计DP接口电路(含原理图实战)

本文是一份详尽的DisplayPort接口电路设计实战指南。文章从DP接口的核心架构与HDMI的差异讲起,手把手解析了高速差分对、AUX辅助通道、热插拔检测等关键模块的原理图设计要点,并提供了一个完整的DP Source端原理图实例,最后总结了PCB布局与信号完整性的核心考量,旨在帮助硬件工程师高效、稳定地完成DP接口电路设计。

transformer2023的博客 734

C#事件(基础)

C#委托

Javaigood的博客 2411

(RegionProposal Network)RPN网络结构及详解

RPN(RegionProposal Network)区域生成网络 Faster-RCNN的核心。在这里整理。 1.anchors。 特征可以看做一个尺度51*39的256通道图像,对于该图像的每一个位置,考虑9个可能的候选窗口:三种面积{128,256,512}×{128,256,512}×三种比例{1:1,1:2,2:1}{1:1,1:2,2:1}。这些候选窗口称为anchors...

凹酱的DEEP LEARNING 19万+

C#事件详解

事件,事件案例

鲤籽鲲的博客 1万+

Keysight ADS新手必看:3分钟搞定TDR模拟的保姆级教程(附差分信号设置技巧)

本文为Keysight ADS新手提供TDR模拟的保姆级教程,详细介绍了从基础环境准备到差分信号设置的全流程。通过内置模板调用、待测器件连接和仿真结果解读,帮助用户快速掌握TDR模拟技术,特别包含差分信号配置技巧,提升信号完整性分析效率。

weixin_30872157的博客 196

IPD的分析工具与模型(十六)CBB公用基础模块管理实现资源共享,缩短开发周期降低成本

CBB流程的开发环节,基于CBB规划中所识别和设计的CBB,进行CBB的详细设计(包括参数设计和接口设计),并最终实现CBB的落地开发。作为特殊类型的技术构件,CBB的开发流程,可沿用技术开发中的构件开发流程,具体包括概念、计划、开发和迁移等步骤,具体可参见前文的相关介绍。有了蓝图与架构设计,落地实施是关键攻坚。具体工作内容包括:具体工作内容包括:a. 以相似性、聚类、相对独行性、可组合、可扩展性、可维护性等原则为指导,按照产品的功能特征和业务类型,聚焦零散的功能点,形成功能模块,实现产品功能模块的划分;

Easyways1的博客 1378

C#中+=的用法

这里是C#事件绑定(注册、订阅)的特写用法,表示事件的处理程序集合中添加一个事件处理程序,它也有对应的-=来去掉之前+=的事件处理程序。那么现在可以得出这样的结论了无返回值的委托,你给它注册多少个方法,它就执行多少个方法,而有返回值的委托,同样注册多少个方法就执行多少个方法,但返回的是最后一个方法的返回值。无返回值的委托,你给它注册多少个方法,它就执行多少个方法,而有返回值的委托,同样注册多少个方法就执行多少个方法,但返回的是最后一个方法的返回值。绕了一圈那么有返回值的委托,到底执行了么?...

weixin_41883890的博客 8093

通俗讲解清楚光线追踪中的蒙特卡洛积分

彻底讲解光线追踪中的蒙特卡洛积分

qq_37366618的博客 1243

C#中的委托和事件

说起委托和事件,以前也是看了又看,总也搞不清楚,今天看到一篇关于委托和事件的详解,所以来分析一下。 详情请看此处原文 什么是委托? 我们在使用高级语言的时候,都会遇到变量。当定义变量的时候,就会为这个变量指定类型。当调用方法的时候,将变量做为实参传进去,这样就完成了方法的调用。但是当实参是一另一个方法时,怎么用?这里就用到了委托 。因此委托的实际意义就是把方法作为另一个方法的参数。 举个例子(详情请点上方连接): public void GreetPeople(string name) { //

weixin_42834523的博客 451

CloudCompare如何进行二次开发?

CloudCompare源代码编译成功后,即可进行二次开发,可以通过修改源码或者制作插件实现二次开发。本文二次开发采用修改CloudCompare的源代码的方式,分别修改mainwindow.ui、mainwindow.h、mainwindow.cpp,实现扩展功能,克隆选中的点云。

【cacrle】的博客 5331

thinkphp6/8 - 实现评论区发表评论、回复评论功能数据库表设计与整个逻辑思路过程分析,tp5 评论盖楼等功能(附带源码稍加改造即可使用)

tp5评论区数据库表设计,tp5发表回复评论功能设计,thinkphp5如何做评论功能,tp5 php评论区实现发表回复删除评论,tp5评论区盖楼源码及数据表设计思路,thinkphp评论功能详细教程,thinkphp实现评论与回复功能,thinkphp实现文章评论和回复评论功能,tp5实现评论回复功能,thinkphp如何实现评论区,tp5网站PC移动端h5怎么做评论区发表留言及回复功能,thinkphp实现评论区插件,thinkphp评论区相互发表回复功能详细教程,thinkphp有没有评论区的组件插件

✅ 精选推荐文章 3159

C#委托基础1——委托基础

C#委托基础系列原于2011年2月份发表在我的新浪博客中,现在将其般至本博客。 委托和其委托的方法必须具有相同的签名。签名相同:1.参数类型相同 2.参数数量相同 3.返回值一致 <wbr></wbr> 例一 class Program { public delegate int MathMethod(int x, int y); ...

数据库天地 131

vs2017配置liblas库+测试代码

之前已经配置好pcl(vs2017配置pcl),可以单独配置liblas,也可以在原有pcl属性表的基础上继续配置

孙悟空 4023

ESP32隐藏无线电通路:用ADC引脚探测WiFi射频活动

在物联网与嵌入式开发中,ADC模拟采样是感知物理世界的常用手段,而WiFi、蓝牙等射频模块的发射行为往往会对采样产生意想不到的干扰。这种干扰并非简单的电源噪声,而是源于芯片内部寄生参数与天线效应形成的电磁耦合路径,它将高频能量转化为采样值的低频包络。理解这一原理,不仅有助于排查低功耗设备中的电压漂移问题,还能将其转化为一种低成本的环境射频活动探测器。通过配置ESP32的悬空ADC引脚,开发者无需额外射频前端即可监测2.4GHz信号的活动节奏,适用于无线节奏检测、产测辅助和电磁波教学等场景。本文从一次真实故障

weixin_34294649的博客 396

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

深度学习工具包 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# 委托基础1.0

在C# 1.0中提出了一种新特性叫作:委托。委托本质上一种类型。是对特定方法的抽象,定义委托后,可以将方法封装,把方法当参数,传递 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Dra...

weixin_30314631的博客 133

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

C#委托——基础1

  在面向对象的高级语言中,委托具有广泛的使用领域,当然在C#中,委托的使用方式与使用逻辑与其他编程语言相比大同小异,这里通过自学关于C#中委托的内容简略谈谈委托的使用语法与使用逻辑。   任何技术都是因需求而产生的,这里通过一个例子简单阐述委托需求的参数,以及在实现一个委托时,委托的定义,事件的定义,事件的订阅,传递参数,多播委托。首先说说委托需求的产生(在许多情况下都需要运用委托,书面上的定...

weixin_30438813的博客 107

C#基础1-事件和委托

委托简单理解为一个函数类型的变量(引用类型),表示一个方法的引用。官网解释 delegate定义委托类型定义对应委托类型的处理函数 实例化委托类型的变量一个委托可以绑定多个事件处理函数使用委托变量,调用委托对应的所有事件处理函数接口(interface)是约束某个类应该具备那些功能的一个集合,约束了类应该具备那些方法,便于类的管理和扩展,使用接口还能解决类的单继承问题。委托(delegate)是方法的一个集合,使用委托可以对这个方法集合进行操作,如 += 。在以下情况中使用接口:在以下情况中使用委托:事件是

cocodeveloper 828

C# 1的核心基础之一——委托

C# 1的核心基础之一——委托 C# 1的核心基础之一——委托简单委托的构成合并和删除委托事件的简单讨论委托总结 简单委托的构成 声明委托类型; delegate void StringProcessor(string input); 为委托实例的操作找到一个恰当的方法 void PrintString(string x)完全符合要求 void Pri...

weixin_30835933的博客 82

c#1所搭建的核心基础之委托

本文将对c#1的委托进行详细探索 委托(delegate) 注 delegate:vt.委派代表;授权给;[法律]债务转移; 委托作用:在恰当的时间执行一系列操作 1.简单委托的构成 声明委托类型 必须有一个方法包含了要执行的代码 必须创建一个委托实例 必须调用委托实例 依次讨论各个步骤: ①声明委托类型 委托类型实际上只是参数类型的一个列表以及一个返回类型。...

weixin_30782331的博客 83

C#1所搭建的核心基础(一)-委托

委托在某种程度上提供了间接的方法。换言之,不需要直接指定一个行为,而是将这个行为用某种方式“包含”在一个对象中。这个对象可以象其他任何对象那样使用。在这个对象中,可以执行封装的行为。可以将委托类型看做只定义了一个方法的接口,将委托的实例看做实现了那个接口的一个对象。 委托的4个基本条件: 1)声明委托类型; 2)必须有一个方法包含了要执行的代码; 3)必须创建一个委托实例; 4)必须调用...

weixin_30451709的博客 66

C#基础知识1:C#中的委托、匿名函数Lambda表达式与回调

委托的使用 首先,大家肯定都知道委托是什么,但是到了具体的应用层面,大多数同学就不知道该如何应用了,但这并难不倒巨人微软,微软在.NET中为我们提供了几个非常贴心的并且可以直接应用于公共类的委托让我们使用。 通过使用这些微软为我们提供的委托,或许你能够更加深入的理解委托到底是如何应用,如何解耦代码的。 委托都用来干嘛 C#1.0版本,委托被主要用来处理事件 实现函数回调,例如List.FindA...

Gvision 1796

C#再识委托

从C#1到C#3逐步认识委托,由于C#4与C#5对委托改动并不大,故不作说明。 好久没看.NET了,一直在搞HybridAPP,都忘得差不多了,这也是自己从书中摘下笔迹,供日后翻阅。 C# 1 1.什么是委托 委托是一种定义方法签名的类型。当实例化委托时,您可以将其实例与任何具有兼容签名的方法相关联。 您可以通过委托实例调用方法。(MSDN) 委托类似于 C++函数指针,但它们是类型安全的 委托...

weixin_30731305的博客 108

2.C#1语言核心基础

C#1语言核心基础 本部分将重点讨论C#1语言中的几个核心基础,他们包括:委托、类型系统、值/引用类型 1.委托 委托类似与函数指针,是要在恰当的时间执行的一系列操作,如果代码想要执行操作,但不知道操作细节,就可以使用委托。 简单委托的构成 要执行一个委托必须满足一下4个条件 申明委托类型 创建一个方法包含要执行的代码 创建一个委托实例 调...

weixin_34187862的博客 82

C#基础—— Func 委托

C#基础—— Func 委托 1.什么是Func委托 Func是一种委托,这是在3.5里面新增的,2.0里面我们使用委托是用Delegate,Func位于System.Core命名空间下, Func<int,string> ,它其实就是一个C#内部已经定义好的委托类型,尖括号里是int是委托的参数类型,string是返回值类型,Func可以有很多个参数,无论有几个,最后一个固定是返回值...

qq_43121281的博客 1614

C#基础--委托(Delegate)

简单介绍C# 委托知识

five_s的博客 1万+
上一篇: Spring-IOC
下一篇: C#事件(基础)
吊云
博客等级 码龄6年 73粉丝 10原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值