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

usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSy... 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();
//委托的实例化:意味着要引用某个类中的方法,要实例化,就要调用该委托的构造函数,
//构造函数意味着要将委托的关联的方法作为参数传递;如上所示
}
}
}
新手求解
展开
 我来答
xiangjuan314
2016-01-14 · TA获得超过3.3万个赞
知道大有可为答主
回答量:2.9万
采纳率:0%
帮助的人:2805万
展开全部
在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类型的参数的方法
syht2000
高粉答主

2014-12-29 · 关注我不会让你失望
知道大有可为答主
回答量:3万
采纳率:79%
帮助的人:1.4亿
展开全部

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

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


当然也可以更简单比如

max = new Max(md.Max);//为啥不显示输出结果呢?
max();
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
阳光的雷咩咩
2014-12-29 · TA获得超过1.4万个赞
知道大有可为答主
回答量:2.3万
采纳率:66%
帮助的人:7649万
展开全部
你把委托、普通类、事件混淆了,普通委托一般不用+=形式的,还有你的各种名称可以改进下,一看都是max,仔细看才知道有大小写等等区别。
更多追问追答
追问
嗯,那委托应该怎么写呢?老师讲的糊里糊涂,网上的看不懂啊。能不能稍微帮帮忙解决一下啊。解释一下委托可以写在哪里,一般都在哪里写,委托是不是必须和事件同时出现啊,只有委托能够输出方法的内容么? 分数事后会追加的。谢谢
追答
估计没几个人彻底懂了的,除非是开发CLR的人,不然谁敢说懂了?平时我们都是遇到一个学一个,有那么三四个套路就可以了,比如如何用委托执行某个函数,如何自定义引发注册事件,子线程如何使用委托更新UI,Action,Func的基本使用等。你要了解哪个我可以给你写个例子,网上也多得是。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
kcxnvbdbd
2014-12-29 · TA获得超过523个赞
知道小有建树答主
回答量:885
采纳率:50%
帮助的人:608万
展开全部
不执行怎么输出啊,笨
追问
额,主要是没理解透彻,这个委托事件,形式也太多了。。。求解答=。=
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
放羊的小星星
2014-12-29 · TA获得超过4066个赞
知道大有可为答主
回答量:2187
采纳率:60%
帮助的人:1542万
展开全部
倒数第三行加上max();

多播委托 这个委托指向了两个函数,执行委托直接去全执行了,你没执行他们为什么输出??
追问
难到说,我刚才只是声明了一个委托事件,没有执行?执行是通过调用委托的方法来执行的?那是不是除了这种形式,我还可以设置一个事件,不通过方法来调用,通过事件来调用,那该怎么写了啊。。帮帮我吧。一会我会把分数调成50的,主要是怕系统黑
追答
你以前写一些函数,也就是方法,一直需要参数,或者不需要参数,你为什么需要参数?那就是因为你要用,那你写了那么多方法,难道就没有一次发现,我需要的参数是一个方法,这时候委托不就派上用场了??  参数用来传int string这些值,委托是用来传方法的,你定义一个委托,想两个函数。你max = new Max(md.Max); max += new Max(md.Min);   这两行代码指示让max这个委托指向了两个方法而已,也就是说,这个委托里装了两个方法,其实委托你可以随便去用,或者用委托去传递函数。如果你了解c语言,委托 应该是保存了方法的首地址,然后连成一条链。但是max = new Max(md.Max); max += new Max(md.Min);  你这样写完后再继续写max=new Max(某个方法),你就会发现,这个委托执行就只会执行最后一个了,为什么。因为他存储的链断了。本来他内部你用+=几个方法连接在一起,你赋值一次。就断了。

事件也是委托,解决了以上问题,一种特殊的委托,你重新赋值,事件就不会断,事件里有add和remove方法,做了一些限制,就好比字段和属性,你写属性可以对字段存取做控制,事件里的add和remove方法做一些限制就导致方法链不会断了。但事件里的add和remove你看不见,用反编译工具就可以看到了。只是给你讲讲不同。委托和事件区别。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式