萌新学习C#和 VISUAL 积累了一些问题,想求教下老手

qq_41291156 2020-01-12 11:55:09
关于代码的组成,有一些细节书本上的阐述方式我不太理解,所以直接问了:
public delegate int TestDelegate(MyType m, long num);

1.public 是定义这个语句中的 方法是可以被PUBLIC的,所以我理解为 定义的一种

2.int 是赋予 TestDelegate 这个变量的输出类型是 int

3.那delegate 这个单词是理解为语句的函数吗?? 可以是否把它理解为语句算法表达的一种?

4.TestDelegate(MyType m , long num) 这个方法用法在书上还没学到


希望能有老师帮忙解释下1和2 我的理解是否正确, 3.是不是可以告诉我这个delegate 的学名是啥? 有没有列表和代码示例可以看
...全文
731 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_41291156 2020-01-30
  • 打赏
  • 举报
回复
引用 5 楼 wanghui0380 的回复:
无需解释,无需纠结。代码不能这么学。他就只是微软的一个语法规定 我只能给你说一下,我学C++的弯路 当初我学计算机的时候,正好是dos和window交界的时候,学校教TC,而我自己自学VC++ 结果是放弃了,因为当初我跟你一样,纠结于其实原本就根本不需要纠结的东西,我当初纠结vc++里那hanlder句柄,wm_xxxxx到底是啥,结果是那些根本就不是啥,我纠结于那些根本就不是东西的地方,决定vc++太不可理喻,所以放弃 后来工作以后在回头看当初的东西,我觉着我太TM傻了,居然因为句柄,wm_xxx这种纯粹根本没有解释的东西,放弃了vc++这太可笑了 ps:那就是规定,没有解释,也不能解释。如果你硬要别人解释,他们也只能把msdn翻出来给你看。如果你因为这些纠结这些规定,强求解释,我们说本末倒置。 有关“委托”只和“委托”本身有关,和语法规定无关,c++,delphi可以叫回调,javascript可以叫闭包,lisp可以叫高阶函数,但是和语法规定无关,只看你能不能理解“委托”这词本身
谢谢,我还没看到委托,所以不理解。 现在让我哦犯困的是一些是不是出现的各种长命名结构,无法理解他们 为什么要这么麻烦。。。
qq_41291156 2020-01-29
  • 打赏
  • 举报
回复
引用 3 楼 hztltgg 的回复:
delegate委托是和类class同级别的,不要和class里的function平级。
delegate是一个类定义的简写,后面的int TestDelegate(MyType m, long num);其实是这个类里的一个方法Invoke的参数。
一个委托其实就是用来代表一个方法,方法内容虽然千差万别,但定义不过就是有若干个参数和一个(或没有)返回值。
你这个 int TestDelegate(MyType m, long num);就是表示一个有两个参数,类型分别是MyType和long,返回值是int的一个函数,并且取了一个名字TestDelegate。
既然方法的种类没有这么多,只有参数的类型和数量不同,后来Net引进了泛型,那微软就为我们提供了十几个已经定义好的泛型委托,我们可以基本上不用自己定义委托了,他们就是下面这些,Func是有返回值的,
public delegate TResult Func<out TResult>();
public delegate TResult Func<in T,out TResult>(T arg);
...
public delegate TResult Func<in T1,in T2,in T3,in T4,in T5,in T6,in T7,in T8,in T9,in T10,in T11,in T12,in T13,in T14,in T15,in T16,out TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16);
public delegate void Action();
public delegate void Action<in T>(T obj);
...
public delegate void Action<in T1,in T2,in T3,in T4,in T5,in T6,in T7,in T8,in T9,in T10,in T11,in T12,in T13,in T14,in T15,in T16>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16);
涵盖了不同类型16个参数以内的有或没有返回值的委托。

你说的 int TestDelegate(MyType m, long num) 就相当于与 Func<MyType , long, int>,在实际使用中,已经可以不需要你自己定义这个委托了。

委托之后又演变了几次,出现匿名委托和lambda的=>语法,刚开始学这个可以先放一放,委托的目的应该是倒置依赖关系,如果你要调用别人的库代码,直接调用就可以,但别人的程序要调用你的代码,你都没写,他就不好先写了,用委托可以让他先写,你后期告诉他调用那个方法即可,典型的场景就是提供的 按钮功能,微软提供了各种控件,他实现的界面的展示,但单击以后调用那个程序需要你来写。

