栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

C#等效于创建实现接口的匿名类

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C#等效于创建实现接口的匿名类

哇…好吧,请允许我概括一下:

因此,在Java中,您需要一种方法来传递函数。Java本质上不支持以一等公民身份使用函数,这是实现 匿名类的 背后原因之一-
打包的函数组可以内联声明并(作为接口)传递给方法/其他类,然后再调用这些函数。

在C#中,函数是一等公民,可以声明为

Delegates
Func<>s
Action<>s
。让我们尝试一下比较:

某种Java-y构造(我的Java相当老,请耐心等待):

public interface IDoSomething {    public int Return42();    public bool AmIPrettyOrNot(string name);    public void Foo();}public void Main(String[] args) {    DoStuff(new IDoSomething() {        public int Return42() { return 42; }        public bool AmIPrettyOrNot(string name) { return name == "jerkimball"; }        public bool Foo(int x) { ... }    });}public void DoStuff(IDoSomething something) { ... }

C#中的(非常粗糙)等效项为:

public void Main(string[] args){    Func<int> returns42 = () => 42;    Func<string,bool> amIPretty = name => name == "jerkimball";    Action<int> foo = x => {};}

现在,正如其他人提到的那样,在处理事件时,通常会在Java端看到这种模式-同样在C#端:

 public class Foo  {     // define the shape of our event handler     public delegate void HandlerForBarEvent(object sender, EventArgs args);     // declare our event     public event HandlerForBarEvent BarEvent;     public void CallBar()     {         // omitted: check for null or set a default handler         BarEvent(this, new EventArgs());     } } public void Main(string[] args) {      var foo = new Foo();      // declare the handler inline using lambda syntax      foo.BarEvent += (sender, args) =>       {// do something with sender/args      }      foo.CallBar(); }

注意,我们也可以给它一些具有相同“形状”的东西:

 public void MyHandler(object sender, EventArgs args) {     // do stuff } public void Main(string[] args) {      var foo = new Foo();      // that method above is the same "shape" as HandlerForBarEvent      foo.BarEvent += MyHandler;      foo.CallBar(); }

但是在Java中,它也用于定义内存(例如

Runnable
)服务时Thread的功能-我们也可以在C#中做到这一点:

var thread = new Thread((Action)(() =>      {         // I'm the threads "run" method!     });thread.Start();

现在,其他内容-枚举:

public void processEvents(){    for(Event event : eventList)        eventList.execute();}

C#的想法相同,只是调用方式不同:

public void processEvents(){    // edit: derp, 'event' is a keyword, so I'm    // renaming this, since I won't get into why    // you could also use @event...    foreach(var evt in eventList)    {        evt.Execute();    }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/497357.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号