我正在努力理解代表,为此我为自己创建了一个简单的例子,但它不能按照我想要的方式工作,这是我的例子:
我的职责:
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函数中执行它,这是否可以与委托一起使用?
委托是包含对方法的引用的对象.调用委托具有执行该方法的效果.你的两个方法都有一个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)
| 归档时间: |
|
| 查看次数: |
729 次 |
| 最近记录: |