后续学到一些函数式的语法,比如数据库EF框架,也会大量用到lambda语法,因为框架不知道你要按什么条件查询数据。
谢谢
qq_41291156 2020-01-28
  • 打赏
  • 举报
回复
感谢诸位大佬回复,我一楼一楼研究,受益匪浅。
raynadofan 2020-01-18
  • 打赏
  • 举报
回复
其实,把delegate看成是函数原型就行了。只不过这个函数用了delegate关键字修饰。 因为delegate本身就是承载函数(方法)的。
Alfred_SAMA 2020-01-14
  • 打赏
  • 举报
回复
luj_1768 2020-01-14
  • 打赏
  • 举报
回复
你的这行代码实在让我感觉自己又out 了。 这个声明让人感觉莫名其妙:1. public 应该指的是域外可见,应该是在限定域内做的声明;2. delegate 在数据库软件中指的是系统迁移,借用为委托是可以理解的,暗示可以跨xx引用,这是需要系统提供服务的;3. int 在这里可以理解为服务使用的占位需求,系统为你这段代码的运行结果预留int 需求的字节位置,用于通讯或者存储。
VOX001 2020-01-14
  • 打赏
  • 举报
回复
VOX001 2020-01-14
  • 打赏
  • 举报
回复
名名main 2020-01-13
  • 打赏
  • 举报
回复
delegate为类型化了的函数指针,主要应用于回调
正怒月神 2020-01-13
  • 打赏
  • 举报
回复
delegate 就是可以把方法作为参数, 传递给另一个方法。 当然,很多人就觉得多此一举。 我不能直接传一个参数的值嘛,传一个方法有必要吗? 如果这个方法,你只是声明了,但是没有实现呢? 实现由真正调用者确定后,在传入呢?那如何确定值? 所以这个又牵涉到更深层的探讨了。 总结下来,我觉得新手不要太纠结委托。
SinGooCMS 2020-01-13
  • 打赏
  • 举报
回复
委托就是方法的方法,一般的方法传的是普通参数,而委托把方法当参数
牧歌ing 2020-01-13
  • 打赏
  • 举报
回复
委托是安全封装方法的类型,类似于 C 和 C++ 中的函数指针。 与 C 函数指针不同的是,委托是面向对象的、类型安全的和可靠的。 委托的类型由委托的名称确定。 以下示例声明名为 Del 的委托,该委托可以封装采用字符串作为参数并返回 void 的方法:

https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/delegates/using-delegates
hztltgg 2020-01-13
  • 打赏
  • 举报
回复
引用 13 楼 吾友客 的回复:
public delegate int TestDelegate(MyType m, long num); 1、public:公开的,代表这个方法可以被其他方法和事件调用; 2、int:数据类型,代表这个方法,是返回一个int类型的值,根据你想要返回的结果来设置这个方法的类型;string,object,都可以; 3、TestDelegate:方法名;起一个名称,这个名称随便你来定义,可以为123,用于很长一段时间后,看着这个名称,你能想起你写这个方法的目的; 4、TestDelegate():括号类的东西,可以为任何事物和类型,相当于一个容器,根据你想要的结果来定义事物的类型; 如: 有一个计算的方法A,很多地方都在调用A,但是我要把A写成公用的,怎么办? 答:这个时候,直接在A(string type),增加一个参数,来区分哪些方法调用; 但是如果这个A不是public(公开的),那么我想调用这个A方法,发现找不到,所以需要设置成为公开的; 突然发现,我想要的结果是字符串类型,怎么办?那么直接 public delegate string TestDelegate(MyType m, long num);即可 又发现,我想传一个值给TestDelegate方法,它返回给true和false,怎么办?public delegate bool TestDelegate(int num);
TestDelegate是类型名,不是方法名,虽然看起来像方法名,但那是因为所有的委托,都是实现一个方法的包装。 你用的时候,是需要实例化这个委托类型的,然后后实例化后的变量作为方法使用,而不是委托本身作为方法使用。如 var fun=new TestDelegate(test); 经常性的一个委托都是对应一个方法,重复起名还麻烦,之后就有了匿名委托和lambda来简化写法。
吾友客 2020-01-13
  • 打赏
  • 举报
