Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 返回值形式为匿名方法_C# - Fatal编程技术网

C# 返回值形式为匿名方法

C# 返回值形式为匿名方法,c#,C#,我有这样的东西。如何从匿名方法返回值? returnRate=d。例如,让我有一个类,它从服务器获取用户的消息。我想在汽车和自行车课程中处理这些信息,现在清楚了吗 namespace ConsoleApplication9 { class Program { static void Main(string[] args) { Cars c = new Cars(); Bicycles b = new Bicycles(); } } publ

我有这样的东西。如何从匿名方法返回值?
returnRate=d。例如,让我有一个类,它从服务器获取用户的消息。我想在
汽车
自行车
课程中处理这些信息,现在清楚了吗

namespace ConsoleApplication9
{
class Program
{
    static void Main(string[] args)
    {
        Cars c = new Cars();
        Bicycles b = new Bicycles();
    }
}
public class Cars
{
    public Cars()
    {
        GetData G1 = new GetData();
        Dictionary<string, string> D1 = new Dictionary<string, string>();
        G1.ProcessCars(ref D1);
    }
}
public class Bicycles
{
    public Bicycles()
    {
        GetData G2 = new GetData();
        Dictionary<string, string> D2 = new Dictionary<string, string>();
        G2.ProcessBicycles(ref D2);
    }
}
public class Singleton
{
    private static Singleton instance;

    public Dictionary<string, Action<MessageEventArgs>> Handle;
    private Singleton() 
    {
        Handle = new Dictionary<string, Action<MessageEventArgs>>();
    }

