[英]Best practice with dynamic string/List<string> parameters
我想傳遞string
或List<string>
作為參數,就像我在JavaScript中可以做的那樣,然后評估它的類型並執行適當的操作。 現在我可以這樣做:
public static class TestParser
{
static void Parse(string inputFile)
{
// Lots of code goes in here
}
static void Parse(List<string> inputFileList)
{
// Lots of code goes in here too
}
}
這些方法中的代碼是什么,基本上解析一些程序或一個文件或文件列表,取決於給出的類型。
如果我有很多代碼,我應該復制它,還是應該創建包含代碼的sub方法,還是有另一種很酷的方式我可以在c#中執行此操作?
取決於Parse()應該做什么,合理的模式可能是
static void Parse(string inputFile)
{
// Lots of code goes in here
}
static void Parse(List<string> inputFileList)
{
foreach (var inputFile in inputFileList)
Parse(inputFile);
}
UPDATE
已建議替代方法創建new List<string>() { inputFile}
並調用Parse(List<string>)
而不是將處理代碼分離為單獨的方法。
static void Parse(List<string> inputFileList)
{
// Lots of code goes in here too
}
static void Parse(string inputFile)
{
Parse(new List<string>() { inputFile });
}
幾乎在所有情況下,這只是一個風格問題。 我更喜歡我的解決方案,因為乍一看(至少對我來說)更清楚,因為我已經在非常高容量的系統上工作,其中CLR處理短期對象的能力成為性能問題。 99.99%的性能關鍵應用程序不會遇到該特定問題。
任何性能差異只會在您將CLR的CG推到斷點時進行如此大量的單獨調用時才會顯現。 如果你對該方法的調用量適中甚至很高// Lots of code goes in here
的處理時間// Lots of code goes in here
可能會使創建新列表的性能成本幾乎無法估量。
對於幾乎所有情況,這兩種方法僅在風格上有所不同,並且都是合適的。
像你一樣寫你的解析方法
然后從循環方法中調用它
public static class TestParser
{
static void Parse(string InputFile)
{
// Lots of code goes in here
}
static void Parse(List<string> InputFileList)
{
foreach(string path in InputFileList)
{
Parse(path);
}
}
}
List<T>
,在內部,不是列表(在CS意義上)。 這是一個根據需要重新分配的數組。 假設核心解析邏輯是相同的,無論該方法是否傳遞了1,2或更多字符串,我會做這樣的事情,實現處理單個項目的邏輯:
static void Parse( string s )
{
// core logic for processing an individual item
}
然后添加合適的重載。 我先添加通用版本:
static void Parse( params string[] list )
{
Parse( (IEnumerable<string> list ) ;
}
static void Parse( IEnumerable<T> list )
{
foreach( string s in list )
{
Parse(s) ;
}
return ;
}
上面的第一個版本( params string[]
)允許您使用可變數量的參數調用方法:
Parse( "foo" , "bar" ) ;
Parse( "foo" , "bar" , "baz" , "bat" ) ;
上面的第二個版本( IEnumerable<T>
)接受任何實現IEnumerable<T>
:幾乎任何標准集合,所以它會接受如下內容:
List<string> listOfStrings = PopulateList() ;
Parse( listOfStrings ) ;
string[] arrayOfStrings = listOfStrings().ToArray() ;
Parse( arrayOfStrings ) ;
更不用說像HashSet<string>
, TreeSet<string>
等。
您甚至可以使用LINQ的延遲執行此過載:
public static IEnumerable<string> ReadStringsFromFile( string fileName )
{
using ( StreamReader reader = File.OpenText( fn ) )
{
string s ;
while ( null != (s=reader.ReadLine()) )
{
yield return s ;
}
}
}
...
Parse( ReadStringsFromFile() ) ;
將方法鏈接在一起:文件將一次讀取一行,每行單獨處理。
您還可以編寫一個擴展方法,以便將方法調用鏈接在一起:
public static void ParseEach( this IEnumerable<T> string strings )
{
foreach ( string s in strings )
{
Parse(s) ;
}
}
這讓你說的像
ReadStringsFromFile().ParseEach() ;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.