回复
public delegate int TestDelegate(MyType m, long num);
1、public:公开的,代表这个方法可以被其他方法和事件调用;
2、int:数据类型,代表这个方法,是返回一个int类型的值,根据你想要返回的结果来设置这个方法的类型;string,object,都可以;
3、TestDelegate:方法名;起一个名称,这个名称随便你来定义,可以为123,用于很长一段时间后,看着这个名称,你能想起你写这个方法的目的;
4、TestDelegate():括号类的东西,可以为任何事物和类型,相当于一个容器,根据你想要的结果来定义事物的类型;
如:
有一个计算的方法A,很多地方都在调用A,但是我要把A写成公用的,怎么办?
答:这个时候,直接在A(string type),增加一个参数,来区分哪些方法调用;
但是如果这个A不是public(公开的),那么我想调用这个A方法,发现找不到,所以需要设置成为公开的;
突然发现,我想要的结果是字符串类型,怎么办?那么直接 public delegate string TestDelegate(MyType m, long num);即可
又发现,我想传一个值给TestDelegate方法,它返回给true和false,怎么办?public delegate bool TestDelegate(int num);

HuaKaiGoGoGo 2020-01-12
  • 打赏
  • 举报
回复
1.public表示其他对象都可以访问的,还有private和protect internal,都属于方法或者类的修饰定义(限定访问行为)
2.TestDelegate 可以理解为C++中函数指针,表示函数类型,函数类型必须声明他的参数和返回值,而int则表示这个函数的返回值,计算执行每个函数都会有返回值(void也算是一种返回值)
3.delegete表示后面定义的函数不是可以直接调用的函数,而是声明该函数为委托(C++中的函数指针)
4.TestDelegate(MyType m , long num) 这种书写是错误的,正确的是:int TestDelegate(MyType m , long num) ,要携带int这个返回值,表示了这个委托的名称、参数和返回值,当你实例化这个委托时就必须和这个委托的参数和返回值一致(名字则无所谓一致不一致了)
threenewbee 2020-01-12
  • 打赏
  • 举报
回复
delegate这个在大陆叫做“委托”,在台湾叫做“委派”,代表一个函数的数据类型。
你可以把一个函数像一个变量一样传给另一个函数(以函数为参数的函数叫做高阶函数)

public表示这个委托是公有的
int是委托的返回值的类型
TestDelegate不是函数,而是委托,表示的是它代表的函数的参数个数和类型和返回值类型(这个叫做“方法签名”)

具体看这里
https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/delegates/index
以及这个文档下面的几个链接
hztltgg 2020-01-12
  • 打赏
  • 举报
回复
举个委托的例子,如果你写了一个计算两个数加法的方法

        static long Fun11(long a, long b)
        {
            return a + b;
        }
现在又想实现减法功能,那你加一个参数来判断

        static long Fun12(long a, long b, string type)
        {
            if (type == "+")
            {
                return a + b;
            }
            else
            {
                return a - b;
            }
        }
但又想乘法,除法,各种奇奇怪怪的运算,你就不能无限扩展了,一个方案是让计算方法也像一个参数传进来,这个计算方法就是一个委托类型,可以定义一个委托 public delegate long Calculate(long a, long b); 这样,你的代码就可以改成

        static long Fun3(long a, long b, Calculate f)
        {
            return f(a,b);
        }
如果不想用自己定义的Calculate,用默认的也一样,可以少写一句定义语句。

        static long Fun2(long a, long b, Func<long,long,long> f)
        {
            return f(a, b);
        }
使用的时候可以最简单的=>语法实现乘法计算

            var value2 = Fun3(1, 2, (a, b) => a * b);
或者匿名函数的写法

            var value1 = Fun3(1, 2, delegate (long a, long b) { return a * b; });
或者最原始的写法,写在外部定义一个函数,然后将这个函数作为参数

        static long test (long a,long b)
        {
            return a * b;
        }
////
        var value = Fun3(1, 2, test);
wanghui0380 2020-01-12
  • 打赏
  • 举报
