精华内容
下载资源
问答
  • c#学习之委托练习
    2019-02-25 17:07:11

    练习需求分析:
    一个数组string[] names = { "dfsSDF", "dfsFDSFE", "DFSDdsf" };

    1. 将所有元素转换成大写
    2. 将所有元素转换成小写
    3. 将所有元素两边加上一个引号
      1、首先写3个满足需求的方法
    		static void ProToUpper(string[] names)
            {
                for (int i = 0; i < names.Length; i++)
                {
                    names[i] = names[i].ToUpper();
                }
            }
            static  void ProToLower(string[] names)
            {
                for (int i = 0; i < names.Length; i++)
                {
                    names[i] = names[i].ToLower();
                }
            }
            static void ProAddQuo(string[] names)
            {
                for (int i = 0; i < names.Length; i++)
                {
                    names[i] = "\"" + names[i] + "\"";
                }
            }
    

    2、再写一个含委托参数的改变字符串的总方法,包含委托参数,需要先定义一个委托类型,返回值及参数需要和前面方法一致;

    		public delegate void DelChange(string [] names);
    
     		static void Change(string[] names, DelChange del)
            {
                del(names);
            }
    

    3、调用显示

    		static void Main(string[] args)
            {
                string[] names = { "dfsSDF", "dfsFDSFE", "DFSDdsf" };
                Change(names, ProToLower);
                foreach (var item in names)
                {
                    Console.WriteLine(item);
                }
                Console.ReadKey();
    
            }
    

    4、简化代码(封装)

    public delegate string DelChange(string names);
            static void Main(string[] args)
            {
                string[] names = { "dfsSDF", "dfsFDSFE", "DFSDdsf" };
                Change(names, ProToLower);
                foreach (var item in names)
                {
                    Console.WriteLine(item);
                }
                Console.ReadKey();
    
            }
            static void Change(string[] names, DelChange del)
            {
                for (int i = 0; i < names.Length; i++)
                {
                    names[i] = del(names[i]);
                }
            }
            static string  ProToUpper(string str)
            {
                return str.ToUpper();
            }
            static  string ProToLower(string str)
            {
                return str.ToLower();
            }
            static string ProAddQuo(string str)
            {
                return "\"" + str+ "\"";
            }
        }
    

    OK啦!!!!

    更多相关内容
  • 关于委托、事件概念理解以及项目练习demo

    以下概念性叙述均为个人理解,如有偏颇大家皆可指教
    一、运行结果
    注意:我将加热器与事件进行了绑定,但是报警器是直接调用方法的效果,大家比对观看
    在这里插入图片描述

    二、项目练习demo

    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 委托_事件练习
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            //高档热水器包含有加热器、报警器、显示屏,
            //1、当热水器水温超过95度,报警器会发出语音提示,
            //2、液晶屏显示水温提示,
            //观察者模式记录
            class MyEvent
            {
                public event MakeHotMachineHandler  temperatureChangeEvent;  //定义一个委托类型的事件
            }
            private void button1_Click(object sender, EventArgs e)
            {
                //如何绑定事件,如何一个事件去绑定多个方法
                //事件实例化
                MyEvent eve = new MyEvent();
                //绑定事件到方法
                eve.temperatureChangeEvent += MakeHotMachine;
    
                if (string.IsNullOrEmpty(textBox1.Text.Trim()))
                {
                    MessageBox.Show("请先输入水温!");
                    return;
                }
                MakeHotMachine(Convert.ToInt32(textBox1.Text.Trim()));
                TVshow(Convert.ToInt32(textBox1.Text.Trim()));
            }
    
            //事件处理方法
            //加热器提示水温
            public delegate string MakeHotMachineHandler(int temperature);
            public  string MakeHotMachine(int temperature)
            {
                if (temperature>=95)
                {
                    label3.Text = "嘀嘀嘀滴,当前水温以达到" + temperature + "摄氏度,请当心烫伤!";
                }
                else
                {
                    label3.Text = "当前水温以达到" + temperature + "摄氏度";
                }
                return label3.Text;
            }
    
    
            //显示屏
            public string TVshow(int temperature)
            {
                if (temperature > 95)
                {
                    label4.Text = "咔嚓咔嚓咔嚓,当前水温以达到" + temperature + "摄氏度,请当心烫伤!";
                }
                else
                {
                    label4.Text = "当前水温以达到" + temperature + "摄氏度";
                }
    
    
                return label4.Text;
    
            }
    
    **三、委托**
    1、概念:大家可以把委托理解为“猎头”,代替本公司的人力资源部门去招聘,甲方爸爸只需要和乙方提人员需求,乙方老大让招聘部门去实施招聘。
    2、作用
    a\委托可以实现两个方法乃至多个方法之间的操作
    b\委托像是一个类,它可以变量类型去使用,将方法转化为另一个方法的参数去操作,
    例如:
    委托的声明:public delegate static GetStudentDelegate();
    GetStudent()
    {    
    }
    public static Load(GetStudentDelegate GetStudent)
    {
    	GetStudent();
    }
    **四、事件**
    概念:账号关注,关注的人可以查看到被关注的动态,将两者之间的账号单向绑定
    
    
    
    展开全文
  • 委托对象作为方法的参数,对学生类对象分别按照姓名、年龄和年级来比较两个学生对象,实现程序以不同的排序方式来输出学生信息。 (1) 创建一个控制台应用程序L4_3。 (2) 在Program.cs文件中,首先定义Student...
  • C#委托练习1)

    2019-04-03 13:34:34
    using System.Collections; using System.Collections.Generic; using UnityEngine;.../// 首领举杯委托 /// </summary> /// <param name="hand">左手,右手</param> public delegate void...

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    /// <summary>
    /// 首领举杯委托
    /// </summary>
    /// <param name="hand">左手,右手</param>
    public delegate void RaiseEventHandler(string hand);
    /// <summary>
    /// 首领A摔杯委托
    /// </summary>
    public delegate void FallEventHandler();

    public class Test : MonoBehaviour
    {

        // Use this for initialization
        void Start()
        {
            A a = new A(); // 定义首领A

            B b = new B(a); // 定义部下B


            C c = new C(a); // 定义部下C
            //                // 首领A左手举杯
            //a.Raise("左");

            首领A右手举杯
            //a.Raise("右");

            // 首领A摔杯
            a.Fall();
            // 由于B和C订阅了A的事件,所以无需任何代码,B和C均会按照约定进行动作。
        }
    }

    public class A
    {
        public event RaiseEventHandler RaiseEvent;
        public event FallEventHandler FallEvent;
        public void Raise(string hand)
        {
            Debug.Log("首领A手举杯" + hand);
            if (RaiseEvent != null)
            {
                RaiseEvent(hand);
            }
        }
        public void Fall()
        {
            Debug.Log("首领摔杯");
            if (FallEvent != null)
            {
                FallEvent();
            }
        }
    }

    public class B
    {
        A a;
        public B(A a)
        {
            this.a = a;
            a.RaiseEvent += new RaiseEventHandler(a_RaiseEvent);
            a.FallEvent += new FallEventHandler(A_FallEvent); // 订阅摔杯事件
        }
        void a_RaiseEvent(string hand)
        {
            if (hand.EndsWith("左"))
            {
                Attack();
            }
        }
        void A_FallEvent()
        {
            Attack();
        }

        void Attack()
        {
            Debug.Log("B开始攻击");
        }
    }
    public class C
    {
        A a;
        public C(A a)
        {
            this.a = a;
            a.RaiseEvent += new RaiseEventHandler(A_RaiseEvent);
            a.FallEvent += new FallEventHandler(A_FallEvent);
        }

        void A_RaiseEvent(string hand)
        {
            if (hand.Equals("右"))
            {
                Attack();
            }
        }
        void A_FallEvent()
        {
            Attack();
        }
        void Attack()
        {
            Debug.Log("C开始进攻");
        }
    }

    展开全文
  • 一、委托概念 二、委托语法规范: eg:委托实现Greeting: 三、窗体间传值 eg:使用静态变量和构造函数传值 eg:使用委托的方式进行传值 四、匿名函数与Lambda表达式 五、系统已经定义好的委托 六、事件 一、...

    目录

     

    一、委托概念

    二、委托语法规范:

    eg:委托实现Greeting:

    三、窗体间传值

    eg:使用静态变量和构造函数传值

    eg:使用委托的方式进行传值

    四、匿名函数与Lambda表达式

    五、系统已经定义好的委托

    六、事件


    一、委托概念


    1、使用委托可以提高代码的可扩展性
    最优秀的项目是我写过的代码基本上不需要动,如果我需要追加新功能的话,只需要写新功能就可以了,原来的老功能
    不需要动一行代码。      有优秀的可扩展性

    2、委托的关键字   delegate

    Greeting 怎么用委托来实现呢?

     

    二、委托语法规范:


    [访问修饰符] delegate 返回值 委托名称(参数1,参数2,参数3,...);

    1、声明一个委托
    public delegate void TestMuDelegte(string s);    //声明一个委托

    2、实例化一个委托
    TestMuDelegte  tes=new TestMuDelegte(方法名);

    实例化委托的时候,需要将符合委托定义的方法当做参数传给委托,在该例中,应该传递一个返回值为void,参数
    为string的方法名称。

    委托是一个类型

    3、调用委托

    tes("....");

    4、把委托当做参数传入方法,调用该方法

    public static void GreetNew(string name, GreetDelegate getDel)
            {
                getDel(name);
            }

    GreetNew("黄渤", ShandongGreet);

    eg:委托实现Greeting:

    class Program
        {
            //1、声明委托:委托中  返回值:void    有一个string类型的参数
            public delegate void GreetDelegate(string s);
            //把委托当做参数传递
            public static void GreetNew(string name, GreetDelegate getDel)
            {
                getDel(name);
            }
    
            static void Main(string[] args)
            {
                //2、实例化委托对象
                GreetDelegate greet = new GreetDelegate(BeijingGreet);
                //实例化委托的时候,需要将符合委托定义的方法当做参数传给委托
                greet("大张伟");//3、调用委托
                GreetNew("黄渤", ShandongGreet);//4、把委托当做参数传入方法,调用该方法
    
                Console.Read();
    
            }
    
            public static void BeijingGreet(string name)
            {
                Console.WriteLine("你好!"+name);
            }
            public static void ShandongGreet(string name)
            {
                Console.WriteLine("你好!" + name);
            }
    
        }

     //委托简写方式  省略掉new操作符
                ComputeDelegate compDel2 = MultyMethod;
                Console.WriteLine(compDel2(23, 6)); 


    三、窗体间传值

    1、使用静态变量传值

    Form1--》Form2传值
    1)创建一个类,在该类中创建静态变量,用于存储要传递的值

    2)在New Form2对象之前,在Form1的Button点击事件中将文本框中的值存储到静态变量中

    3)在Form2的构造函数中,控件初始化方法后,将静态变量中的值赋值给该窗体的文本框

    Form2--》Form1传值
    1)在Form2中放置一个Button用于关闭该窗体。在上面的类中创建一个静态变量,存储该文本框的值

    2)Button的Click事件中,把文本框的值赋值给该静态变量

    3)在Form1中,找到New FOrm2的那个Button的Click事件,在SHow()或者SHowDialog()方法下面一行
        将存储到静态变量中的值赋值给该窗体的文本框

    eg:使用静态变量和构造函数传值

    Common类:

        class Common
        {
            public static string UserName;
    
            public static string song;
        }

    Form1:

    public partial class Form1 : Form
        {
           
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                //为静态变量赋值
                Common.UserName = textBox1.Text.Trim();
                Form2 frm = new Form2();
                frm.ShowDialog();
    
                //为Form1中的控件赋值
                textBox1.Text = Common.song;
            }
    
            /// <summary>
            /// 打开FOrm3
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void button2_Click(object sender, EventArgs e)
            {
                Form3 frm = new Form3(textBox1.Text);
                frm.ShowDialog();
            }
        }

    Form2:

        public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
    
                //为控件赋值
                textBox1.Text = Common.UserName;
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                //将文本框中的值保存都公共变量中
                Common.song = textBox1.Text;
                this.Close();
            }
        }

    Form3:

        public partial class Form3 : Form
        {
            public Form3()
            {
                InitializeComponent();
            }
    
            public Form3(string str):this()
            {
                textBox1.Text = str;
            }
        }

    2、使用委托的方式进行传值  Form2--》Form1
    1)Form2没有办法直接访问Form1中的控件,但是我们可以通过委托,把Form1中的方法传递给FORM2

    2)在Form1中先把方法写好,该方法有一个参数,把这个参数赋值给Form1的文本框
        private void GetValue(string str)
            {
                textBox1.Text = str;
            }
            
    3)在Form2中声明一个委托,委托的方法原型与上面的方法保持一致,具体如下:
        public delegate void TransValueDelegate(string s);
        
    4)在Form2中定义一个委托变量
        TransValueDelegate _del;

    5)在Form2的构造函数中,添加一个委托参数,在构造函数方法体内将该委托参数传递给该窗体本身的委托变量
         public Form2(string str, TransValueDelegate del)
            {
                InitializeComponent();
                textBox1.Text = str;
                _del = del;

            }

    6)在Form2的Button点击事件中,调用委托变量,将文本框的值传入
        _del(textBox1.Text);
        
    7)在Form1中,实力化Form2对象的时候,把方法作为参数传递进来
        private void button1_Click(object sender, EventArgs e)
            {
                Form2 frm = new Form2(textBox1.Text, GetValue);
                frm.ShowDialog();
            }

    当Form2子窗体关闭以后,下一行代码会跳到哪里?
    下一行代码会跳到打开FOrm2对象的那里

    eg:使用委托的方式进行传值

    form1:

        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                Form2 frm = new Form2(textBox1.Text, GetValue);
                frm.ShowDialog();
            }
    
            private void GetValue(string str)
            {
                textBox1.Text = str;
            }
        }

    form2:

        public partial class Form2 : Form
        {
            public delegate void TransValueDelegate(string s);
            TransValueDelegate _del;
            public Form2(string str, TransValueDelegate del)
            {
                InitializeComponent();
                textBox1.Text = str;
                _del = del;
    
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                //关闭按钮之前,先调用委托方法把值传给Form1
                _del(textBox1.Text);
    
                //关闭当前窗体
                this.Close();
            }
        }

    四、匿名函数与Lambda表达式

    一般我们学习C#的时候,说到匿名函数的时候都会谈到lambda表达式.

    其实lambda表达式就是匿名函数更为简洁的一种写法.

    通俗点讲,你需要写一个函数,但是懒得给它起名字,而且懒得写那么多封装和类.并且可能就这个地方调用,其他地方几乎不调用这段代码,那么我就可以用这个来搞定.。

     

    1、 匿名方法语法规范:
    委托类型名称   委托名 = delegate(参数列表){方法体}
    ComputeDelegate   compDel3=delegate(int x,int y){return x+y;}

    2、Lambda表达式实现步骤:
    1、声明一个委托
     public delegate int TestDelegate(int a, int b);
     2、定义一个委托变量,将Lambda表达式赋值给该变量
     TestDelegate test = (a, b) => a + b;    //加法
     3、调用委托
      int n=test(12, 13);

     

     


    五、系统已经定义好的委托

    (1). Action
           Action是无返回值的泛型委托。
       Action 表示无参,无返回值的委托
       Action<int,string> 表示有传入参数int,string无返回值的委托
       Action<int,string,bool> 表示有传入参数int,string,bool无返回值的委托
           Action<int,int,int,int> 表示有传入4个int型参数,无返回值的委托
       Action至少0个参数,至多16个参数,无返回值。
       例:
            public void Test<T>(Action<T> action,T p)
            {
                action(p);
            }
        (2). Func
       Func是有返回值的泛型委托
       Func<int> 表示无参,返回值为int的委托
       Func<object,string,int> 表示传入参数为object, string 返回值为int的委托
       Func<object,string,int> 表示传入参数为object, string 返回值为int的委托
       Func<T1,T2,,T3,int> 表示传入参数为T1,T2,,T3(泛型)返回值为int的委托
       Func至少0个参数,至多16个参数,根据返回值泛型返回。必须有返回值,不可void
          例:   
            public int Test<T1,T2>(Func<T1,T2,int>func,T1 a,T2 b)
            {
                return func(a, b);
            }
            
              (4) .predicate
       predicate 是返回bool型的泛型委托
       predicate<int> 表示传入参数为int 返回bool的委托
       Predicate有且只有一个参数,返回值固定为bool
       例:public delegate bool Predicate<T> (T obj)


    六、事件

    1、如果说委托是一个类型,那么事件就是一个对象!
    2、事件的创建必须是借助某个委托类型来完成的!
    3、也就是说,委托是事件的类型,事件本身是个对象!!
    4、所以,事件也可以看成是一个,受到约束的委托实例(委托对象)。

    总结:委托是一个类型,事件是委托类型的对象

    //注册事件
    this.button1.Click += new System.EventHandler(this.button1_Click)


    public delegate void EventHandler( object sender , EventArgs e )//委托的声明
    public event EventHandler Click; //利用委托定义事件Click
    Click += new System.EventHandler(BtnOpen_Click);//为事件注册方法

    练习:设计一个简单的Windows程序,实现以下功能:文本框默认显示提示文字“在此,请输入任意文字!”;
    进入该文本框时自动清除提示文字;之后由用户输入字符,每输入一个字符就在标签空间中显示一个字符;
    离开该文本框时显示“输入结束,
    您输入的文字是:”,并显示所输入的文字,同时,文本框再次显示“在此,请输入任意文字!”。

    进入该文本框时:MouseEnter
    每输入一个字符就...:  TextChanged
    离开该文本框时..:MouseLeave
     

    展开全文
  • 应用场景解释: 用户有一张信用卡,信用卡有一个总额度;每个月会有信用卡账单显示月消费总额,月消费总额是小于信用卡总额度的;...①必须使用委托; ②事件的触发方式是每个月的到期还款日; ...
  • C#委托与事件_随机数与进度条练习题Form1.csProgram.csForm1.Designer.cs 题目:计算一个数的三角函数,绝对值和平方值 要求: 1.在窗体中的TextBox中输入一个数字。 2.把输入转换为double型,计算四个三角函数,...
  • C# 语言中,委托委托某个方法来实现具体的功能。 委托是一种引用类型,虽然在定义委托时与方法有些相似,但不能将其称为方法。 委托在使用时遵循三步走的原则,即定义声明委托、实例化委托以及调用委托。 从...
  • C#委托练习2)

    2019-04-03 14:36:01
    using System.Collections; using System.Collections.Generic; using UnityEngine; public delegate void GreetingDelegate.../// 委托和事件在.NetFrameWork中的应用非常的广泛,然而,较好的理解委托和事件对很多...
  • c# 泛型委托 练习

    2021-04-23 12:03:03
    自定义 无参无返回值 委托 using System; namespace ConsoleApp5 { // 声明委托,无参数,无返回值 delegate void MyDele(); class Program { static void Main(string[] args) { // dele1这个变量引用着一个...
  • .Net编程中最经常用的元素,事件必然是其中之一。无论在ASP.NET还是WINFrom开发中,窗体加载(Load),绘制(Paint),初始化(Init)等等。 “protected void Page_Load(object sender, ...这是不是和委托非常相似呢?
  • 声明委托:为判断,所以指定为布尔类型,但是判断有可能存在=0的情况所以让委托返回一个int值和0去比较; delegate int DelGetMax(object o1,object o2); 4、改进GetMax方法 static object GetMax(object[] ...
  • c# 泛型练习 泛型委托

    2021-04-22 12:39:25
    }*/ } } 泛型委托 Action方式 namespace HelloGeneric { internal class Program { static void Main(string[] args) { // 泛型委托 Action<string> a1 = Say; // Hello,LL! a1.Invoke("LL"); Action<int> a2 = Mul...
  • C# 委托和事件 练习

    千次阅读 2017-03-01 19:13:10
    using System; using System.Collections.Generic; using System.Linq;... * 委托与事件练习 * * 表、响铃、按钮 * * 表时间从0开始,走到6就要响铃 * 响铃后输入n按回车,模拟按掉闹铃。 * 参考资料:http
  • C# 委托事件传递参数

    2021-01-19 14:30:57
    这里尝试了串口通讯委托,虽然本来就有,但是自己练习一下还是好的。 //定义一个委托 public delegate void serialPortHandler(string msg); //定义一个委托事件 public event serialPortHandler GetData; ...
  • C#练习:使用委托实现信用卡用户定时还款功能 目录C#练习:使用委托实现信用卡用户定时还款功能基本思路核心步骤1)定义委托与事件2)定义People类3)定义银行类4)主函数5)实验结果完整代码实验总结进一步改进 ...
  • C# 委托的理解

    2020-10-23 08:41:36
    文章目录C# 委托的理解题记:简介委托的使用过程 C# 委托的理解 题记: 学好一门技术语言,其实不难。首先心理上要克服畏惧的不良的情绪,在意志品质上要提高克服困难的勇气。其次,要循序渐进,逐个梳理概念上的...
  • C#委托简单测试

    2020-06-08 00:55:35
    TextBlock Text="测试委托前的内容" x:Name="NameWeiTuo"></TextBlock> <Button Content="执行委托" Width="100" Height="100" Click="Button_Click"></Button> </Grid> public ...
  • C# (X):委托

    2022-02-02 18:59:27
    委托的深入解读,并且有代码练习
  • C#,NET委托,实例代码,C#,NET委托,实例代码
  • C#接口项目练习

    2011-12-11 15:39:06
    使用IComparable接口,IComparer接口实现排序功能
  • C#入门阶段练习,包括(IF,Swich,循环,复杂数据类型,二维数组,随机数,类与对象基本知识,继承,多态,泛型,委托等)相关练习代码完整版,非常适合初学者,学习使用,答案100%正确,运行正常,欢迎下载!
  • 委托练习与总结

    2020-10-02 16:06:30
    委托练习:(以下步骤总结来源于喜科堂培训视频) 1. 委托一般声明在类的外部 2.根据委托定义的函数原型编写需要的方法 3.委托在使用前必须实例化,实例化时必须指明默认的方法 4.通过委托调用方法,而...
  • 在很多语言中都提供了对它的支持,c#也不例外,它可以帮我们解决下面的问题: 1,检索:通过正则表达式,从字符串中获取我们想要的部分 2,匹配:判断给定的字符串是否符合正则表达式的过滤逻辑 你可以认为正则...
  • C#委托实现窗体间传值 form1实例化打开form2 在form1不关闭的情况下把form2中的内容传给form1 C#委托练习
  • 活动及委托【难度:3级】: 答案1: using System; using System.Collections.Generic; public class PersonEventArgs : EventArgs { public string Name { get; set; } } public class Publisher { public ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,756
精华内容 702
关键字:

c#委托练习

c# 订阅