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”复选框后单击“提交”按钮,程序会自动将文本框中的文字“抄写”到对应的用户勾选的文本区中去。

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;

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

标签:C#,网络,编程
0
投稿

猜你喜欢

  • Android 操作系统获取Root权限 原理详细解析

    2021-12-07 16:20:55
  • C#集合之列表的用法

    2021-12-27 19:46:43
  • Spring Boot thymeleaf模板引擎的使用详解

    2022-07-27 07:42:54
  • C语言预处理器使用方法讲解

    2023-04-07 01:39:02
  • C# 鼠标穿透窗体功能的实现方法

    2021-09-26 04:24:38
  • ObjectMapper 如何忽略字段大小写

    2023-07-31 07:07:18
  • Spark网站日志过滤分析实例讲解

    2021-06-08 12:59:24
  • C#中事件的定义和使用

    2022-02-15 13:34:00
  • C语言实现学生信息管理系统

    2023-05-24 12:08:50
  • Java实现的基于socket通信的实例代码

    2021-12-30 19:06:50
  • C++实现的求解多元一次方程示例

    2022-09-26 19:45:47
  • AndroidStduio3.0 使用gradle将module打包jar文件的方法

    2023-07-01 06:57:20
  • 详解用Eclipse如何创建Web项目

    2023-11-11 05:41:01
  • 关于Spring Boot内存泄露排查的记录

    2023-06-27 18:46:19
  •  Java图形化界面编程实现简单计算器

    2021-06-06 17:23:09
  • Spring Boot启动时调用自己的非web逻辑

    2022-02-15 11:40:10
  • Android利用Espresso进行UI自动化测试的方法详解

    2021-09-04 08:02:51
  • Java中MessageDigest来实现数据加密的方法

    2023-05-18 01:13:49
  • Java实现顺时针输出螺旋二维数组的方法示例

    2022-02-03 00:11:41
  • C#/VB.NET 自定义PPT动画路径的步骤

    2022-11-25 10:07:49
  • asp之家 软件编程 m.aspxhome.com