2011-04-06 66 views
3

c#/ .net中是否需要多個返回參數?具有多個返回參數的C#方法

public string, string GetFirstNameAndLastName(int id) 
{ 
    var person = from p in People 
       where p.Id = id 
       select p; 
    return(p.FirstName, p.LastName); 
} 

用法:

public void Main(string[] args) 
{ 
    string firstName, lastName; 
    (firstName, lastName) = GetFirstNameAndLastName(1); 

    Console.WriteLine(firstName + ", " + lastName); 
} 
+0

爲什麼你需要將firstName&lastName作爲單獨的值返回?它們不應該在Person實例中表示嗎? FirstName和LastName是Person對象的屬性。 – 2011-04-06 04:44:27

回答

4

至於建議的@James Webster你可以使用元組,也可以使用dynamicExpandoObject

class Program 
{ 
    static void Main(string[] args) 
    { 
     var d = GetUserDynamic(); 
     Console.WriteLine("{0}.{1}", d.FirstName, d.LastName); 
    } 

    private static dynamic GetUserDynamic() 
    { 
     dynamic d = new ExpandoObject(); 
     d.FirstName = "amandeep"; 
     d.LastName = "tur"; 
     return d; 
    } 
} 
+0

我喜歡這個解決方案,它簡單易懂,明顯的缺點是沒有靜態類型檢查 – 2011-04-07 01:11:23

+0

@Jonathan Parker如果你沒有什麼回報,那麼你不應該太擔心。 – TheVillageIdiot 2011-04-07 11:59:40

5

沒有,只是用out參數。

public void GetFirstNameAndLastName(int id, out string first, out string last) 
{ 
    var person = from p in People 
       where p.Id = id 
       select p; 
    first = p.FirstName; 
    last = p.LastName; 
} 
+0

你的函數簽名看起來很可疑 – user492238 2011-04-06 04:41:35

+0

我看不出其他答案的原因,這個看起來很明顯,簡單,直截了當。 – 2011-04-06 04:44:26

+0

@ user492238:是的,在那裏複製並粘貼了一些東西。 :-) – 2011-04-06 05:36:20

-1

你可以做你想做的是這樣的:

public void GetFirstNameAndLastName(int id, out string firstName, out string lastName) 
{ 
    var person = from p in People 
       where p.Id = id 
       select p; 
    firstName = p.FirstName; 
    lastName = p.LastName; 
} 

,然後調用它像這樣:

public void Main(string[] args) 
{ 
    string firstName, lastName; 
    GetFirstNameAndLastName(1, out firstName, out lastName); 

    Console.WriteLine(firstName + ", " + lastName); 
} 
+0

誰對此做了-1?我不是一個超級參數的粉絲,但我希望聽到這位下來的選民。 – peter 2011-04-07 23:21:26

7

您可以在使用元組時尚輕巧達到這個C#4.0

public Tuple<string, string> GetFirstNameAndLastName(int id) 
{ 
    var person = from p in People 
      where p.Id = id 
      select p; 
    return new Tuple<string, string>(p.FirstName, p.LastName); 

    // OR 
    // return Tuple.Create(p.FirstName, p.LastName); 
} 

System.Tuple還具有與F#本地元組類型互操作的好處(當然,它是F#的本地元組類型,它恰好是用於聲明返回它們的元組和函數的F#特定語法支持)。

鑑於多種方法在這裏的存在:System.Tuple,多out參數或者返回POCO與FirstNameLastName性質,我懷疑安德斯·海爾斯伯格很可能不會增加對多個返回值的明確支持。

+0

@James我相信你可以使用Tuple.Create(p.FirstName,p。姓氏)​​以避免必須指定通用參數。 – 2011-04-06 04:35:23

+0

是的,只是更新,以反映;-) – 2011-04-06 04:35:56

+0

@詹姆斯:元組唯一的問題是令人討厭的'.Item1'和'.Item2'屬性來獲取組件。使代碼可讀性稍差。 – 2011-04-06 04:37:56

1

不可以。如果元素是相關的,您應該返回更有用的數據類型,如類。

public MyPersonClassGetFirstNameAndLastName(int id) 
{ 
    var person = from p in People 
       where p.Id = id 
       select p; 

    MyPersonClassreturnValue = new MyPersonClass; 
    returnValue.FirstName = p.FirstName; 
    returnValue.LastName= p.LastName; 
    return returnValue; 
} 
0

取決於情況。你的情況,你可以返回,整個人回錄,

public string, string GetFirstNameAndLastName(int id) 
{ 
    var person = from p in People 
      where p.Id = id 
      select p; 
    return person; 
} 

,或者如果這種情形所需要它,你可以創建自己的數據類型。