如何通过C#中的参数委托将两个函数传递给另一个函数

Ham*_*lla 0 c# delegates

我正在努力理解代表,为此我为自己创建了一个简单的例子,但它不能按照我想要的方式工作,这是我的例子:

我的职责:

class Functions
{

    public string MyFname(string MyString) 
    {

        return MyString;


    }
    public string MyLname(string MyString)
    {

        return MyString;


    }


}
Run Code Online (Sandbox Code Playgroud)

代表:

class DelClass
{
    public delegate string StrDelegate(string OutPutString);

    public void StringCon(StrDelegate Fname,StrDelegate Lname) 
    {

        Console.WriteLine(Fname + " " + Lname);

    }
}
Run Code Online (Sandbox Code Playgroud)

主要:

class Program
{
    static void Main(string[] args)
    {
        DelClass MyDel = new DelClass();
        Functions MyTster = new Functions();
        DelClass.StrDelegate Name = new DelClass.StrDelegate(MyTster.MyFname);
        Name("SomeVariableName");
        DelClass.StrDelegate Family = new DelClass.StrDelegate(MyTster.MyLname);
        Family("SomeVariableFamilyName");
        MyDel.StringCon(Name, Family);

    }
}
Run Code Online (Sandbox Code Playgroud)

问题是控制台窗口没有显示我传递的字符串,而是显示下面提到的文本:

MyDelegateMethodInMethod.DelClass + StrDelegate MyDelegateMethodInMethod.DelClass + StrDelegate

当我尝试在StringCon体中调用传递的函数时,如下所示:

Console.WriteLine(Fname() + " " + Lname();
Run Code Online (Sandbox Code Playgroud)

编译器抱怨"委托'StrDelegate'不接受0参数"但我不想在StringCon的传递参数中传递参数,我想在我的Main函数中执行它,这是否可以与委托一起使用?

jmc*_*ney 7

委托是包含对方法的引用的对象.调用委托具有执行该方法的效果.你的两个方法都有一个String参数,所以执行你传递的那些方法中的任何一个传递一个String参数.这意味着,当您调用代理时,他们需要将一个String参数传递给它们执行的方法.你认为这个价值来自哪里?代表们不会凭空掏空.您必须在调用它时将其传递给委托.在这段代码中:

public void StringCon(StrDelegate Fname,StrDelegate Lname) 
{
    Console.WriteLine(Fname + " " + Lname);
}
Run Code Online (Sandbox Code Playgroud)

你在哪做什么?你不是.您必须向委托提供参数,以便它们将它们提供给方法:

public void StringCon(StrDelegate Fname,StrDelegate Lname) 
{
    Console.WriteLine(Fname("John") + " " + Lname("Doe"));
}
Run Code Online (Sandbox Code Playgroud)

这是一个非常糟糕的演示,因为你的方法并没有真正做任何有用的事情.如何定义一个方法做了这样有用的事情:

public string GetFullName(string givenName, string familyName)
{
    return givenName + " " + familyName;
}
Run Code Online (Sandbox Code Playgroud)

和相应的代表:

public delegate string FullNameGetter(string givenName, string familyName);
Run Code Online (Sandbox Code Playgroud)

然后像这样调用它:

var fng = new FullNameGetter(GetFullName);

Console.WriteLine(fng("John", "Doe"));
Run Code Online (Sandbox Code Playgroud)