C#网络编程中常用特性介绍
作者:.NET开发菜鸟 发布时间:2021-09-03 23:07:51
特性一:委托
委托是C#语言 * 有的概念,相当于C/C++中的函数指针,与C/C++中函数指针的不同之处是:委托是面向对象的、类型安全的和保险的,是引用类型。因此,对委托的使用要
“先定义、后声明,接着实例化、然后作为参数传递给方法,最后才能使用”。
1、定义委托使用关键字delegate:
delegate void SomeDelegate(type1 para1,......typen paran);
2、声明委托:
SomeDelegate d;
3、实例化委托:
d=new SomeDelegate(obj.InstanceMethod);
其中obj是对象,InstanceMethod是它的实例方法。
4、作为参数传递给方法
someMethod(d);
5、最后在此方法的实现代码中使用委托
private void someMethod(SomeDelegate someDelegate)
{
.....
//使用委托
someDelegate(arg1,arg2,....,argn);
......
}
通过委托SomeDelegate实现对方法InstanceMethod的调用,调用还必须有一个前提条件:方法InstanceMethod有参数且和定义SomeDelegate的参数一致,并且返回类型相同(本例中为void)。方法InstanceMethod的定义:
private void InstanceMethod(type1 para1,type2 para2,......,typen paran)
{
//方法体
.....
}
委托的实例化中的参数既可以是实例方法,也可以是静态方法。
使用委托实现“文字抄写员”的小程序,界面如下:
在下方文本框中编辑文字,勾选“书写到”组框中的“文本区1”和(或)“文本区2”复选框后单击“提交”按钮,程序会自动将文本框中的文字“抄写”到对应的用户勾选的文本区中去。
代码实现如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace DelegateDemo
{
public partial class FrmMain : Form
{
public FrmMain()
{
InitializeComponent();
}
//1、定义委托
private delegate void WriteToTextBox(string strTxt);
//2、声明委托
private WriteToTextBox writeToTextBox;
/// <summary>
/// 提交
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_OK_Click(object sender, EventArgs e)
{
if (chbOne.Checked)
{
gbJobOne.Text = "运行中......";
gbJobOne.Refresh();
txtJobOne.Clear();
//3、实例化委托
writeToTextBox = new WriteToTextBox(WriteTextBox1);
//4、将委托作为方法的参数进行传递
WriteText(writeToTextBox);
gbJobOne.Text = "任务1完成";
}
if (chbTwo.Checked)
{
gbJobTwo.Text = "运行中......";
gbJobTwo.Refresh();
txtJobTwo.Clear();
//3、实例化委托
writeToTextBox = new WriteToTextBox(WriteTextBox2);
//4、将委托作为方法的参数进行传递
WriteText(writeToTextBox);
gbJobTwo.Text = "任务2完成";
}
}
private void WriteText(WriteToTextBox writeMethod)
{
string strData = this.txt_Input.Text;
writeMethod(strData);
}
private void WriteTextBox1(string strTxt)
{
this.txtJobOne.Text = strTxt;
}
private void WriteTextBox2(string strTxt)
{
this.txtJobTwo.Text = strTxt;
}
/// <summary>
/// 窗体加载事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void FrmMain_Load(object sender, EventArgs e)
{
//设置文本框获取焦点
this.ActiveControl = this.txt_Input;
//this.txt_Input.Focus();
}
}
}
特性2:多线程
多线程的具体介绍请参考博文:https://www.jb51.net/article/238731.htm
使用多线程实现上一节的程序,代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;//引入多线程的命名空间
namespace DelegateDemo
{
public partial class FrmMain : Form
{
public FrmMain()
{
InitializeComponent();
}
//1、定义委托
private delegate void WriteToTextBox(string strTxt);
//2、声明委托
private WriteToTextBox writeToTextBox;
/// <summary>
/// 提交
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_OK_Click(object sender, EventArgs e)
{
//创建线程1
Thread thread1 = new Thread(new ThreadStart(ExecuteTsk1));
//启动线程1
thread1.Start();
//创建线程2
Thread thread2 = new Thread(new ThreadStart(ExecuteTsk2));
//启动线程2
thread2.Start();
}
private void ExecuteTsk1()
{
if (chbOne.Checked)
{
gbJobOne.Text = "运行中......";
gbJobOne.Refresh();
txtJobOne.Clear();
//3、实例化委托
writeToTextBox = new WriteToTextBox(WriteTextBox1);
//4、将委托作为方法的参数进行传递
WriteText(writeToTextBox);
gbJobOne.Text = "任务1完成";
}
}
private void ExecuteTsk2()
{
if (chbTwo.Checked)
{
gbJobTwo.Text = "运行中......";
gbJobTwo.Refresh();
txtJobTwo.Clear();
//3、实例化委托
writeToTextBox = new WriteToTextBox(WriteTextBox2);
//4、将委托作为方法的参数进行传递
WriteText(writeToTextBox);
gbJobTwo.Text = "任务2完成";
}
}
private void WriteText(WriteToTextBox writeMethod)
{
string strData = this.txt_Input.Text;
writeMethod(strData);
}
private void WriteTextBox1(string strTxt)
{
this.txtJobOne.Text = strTxt;
}
private void WriteTextBox2(string strTxt)
{
this.txtJobTwo.Text = strTxt;
}
/// <summary>
/// 窗体加载事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void FrmMain_Load(object sender, EventArgs e)
{
//设置文本框获取焦点
this.ActiveControl = this.txt_Input;
//允许跨线程调用
Control.CheckForIllegalCrossThreadCalls = false;
}
}
}
特性3:C#方法回调
C#回调的具体介绍请参照博文:https://www.jb51.net/article/238731.htm#_label3
使用委托、多线程和C#的方法回调机制实现上一节的程序,代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;//引入多线程的命名空间
namespace DelegateDemo
{
public partial class FrmMain : Form
{
public FrmMain()
{
InitializeComponent();
}
//1、定义委托
private delegate void WriteToTextBox(string strTxt);
//2、声明委托
private WriteToTextBox writeToTextBox;
//定义并声明操作文本区1的回调
private delegate void WriteTxtJobOneCallBack(string strValue);
WriteTxtJobOneCallBack writeTxtJobOneCallBack;
//定义并声明操作文本区2的回调
private delegate void WriteTxtJobTwoCallBack(string strValue);
WriteTxtJobOneCallBack writeTxtJobTwoCallBack;
//定义并声明操作"任务1"分组框的回调
private delegate void ShowGroupOneCallBack(string strValue);
ShowGroupOneCallBack showGroupOneCallBack;
//定义并声明操作"任务2"分组框的回调
private delegate void ShowGroupTwoCallBack(string strValue);
ShowGroupOneCallBack showGroupTwoCallBack;
/// <summary>
/// 提交
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_OK_Click(object sender, EventArgs e)
{
//创建线程1
Thread thread1 = new Thread(new ThreadStart(ExecuteTsk1));
//启动线程1
thread1.Start();
//创建线程2
Thread thread2 = new Thread(new ThreadStart(ExecuteTsk2));
//启动线程2
thread2.Start();
}
private void ExecuteTsk1()
{
if (chbOne.Checked)
{
//3、实例化委托
writeToTextBox = new WriteToTextBox(WriteTextBox1);
//4、将委托作为方法的参数进行传递
WriteText(writeToTextBox);
//使用回调
this.gbJobOne.Invoke(showGroupOneCallBack, "任务1");
}
}
private void ExecuteTsk2()
{
if (chbTwo.Checked)
{
//3、实例化委托
writeToTextBox = new WriteToTextBox(WriteTextBox2);
//4、将委托作为方法的参数进行传递
WriteText(writeToTextBox);
//使用回调
this.gbJobTwo.Invoke(showGroupTwoCallBack, "任务2");
}
}
/// <summary>
/// 执行自定义委托
/// </summary>
/// <param name="writeMethod"></param>
private void WriteText(WriteToTextBox writeMethod)
{
string strData = this.txt_Input.Text;
writeMethod(strData);
}
/// <summary>
/// 给文本区1赋值
/// </summary>
/// <param name="strTxt"></param>
private void WriteTextBox1(string strTxt)
{
//使用回调
this.txtJobOne.Invoke(writeTxtJobOneCallBack, strTxt);
}
/// <summary>
/// 给文本区2赋值
/// </summary>
/// <param name="strTxt"></param>
private void WriteTextBox2(string strTxt)
{
//使用回调
this.txtJobTwo.Invoke(writeTxtJobTwoCallBack, strTxt);
}
/// <summary>
/// 窗体加载事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void FrmMain_Load(object sender, EventArgs e)
{
//设置文本框获取焦点
this.ActiveControl = this.txt_Input;
//实例化回调
writeTxtJobOneCallBack = new WriteTxtJobOneCallBack(WriteToTextJobOne);
writeTxtJobTwoCallBack = new WriteTxtJobOneCallBack(WriteToTextJobTwo);
showGroupOneCallBack = new ShowGroupOneCallBack(ShowGroupOne);
showGroupTwoCallBack = new ShowGroupOneCallBack(ShowGroupTwo);
}
/// <summary>
/// 操作文本区1的回调要执行的方法
/// </summary>
/// <param name="strValue"></param>
private void WriteToTextJobOne(string strValue)
{
this.txtJobOne.Text = strValue;
}
/// <summary>
/// 操作文本区2的回调要执行的方法
/// </summary>
/// <param name="strValue"></param>
private void WriteToTextJobTwo(string strValue)
{
this.txtJobTwo.Text = strValue;
}
/// <summary>
/// 操作"任务1"分组框的回调要执行的方法
/// </summary>
/// <param name="strValue"></param>
private void ShowGroupOne(string strValue)
{
this.gbJobOne.Text = strValue;
}
/// <summary>
/// 操作"任务2"分组框的回调要执行的方法
/// </summary>
/// <param name="strValue"></param>
private void ShowGroupTwo(string strValue)
{
this.gbJobTwo.Text = strValue;
}
}
}
来源:https://www.cnblogs.com/dotnet261010/p/6206068.html