    public static Singleton Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new Singleton();
            }
            return instance;
        }
    }
}
public class GetData
{
    private Client socket;
    public GetData()
    {
        socket = new Client("http://echo.jsontest.com/bicycles/10");
        socket.Message += Message;
    }
    public void ProcessBicycles(ref Dictionary<string, string> returnRate)
    {
        Singleton.Instance.Handle.Add("bicycles", (m) => 
        {
            Dictionary<string, string> d = m.Message.Json.GetFirstArgAs<Dictionary<string, string>>() as Dictionary<string, string>;
            //returnRate = d;
        });
    }
    public void ProcessCars(ref Dictionary<string, string> returnRate)
    {
        Singleton.Instance.Handle.Add("cars", (m) =>
        {
            Dictionary<string, string> d = m.Message.Json.GetFirstArgAs<Dictionary<string, string>>() as Dictionary<string, string>;
            //returnRate = d;
        });
    }
    private void Message(object sender, MessageEventArgs e)
    {
        if (Singleton.Instance.Handle.ContainsKey(e.Message.Event))
        {
            Singleton.Instance.Handle[e.Message.Event](e);
        }

    }
}
}
private string MyFunction(string inputstring){}
命名空间控制台应用程序9
{
班级计划
{
静态void Main(字符串[]参数)
{
汽车c=新车();
自行车b=新自行车();
}
}
公车
{
公共汽车
{
GetData G1=新的GetData();
字典D1=新字典();
G1.过程车辆(参考D1);
}
}
公共级自行车
{
公共自行车
{
GetData G2=新的GetData();
字典D2=新字典();
G2.工艺自行车(参考D2);
}
}
公营单身人士
{
私有静态单例实例;
公共字典句柄;
私人单身人士()
{
Handle=新字典();
}
公共静态单例实例
{
得到
{
if(实例==null)
{
instance=newsingleton();
}
返回实例;
}
}
}
公共类GetData
{
私有客户端套接字;
公共获取数据()
{
套接字=新客户端(“http://echo.jsontest.com/bicycles/10");
socket.Message+=消息;
}
公共自行车(参考字典返回率)
{
Singleton.Instance.Handle.Add(“bicycles”,(m)=>
{
Dictionary d=m.Message.Json.GetFirstArgAs()作为Dictionary;
//返回率=d;
});
}
公共车辆(参考字典返回率)
{
Singleton.Instance.Handle.Add(“cars”,(m)=>
{
Dictionary d=m.Message.Json.GetFirstArgAs()作为Dictionary;
//返回率=d;
});
}
私有无效消息(对象发送方,MessageEventArgs e)
{
if(Singleton.Instance.Handle.ContainsKey(e.Message.Event))
{
Singleton.Instance.Handle[e.Message.Event](e);
}
}
}
}

这是因为匿名方法体中使用但不在匿名方法体中的已用变量将是编译器生成的类中的公共字段。但可以引入局部变量以使其可编译:

public void Add(ref string rate)
{
    string r = rate;
    Handle.Add("1", (m) => 
    { 
        Console.WriteLine(m);
        r = m;
    });

    rate = r;
}
private string MyFunction(string inputstring){}
编译器将在后台生成:

public void Add(ref string rate)
{
    <>c__DisplayClass1 CS$<>8__locals2 = new <>c__DisplayClass1();
    CS$<>8__locals2.r = rate;
    this.Handle.Add("1", new Action<string>(CS$<>8__locals2.<Add>b__0));
    rate = CS$<>8__locals2.r;
}

[CompilerGenerated]
private sealed class <>c__DisplayClass1
{
    public string r;

    public void <Add>b__0(string m)
    {
        Console.WriteLine(m);
        this.r = m;
    }
}
private string MyFunction(string inputstring){}
public void Add(参考字符串速率)
{
c_uuuDisplayClass1 CS$8_uuulocals2=新的c_uuuDisplayClass1();
CS$8_uulocals2.r=费率;
this.Handle.Add(“1”,新操作(CS$8_ulocals2.b_u0));
费率=CS$8_uulocals2.r;
}
[编译生成]
专用密封c类显示器Class1
{
公共字符串r;
公共无效b__0(字符串m)
{
控制台写入线(m);
这个r=m;
}
}
注意:虽然可以编译,但它不会像您期望的那样工作,因为调用外部
Add
不会执行由
句柄添加的委托。Add
。要从内部委托返回
m
,必须使用
Func

应使用
Func
操作

private string MyFunction(string inputstring){}
操作
表示
无效函数(字符串s)
Func
表示
字符串函数(字符串s)

private string MyFunction(string inputstring){}
不过,这取决于您想要实现的用法。

您应该使用
Func(委托函数)
,它相当于接收字符串并返回字符串的函数

private string MyFunction(string inputstring){}
例如:

private string MyFunction(string inputstring){}
操作(委托操作)
对应于只接受输入而不返回任何内容的函数

private string MyFunction(string inputstring){}
    private void MyFunction(string inputstring){}
您可以将代码修改为

private string MyFunction(string inputstring){}
    private Dictionary<string, Func<string,string>> Handle;

    private string ReturnRate;
    public data()
    {
        Handle = new Dictionary<string, Func<string,string>>();

        Add(ref ReturnRate);

        Handle["1"]("MyValue");


        Console.WriteLine(ReturnRate);
    }
    public void Add(ref string rate)
    {
      string somevalue=rate;
        Handle.Add("1", (m) =>
        {
             Console.WriteLine(m);
            somevalue= m;
            return m;
        });


    }
私有字典句柄;
私有字符串返回率;
公共数据()
{
Handle=新字典();
添加(参考返回率);
句柄[“1”](“MyValue”);
控制台写入线(返回率);
}
公共无效添加(参考字符串速率)
{
字符串值=速率;
Handle.Add(“1”,(m)=>
{
控制台写入线(m);
somevalue=m;
返回m;
});
}

您必须自己传递操作,而不是使用ref参数创建操作。因此,您的Add方法简单地变成:

private string MyFunction(string inputstring){}
public void Add(Action<string> action) {
    Handle.Add("1", action);
}
这是一种,它可以用于一种异步编程。然而,这可能值得你花时间去阅读。如果你能给我们更多关于你的场景的信息,我们可能会给你更多的提示

private string MyFunction(string inputstring){}

如果您必须使用ref参数(出于某种奇怪的原因),我认为您运气不好…

它将在Add调用期间更改速率,而不是在实际的匿名方法期间更改速率call@Juan-我知道,我添加了注释部分以明确说明。所以你现在可以重新设置你的否决票了。@taffer你在回答中承认这实际上不起作用并不意味着他应该取消他的否决票。你承认代码不起作用这一事实意味着已经投票的人应该删除他们的投票。你建议让该方法返回一个值,然后忽略该返回值,以及让该方法修改一个在所有情况下都没有意义修改的变量,这将在该字典中的所有代理之间共享,导致他们在该变量上相互“争斗”。遵守您的建议吗?@A191919 OP实际上没有说明应用程序的预期行为,因此,没有真正的方法告诉他们如何实现他们没有描述的东西。所以,您想在这里实现一个围绕input by ref变量的闭包,并将其添加到您的dictornary中?如果是这样的话,你能提出一个简单、简洁的问题来回答这个问题吗?事实上,在这里,字典似乎是一个不必要的干扰…在你改变你的问题之后,看看它现在好点了吗?或者我应该试着把问题弄清楚,你们应该
private string MyFunction(string inputstring){}