2015-01-04 49 views
0

我努力理解代表和該委託我創建了一個簡單的例子,爲自己,但它不工作,我希望它的方式,這裏是我的例如:如何通過兩項功能,其他功能與在C#中的參數

我的功能:

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); 

    } 
} 

主營:

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); 

    } 
} 

問題是控制檯窗口不顯示我傳遞的字符串,而不是它顯示了下述文字:

MyDelegateMethodInMethod.DelClass + StrDelegate MyDelegateMethodInMethod.DelClass + StrDelegate

當我嘗試像這樣在StringCon體中調用傳遞函數:

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

編譯器co說明「委託'StrDelegate'不接受0參數」,但我不想在StringCon的傳遞參數中傳遞參數,我想在我的主函數中這樣做,甚至可以通過委託來實現嗎?

+0

它怎麼能起作用?在StringCon()中,FName和LName是委託(方法),但沒有數據(字符串)可以操作。 – 2015-01-04 13:08:50

+1

我相信你的邏輯中的缺陷是調用一個委託會將委託設置爲返回值。事實並非如此。當您調用委託時,它立即返回值。 – juharr 2015-01-04 13:14:21

回答

2

如果你不希望傳遞一個字符串作爲輸入,您應恰當地宣佈代表:

class DelClass 
{ 
    public delegate string StrDelegate(); 
    public void StringCon(StrDelegate Fname,StrDelegate Lname) 
    { 
     Console.WriteLine(Fname() + " " + Lname()); 
    } 
} 

從你寫的,你要保存在某個地方的字符串屬性 - 但委託是不是地方做it.You可以創建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); 
    } 
} 
+0

他明確提到這是行不通的 – Icepickle 2015-01-04 13:00:28

+0

Icepickle - 你是對的,我相應地糾正了。我一讀就錯過了。 – ShayD 2015-01-04 13:13:10

2

這是不是真的,你應該如何使用委託,代表們主要用作回調函數或事件處理,或當你想調用一個函數。

的事件處理程序的一個例子是

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應用程序中運行的線程調用後調用一個方法(例如)

public void RunThread() 
{ 
    // assuming TextBox1 exists on the form 
    Thread t = new Thread(() => { 
     SetText(TextBox1, "Hello World"); 
    }); 
    t.Start(); 
} 
7

委託是包含對方法的引用的對象。調用委託具有執行該方法的效果。您的兩種方法各有一個參數String,以便執行通過的那些方法中的任一個傳遞單個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")); 
} 

這是一個非常貧窮的示範,但因爲你的方法不會做任何有用的事情。如何定義一個方法做這樣的一些有用的東西:

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")); 
+0

Jmc,+1用於解釋*委託是表示對具有特定參數列表和返回類型的方法的引用的類型。當您實例化委託時,可以將其實例與具有兼容簽名和返回類型的任何方法相關聯。您可以通過委託實例調用(或調用)該方法*(Microsoft doc)實際上意味着*委託是包含對方法的引用的對象。調用委託具有執行該方法的效果。* LOL我可以明白爲什麼人們無法理解代表。 – BobRodes 2015-01-04 14:53:26