猜你喜欢
- 本文实例为大家分享了WPF实现半圆形导航菜单的具体代码,供大家参考,具体内容如下实现效果如下:思路:扇形自定义控件组合成半圆型菜单,再通过c
- drawerLayout是Support Library包中实现了侧滑菜单效果的控件,可以说drawerLayout是因为第三方控件如Men
- 1. 认识ZoneZone像一个沙盒,是我们代码执行的一个环境。我们的main函数默认就运行在Root Zone当中。子Zone的构造有点像
- 前言你是否在onStart()启动过某项任务却忘记在onStop()中取消呢?人不是机器,难免会有错漏。就算老手不会犯错,也不能保证新人不会
- 享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供
- 1.Thread的构造方法package threadAPI;public class CreateThread { publi
- 一、添加数据1、在主表中添加从表数据在景点的住宿集合(Lodgings)中增加一个度假区(Resort)var dest = (from d
- 前言 ChatGPT已经组件放开了,现在都可以基于它写插件了。但是说实话我还真没想到可以用它干嘛,也许
- 今天在使用Nlog的时候,发现了一个之前没注意的问题。以前,我的app配置文件都是这么写的,当然配置比较多的时候会改用xml。 如
- 员工管理系统要求如下:通过面向对象的编程思想,实现员工信息的增删改查,存储结构为数组。限定数组长度为100。实现页面:添加员工查找员工修改员
- 实现需求:两个线程交替打印1,0,打印10轮java多线程口诀:高内聚,低耦合线程操作资源类判断干活通知防止虚假唤醒方式一:使用synchr
- 上篇文章给大家介绍了在idea中将创建的java web项目部署到Tomcat中的过程图文详解,可以参考下,本文给大家继续介绍如何在IDEA
- FreeMarker 是一个采用 Java 开发的模版引擎,是一个基于模版生成文本的通用工具。 它被设计用来生成 HTML Web 页面,特
- 前言 随着Java生态愈发庞大,各种各样的新技术层出不穷,这也给大家的学习带来了很多困惑,这么多技术我该学什么,盲目的在各种新技术间
- Java基本类型与byte数组之间相互转换,刚刚写的package cn.teaey.utils;import java.nio.chars
- 如何在冗长的监控录像中找到关键点?我们知道,监控录像中大部分信息都是没用的,那些信息就等同于一幅静态图像。我们要等待监控的范围内出现异常情况
- java和javascript长得是如此地相像,那么它们是一回事儿吗?现在让我来揭晓答案吧!JavaScript 是一种嵌入式脚本文件,直接
- 进度条样式在项目中经常可以见到,下面小编给大家分享Android三种方式实现ProgressBar自定义圆形进度条。Android进度条有4
- 我们的spring cloud微服务一般是打成jar包发布的,Linux下启动jar包和windows下一样,都是java -jar 包名,
- 一.背景项目中有个需求大体意思是,上传一个word模板,根据word模板合成word文件,再将word文件转为pdf。二.方案选择1.Spi