2011-09-09 54 views
3

正如在Microsoft網站上所描述的,String.Format將一些字符串變量排列成單個字符串,並且是另一種如何在c#中串聯字符串的方式。如何處理String.Format方法?

string.Format("Name = {0} Surname = {1}",name,surname); 

我的問題是這樣的工作? 這個方法是一個特殊的方法,我可以創建一個類似於這個方法的方法,它只在每一個{n}處接受一個I​​nteger。 或者編譯器以不同的方式解釋此方法,如果是,則編譯器如何訪問此方法。

如果有可能我想看看,編譯器如何解釋此方法。

PS:它如何工作,什麼時候可以發送儘可能多的參數?

[編輯] 這是否意味着,這需要的String.Format第一個參數,過濾器的使用正則表達式或任何工具(拆分等):獲得其中{數}爲和地點有來自第二字符串令牌params部分?

回答

4

發送可變數量的參數的方法是這樣完成的:

public static string MyStringFormat(string formatString, params object [] args) 
{ 

} 

現在,您可以通過許多參數,你喜歡這樣的:

MyStringFormat("{0}{1}",42,"Hello World") 
MyStringFormat("{0}{1}{2}",42,"Hello World",999.9) 

在這個方法中,這些參數只是一個數組(在這種情況下爲object)。 here are the docs關於params的關鍵字。

至於寫你自己的方法來接受像Format數字輸入不,這將是(使用正則表達式)的一種方法:

public static string MyStringFormat(string formatString, params object[] args) 
    { 
     var regex = new Regex("{([0-9]*)}"); 
     return regex.Replace(formatString,m => 
          { 
           int index = int.Parse(m.Groups[1].Value); 
           if(index<args.Length) 
            return args[index].ToString(); 
           return String.Empty; 
          }); 
    } 

活生生的例子:http://rextester.com/rundotnet?code=OMZC13551

1

這是一個正常的功能。

它解析字符串並在傳入參數(如果需要)上調用ToString以構造新字符串。

你在你的例子有過載的簽名是:

public static string Format(
    string format, 
    params Object[] args 
) 

沒有什麼可以阻止你創建你自己的(雖然我可能只是委託給內置的string.Format)。

+0

是正確的,但如何做,編譯器將這些串入{0},它是一種特殊的語法,i've從來沒有看到過這個地方的另一個地方? – Burimi

+1

@Cody - 編譯器不。 _.Format_方法。它對字符串進行解析,將其分解爲標記,並從標記和傳入的參數中重建一個新字符串。它不是編譯器。 – Oded

1

科迪沒有魔法,看看這個方法:

public static void UseParams(params int[] list) 
    { 
     for (int i = 0 ; i < list.Length; i++) 
     { 
      Console.WriteLine(list[i]); 
     } 
     Console.WriteLine(); 
    } 

,你可以把它傳遞儘可能多的詮釋你喜歡,它是params參數類型:)

編輯:

params爲非常有用它允許我們,例如,傳遞給我們以動態方式記錄包裝所有方法的參數值,而不知道每個方法有多少個參數值,然後記錄器將使用Reflection逐個轉儲所有這些值以查找參​​數名稱。

+0

這是偉大的,我從來沒有發現,從來沒有聽說過參數! – Burimi

+1

以及關於{x}的解析,它是.NET中的默認方式,例如可以在數字的ToString重載中指定舍入和數字格式選項。 –

0

的String.Format的簽名看起來是這樣的:

public static string Format (string format, params Object[] args) 

注意的第二個參數,標有params關鍵字。該函數提供了在調用函數時添加多個參數的功能。在函數內部,你可以在args數組訪問由索引或迭代參數:

public static string Format (string format, params Object[] args) 
{ 
    foreach (Object o in args) 
     Console.WriteLine(o); 
} 

看一看的C# Reference

1

字符串中的大括號是佔位符,其中的數字表示要替換的參數的索引。

格式爲(string format, params object[] args)類型,它是此object[]中的索引,這很有幫助。

(我認爲它在內部使用StringBuilder.AppendFormat)用於替代那些值)