C# Callback思维
方式一、用委托作为形参,把结果传回实参
方式二、通过接口实现
方式三、通过事件关联,适用桌面应用程序
方式四、子窗体调用父窗体的函数(委托)
方式一、用委托作为形参,把结果传回实参
public partial class index : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Child chld = new Child();
chld.GetURL((url) =>
{
Response.Write(url);
//取得结果:http://microsoft-zh.cn
});
}
}
public class Child
{
//创建委托
public delegate void GetURLDelegate(string url);
public void GetURL(GetURLDelegate func)
{
func("http://microsoft-zh.cn");
}
}
方式二、通过接口实现
public partial class index : System.Web.UI.Page, ILoginCallback
{
protected void Page_Load(object sender, EventArgs e)
{
Child chld = new Child();
chld.GetURL(this);
}
public void OnGetURL(string url)
{
Response.Write(url);
//取得结果:http://microsoft-zh.cn
}
}
public class Child
{
public void GetURL(ILoginCallback callback)
{
callback.OnGetURL("http://microsoft-zh.cn");
}
} public interface ILoginCallback
{
/// <summary>
/// 接口函数
/// </summary>
void OnGetURL(string url);
}
方式三、通过事件关联,适用桌面应用程序
public partial class Form1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{ } Form2 chld = new Form2();
protected void Button1_Click(object sender, EventArgs e)
{
chld.AuthReady += new AuthEventHandler(chld.OnAuthReady);
}
}
public partial class Form2 : System.Web.UI.Page
{
// 事件
public event AuthEventHandler AuthReady;
protected void Button2_Click(object sender, EventArgs e)
{
if (AuthReady != null)
{
AuthEventArgs args = new AuthEventArgs();
args.user_id = 1;
args.user_name = "micro";
AuthReady(this, args);
}
}
public void OnAuthReady(object sender, AuthEventArgs e)
{
Console.Write(e.user_name);
}
}
//委托事件
public delegate void AuthEventHandler(object sender, AuthEventArgs e);
public class AuthEventArgs : EventArgs
{
public int user_id { get; set; }
public string user_name { get; set; }
}
方式四、子窗体调用父窗体的函数(委托)
1、子窗体Form2
public partial class Form2 : Form
{
// 申明委托,与父窗体方法类型相同
public delegate string FunDelegate(int a);
// 用来接收父窗体方法的委托变量
public FunDelegate funDelegate;
private void button1_Click(object sender, EventArgs e)
{
if (funDelegate != null)
{
// 调用方法
funDelegate(2);
}
}
}
2、父窗体Form1
private void Form1_Load(object sender, EventArgs e)
{
Form2 frm2 = new Form2();
//父窗体的方法传给子窗体
frm2.FunDelegate = Fun;
frm2.Show();
}
// 父窗体的方法
private string Fun(int a)
{
return "我是主窗体方法";
}
C# Callback思维的更多相关文章
- 做一个有产品思维的研发:Scrapy安装
每天10分钟,解决一个研发问题. 如果你想了解我在做什么,请看<做一个有产品思维的研发:课程大纲>传送门:https://www.cnblogs.com/hunttown/p/104909 ...
- vue源码逐行注释分析+40多m的vue源码程序流程图思维导图 (diff部分待后续更新)
vue源码业余时间差不多看了一年,以前在网上找帖子,发现很多帖子很零散,都是一部分一部分说,断章的很多,所以自己下定决定一行行看,经过自己坚持与努力,现在基本看完了,差ddf那部分,因为考虑到自己要换 ...
- 前端面试送命题(二)-callback,promise,generator,async-await
前言 本篇文章适合前端架构师,或者进阶的前端开发人员:我在面试vmware前端架构师的时候,被问到关于callback,promise,generator,async-await的问题. 首先我们回顾 ...
- PowerBuilder编程新思维2:嵌入(Thread多线程)
PowerBuilder编程新思维2:嵌入(Thread多线程) 在PB中使用多线程,在网上有大量的文章介绍.不过深入研究并试着给出更易用的模型的,目前还只有"路人甲cw"的一篇& ...
- 对比jQuery和AngularJS的不同思维模式
jQuery是dom驱动,AngularJS是数据驱动,这里有一篇文章阐述的非常好,建议看看 本文来自StackOverFlow上How do I “think in AngularJS” if I ...
- 【原创】分布式之数据库和缓存双写一致性方案解析(三) 前端面试送命题(二)-callback,promise,generator,async-await JS的进阶技巧 前端面试送命题(一)-JS三座大山 Nodejs的运行原理-科普篇 优化设计提高sql类数据库的性能 简单理解token机制
[原创]分布式之数据库和缓存双写一致性方案解析(三) 正文 博主本来觉得,<分布式之数据库和缓存双写一致性方案解析>,一文已经十分清晰.然而这一两天,有人在微信上私聊我,觉得应该要采用 ...
- 原生JS中 callback,promise,generator,async-await 的简介
callback,promise,generator,async-await 的简介 javascript异步的发展历程. ES6 以前: 回调函数(callback):nodejs express ...
- 2019年Java并发精选面试题,哪些你还不会?(含答案和思维导图)
Java 并发编程 1.并发编程三要素? 2.实现可见性的方法有哪些? 3.多线程的价值? 4.创建线程的有哪些方式? 5.创建线程的三种方式的对比? 6.线程的状态流转图 7.Java 线程具有五中 ...
- 18道kafka高频面试题哪些你还不会?(含答案和思维导图)
前言 Kafka是最初由Linkedin公司开发,是一个分布式.支持分区的(partition).多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处 ...
随机推荐
- js----DOM对象(事件)
节点操作: 创建节点:var ele_a = document.createElement('a'); 添加节点:ele_parent.appendChild(ele_img); 删除节点:ele_p ...
- (八)CXF添加自定义拦截器
前面我们说到CXF添加内置的拦截器,今天的话,我们来讲下如何添加自定义拦截器: 我们的实例是客户端访问服务端webservice接口要加权限认证. 我们思路先说下.我们可以通过在SOAP消息的Head ...
- 性能测试三十九:Jprofiler分析CPU过高和响应时间长的问题
使用Jprofiler监控分析案例 一.cpu负载过高:http://localhost:8080/PerfTeach/CpuTopServlet?id=1 cpu消耗高的可能原因1.使用了复杂的算法 ...
- ngrinder的简介与基本使用(转载:https://www.jianshu.com/p/f336180806cc)
nGrinder简介 nGrinder是基于Grinder开源项目,由NHN公司的开发团队进行了重新设计和完善.nGrinder是一款非常易用,有简洁友好的用户界面和controller-agent分 ...
- 【APUE | 08】进程控制
函数fork 博文链接: 1. 代码示例: #include "apue.h" ; char buf[] = "a write to stdout\n"; in ...
- 各种浏览器下的页面元素xpath获取方法
参考链接: http://blog.sina.com.cn/s/blog_654c6ec70100v1i2.html
- hdu 1272 小希的迷宫【并查集】
<题目链接> 小希的迷宫 Problem Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的 ...
- Linux学习之常用权限管理命令(二)
(一)常用权限管理命令 (1)chmod命令 (2)chown (3)chgrp (4)umask (一)常用权限管理命令 (1)chmod命令 命令名称:chmod命令英文原意:change the ...
- Flutter常用组件(Widget)解析-ListView
一个可滚动的列表组件 不管在哪,列表组件都尤为重要和常用. 首先来看个例子: import 'package:flutter/material.dart'; void main () => ru ...
- cmake使用笔记
目录 cmake使用笔记 基本使用方法 相较于makefile的优点 常用语法 cmake_minimum_required project PROJECT_SOURCE_DIR set includ ...