C# 在C中,如何使用参数的委托将两个函数传递给另一个函数#

C# 在C中,如何使用参数的委托将两个函数传递给另一个函数#,c#,delegates,C#,Delegates,我正在努力理解代表,为此我为自己创建了一个简单的示例,但它没有按照我希望的方式工作,以下是我的示例: 我的职能: class Functions { public string MyFname(string MyString) { return MyString; } public string MyLname(string MyString) { return MyString; } } 代表

我正在努力理解代表,为此我为自己创建了一个简单的示例,但它没有按照我希望的方式工作,以下是我的示例:

我的职能:

class Functions
{

    public string MyFname(string MyString) 
    {

        return MyString;


    }
    public string MyLname(string MyString)
    {

        return MyString;


    }


}
代表:

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

    public void StringCon(StrDelegate Fname,StrDelegate Lname) 
    {

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

    }
}
public delegate string FullNameGetter(string givenName, string familyName);
主要内容:

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

MyDelegateMethodInMethod.DelClass+StrDelegate MyDelegateMethodInMethod.DelClass+ StrDelegate

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

Console.WriteLine(Fname() + " " + Lname();
public string GetFullName(string givenName, string familyName)
{
    return givenName + " " + familyName;
}

编译器抱怨“委托'StrDelegate'不接受0个参数”,但我不想在StringCon传递的参数中传递参数,我想在我的主函数中传递参数,这对委托是否可行?

如果不想将字符串作为输入传递,则应适当声明委托:

class DelClass
{
    public delegate string StrDelegate();
    public void StringCon(StrDelegate Fname,StrDelegate Lname) 
    {
        Console.WriteLine(Fname() + " " + Lname());
    }
}
根据您编写的内容,您希望将字符串属性保存在某个位置,但委托不是执行此操作的位置。您可以使用FName、LName属性创建对象:

class Functions
{
    public string MyFname() { return MyFnameProperty; }
    public string MyLname() { return MyLnameProperty; }
    public string MyFnameProperty { get; set; }
    public string MyLnameProperty { get; set; }
}
最后,你将主要写下:

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

这并不是您应该如何使用委托,委托主要用作回调函数、事件处理程序或调用函数

EventHandler的一个示例可以是

public delegate void ReportErrorDelegate(object sender, MyCustomEventArgs e);
带着一个班级

public class MyCustomEventArgs : EventArgs
{
     // some implementation
     public MyCustomEventArgs() 
     {
     }

     public MyCustomEventArgs(object argument)
         : this()
     {
         ....
     }
}
之后,您可以创建一个事件,该事件基于您的委托作为

public interface IRaiseMyCustomEventArgs
{
     event ReportErrorDelegate CustomEventFired;
}
然后您可以将其实现为

public class RaiseMyCustomEventArgs : IRaiseMyCustomEventArgs
{
     public event ReportErrorDelegate CustomEventFired;

     protected virtual void RaiseCustomEventArgs(object argument)
     {
         var local = CustomEventFired;
         if (local != null) {
             local.Invoke(this, new MyCustomEventArgs(argument));
         }
     }
}
另一种选择是在检测到需要调用UI交互后调用方法,如

public delegate void SetTextDelegate(TextBox tb, string text);

public void SetText(TextBox tb, string text)
{
     if (tb.InvokeRequired) 
     {
          tb.Invoke(new SetTextDelegate(SetText), tb, text);
          return;
     }
     tb.Text = text;
}
这将从运行在windows应用程序中的线程调用(例如)


委托是包含对方法的引用的对象。调用委托具有执行方法的效果。您的两个方法都有一个
String
参数,因此要执行您传递的任何一个
String
参数。这意味着,当您调用委托时,它们需要向执行的方法传递单个
字符串
参数。你认为价值将从何而来?该代表不会无中生有。您必须在调用委托时将其传递给委托。在此代码中:

public void StringCon(StrDelegate Fname,StrDelegate Lname) 
{
    Console.WriteLine(Fname + " " + Lname);
}
你在哪里做的?你不是。您必须向委托提供参数,以便委托向方法提供参数:

public void StringCon(StrDelegate Fname,StrDelegate Lname) 
{
    Console.WriteLine(Fname("John") + " " + Lname("Doe"));
}
不过,这是一个非常糟糕的演示,因为您的方法实际上没有做任何有用的事情。定义一个方法如何做一些有用的事情,比如:

Console.WriteLine(Fname() + " " + Lname();
public string GetFullName(string givenName, string familyName)
{
    return givenName + " " + familyName;
}
和相应的代表:

public delegate string FullNameGetter(string givenName, string familyName);
然后像这样调用它:

var fng = new FullNameGetter(GetFullName);

Console.WriteLine(fng("John", "Doe"));

它怎么能工作?在StringCon()中,FName和LName是委托(方法),但看不到可操作的数据(字符串)。我相信逻辑中的缺陷在于调用委托会将委托设置为返回值。事实并非如此。当你调用一个委托时,它会立即返回值。Icepickle-你是对的,我做了相应的更正。我在first read.Jmc中没有提到+1,因为它解释了委托是一种表示对具有特定参数列表和返回类型的方法的引用的类型。实例化委托时,可以将其实例与具有兼容签名和返回类型的任何方法相关联。您可以通过委托实例调用(或调用)该方法。(Microsoft doc)实际上意味着委托是一个包含方法引用的对象。调用委托具有执行方法的效果。哈哈,我明白为什么人们在理解代理时会有困难。