回复
无需解释,无需纠结。代码不能这么学。他就只是微软的一个语法规定 我只能给你说一下,我学C++的弯路 当初我学计算机的时候,正好是dos和window交界的时候,学校教TC,而我自己自学VC++ 结果是放弃了,因为当初我跟你一样,纠结于其实原本就根本不需要纠结的东西,我当初纠结vc++里那hanlder句柄,wm_xxxxx到底是啥,结果是那些根本就不是啥,我纠结于那些根本就不是东西的地方,决定vc++太不可理喻,所以放弃 后来工作以后在回头看当初的东西,我觉着我太TM傻了,居然因为句柄,wm_xxx这种纯粹根本没有解释的东西,放弃了vc++这太可笑了 ps:那就是规定,没有解释,也不能解释。如果你硬要别人解释,他们也只能把msdn翻出来给你看。如果你因为这些纠结这些规定,强求解释,我们说本末倒置。 有关“委托”只和“委托”本身有关,和语法规定无关,c++,delphi可以叫回调,javascript可以叫闭包,lisp可以叫高阶函数,但是和语法规定无关,只看你能不能理解“委托”这词本身
hztltgg 2020-01-12
  • 打赏
  • 举报
回复
1.public 是定义这个语句中的 方法是可以被PUBLIC的,所以我理解为 定义的一种 因为委托delegate 和类clas一样是一种类型(type),这个和class定义的public一样表示其他地方可见。 3.那delegate 这个单词是理解为语句的函数吗?? 可以是否把它理解为语句算法表达的一种? 这儿delegate 是告诉编译器他是个委托,让编译器将此语句转换为一个类型定义 2.int 是赋予 TestDelegate 这个变量的输出类型是 int 4.TestDelegate(MyType m , long num) 这个方法用法在书上还没学到 TestDelegate 不是变量,是类型名,相当于定义类时的语法,和 class TestDelegate 定义类一致,实际使用还会实例化的,如 new TestDelegate(test); int XXXXXX(MyType m , long num) 是表示这个委托类型是委托一个两参数MyTypehe long,返回int的方法。
hztltgg 2020-01-12
  • 打赏
  • 举报
回复
delegate委托是和类class同级别的,不要和class里的function平级。 delegate是一个类定义的简写,后面的int TestDelegate(MyType m, long num);其实是这个类里的一个方法Invoke的参数。 一个委托其实就是用来代表一个方法,方法内容虽然千差万别,但定义不过就是有若干个参数和一个(或没有)返回值。 你这个 int TestDelegate(MyType m, long num);就是表示一个有两个参数,类型分别是MyType和long,返回值是int的一个函数,并且取了一个名字TestDelegate。 既然方法的种类没有这么多,只有参数的类型和数量不同,后来Net引进了泛型,那微软就为我们提供了十几个已经定义好的泛型委托,我们可以基本上不用自己定义委托了,他们就是下面这些,Func是有返回值的, public delegate TResult Func<out TResult>(); public delegate TResult Func<in T,out TResult>(T arg); ... public delegate TResult Func<in T1,in T2,in T3,in T4,in T5,in T6,in T7,in T8,in T9,in T10,in T11,in T12,in T13,in T14,in T15,in T16,out TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16); public delegate void Action(); public delegate void Action<in T>(T obj); ... public delegate void Action<in T1,in T2,in T3,in T4,in T5,in T6,in T7,in T8,in T9,in T10,in T11,in T12,in T13,in T14,in T15,in T16>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16); 涵盖了不同类型16个参数以内的有或没有返回值的委托。 你说的 int TestDelegate(MyType m, long num) 就相当于与 Func<MyType , long, int>,在实际使用中,已经可以不需要你自己定义这个委托了。 委托之后又演变了几次,出现匿名委托和lambda的=>语法,刚开始学这个可以先放一放,委托的目的应该是倒置依赖关系,如果你要调用别人的库代码,直接调用就可以,但别人的程序要调用你的代码,你都没写,他就不好先写了,用委托可以让他先写,你后期告诉他调用那个方法即可,典型的场景就是提供的 按钮功能,微软提供了各种控件,他实现的界面的展示,但单击以后调用那个程序需要你来写。 后续学到一些函数式的语法,比如数据库EF框架,也会大量用到lambda语法,因为框架不知道你要按什么条件查询数据。

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