为了账号安全,请及时绑定邮箱和手机立即绑定

如下所示,c#利用委托调用类中的非静态方法怎样才能让方法中的内容输出?

如下所示,c#利用委托调用类中的非静态方法怎样才能让方法中的内容输出?

C#
梦里花落0921 2022-06-10 16:07:30
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace 委托和多播委托{class Program{public delegate void Max();public delegate double Max1(double x, double y);public class IntMax{public void Max(){Console.WriteLine("我是最大值");}public double Max(double x, double y){return x > y ? x : y;}public void Min(){Console.WriteLine("我是最小值");}}static void Main(string[] args){Max max;Max1 max1;IntMax md = new IntMax();max = new Max(md.Max);//为啥不显示输出结果呢?max += new Max(md.Min);//为啥不显示输出结果呢?IntMax mx = new IntMax();max1 = mx.Max;Console.WriteLine("最大值是:" + max1(5.2,5.7));Console.ReadKey();//委托的实例化:意味着要引用某个类中的方法,要实例化,就要调用该委托的构造函数,//构造函数意味着要将委托的关联的方法作为参数传递;如上所示}}}新手求解
查看完整描述

3 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

在C#中,委托是一种类型,属于引用类型,委托的关键字是delegate,委托的定义和类的定义一样,所以凡是能定义类的地方也是可以定义委托的,public delegate void MyDelegate();这个定义了一个无返回值,无参的委托类型,那么下面来通过委托编写一段代码:
实例 1 : 委托的基本组成
class Program
{
public delegate void MyDelegate();
static void Main(string[] args)
{
MyDelegate myMessage = new MyDelegate(MyMethod);
myMessage();
Console.ReadLine();
}
public static void MyMethod()
{
Console.WriteLine("我是通过委托调用的");
}
}

上述的代码是可以直接进行运行的,在上述代码中,首先声明了一个委托 MyDelegate, 它是无返回值,无参数的 ,同时还创建了一个方法MyMethod(), 这个方法也是 无返回值,无参数的。

静态方法和实例方法的区别 “静态方法都是通过关键字static来定义的,静态方法不需要实例这个对象就可以通过类名来访问这个对象。在静态方法中不能直接访问类中的非静态成员。而用实例方法则需要通过具体的实例对象来调用,并且可以访问实例对象中的任何成员”, 来通过一个实例来了解
public delegate void MyPersonDelegate(string name);
static void Main(string[] args)
{
MyPersonDelegate personDelegate = new MyPersonDelegate(Person.GetPersonName);
personDelegate("Static");
MyPersonDelegate personIntanceDelegate = new MyPersonDelegate(new PersonIntance().GetPersonName);
personIntanceDelegate("Intance");
}
class Person
{
public static void GetPersonName(string age)
{
Console.WriteLine(age);
}
}
class PersonIntance
{
public void GetPersonName(string name)
{
Console.WriteLine(name);
}
}

在上述代码中,首先定义了一个委托MyPersonDelegate,它是无返回值,并且需要一个string类型的参数类型(在这里说一点,委托是可以进行协变和逆变的,具体请参考.NET可变性解析(协变和逆变)),然后分别定义了两个类person和PersonInstance 其中Person中声明了一个GetPersonNam的静态方法,PersonIntance类中声明了一个GetPersonName的实例方法,在主函数Main中,分别进行调用.在执行的时候,会发现委托的实例后跟一个参数,这个参数其实就是方法的参数,因为所定义的委托要求的是一个执行一个无返回值,有一个string类型的参数的方法


查看完整回答
反对 回复 2022-06-14
?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

简单来说你只是声明了委托并搭载了几个方法,根本就没有执行,所以当然不会有结果,简单的调用比如


max = new Max(md.Max);//为啥不显示输出结果呢?max += new Max(md.Min);//为啥不显示输出结果呢? max.Invoke();//执行所有搭载方法

当然也可以更简单比如


max = new Max(md.Max);//为啥不显示输出结果呢?max();


查看完整回答
反对 回复 2022-06-14
?
波斯汪

TA贡献1811条经验 获得超4个赞

你把委托、普通类、事件混淆了,普通委托一般不用+=形式的,还有你的各种名称可以改进下,一看都是max,仔细看才知道有大小写等等区别。

查看完整回答
反对 回复 2022-06-14
  • 3 回答
  • 0 关注
  • 106 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号