2010-07-21 63 views
2

我想要做的是能夠將任意數量的變量傳遞給一個函數,在函數內部操縱這些變量,並可以訪問功能範圍之外的操作。有沒有辦法在C#中實現「void func(out params object [] parameters)」#

void FunctionA() 
{ 
    int x = 1; 
    string s = "blah"; 
    int y = 4; 
    FunctionB(out x, out s, out y); 
    Console.WriteLine("{0}, {1}, {2}", x, s, y); 
} 
void FunctionB(out params object[] parameters) 
{ 
    for(int ii = 0; ii < parameters.Length; ii++) 
    { 
     if(parameters[ii] is int) parameters[ii] = (int)parameters[ii] + 1; 
    } 
} 

調用泛函()之後在控制檯上應該有 「2,等等,5」。有沒有辦法做到這一點,返回一個對象[]並解析出我想要的變量?

爲了澄清,這裏是我正在嘗試做的。將一個byte []與一系列變量一起傳遞給一個函數。嘗試從字節[]中讀取信息並將其分配給傳入的變量。因此,如果我有一個int,一個字符串,並將另一個int寫入字節[],並且我傳入如下內容:

int x, y; 
string s; 
byte[] info = ...; 
FunctionB(info, x, s, y); 
Console.WriteLine("{0}, {1}, {2}", x, s, y); 

它會輸出來自byte []的信息。

+0

這不會編譯/工作嗎? – 2010-07-21 21:49:03

+0

不編譯。 「參數不能包含所有指定的修飾符;參數上的修飾符太多」參數「上的錯誤」 – mphair 2010-07-21 21:51:36

回答

4

不,你不能。

在這裏你有一個輸出參數,而你想要幾個單獨的輸出參數。 C#不支持通過params ...和params是獲取不同數量參數的唯一方式,除非您希望將其重載至最大數量的參數。

params將始終將參數的複製到新數組中。此時他們與原始變量分離。

+0

不將函數B(out int a,out string b,out int c)計數爲幾個單獨的輸出參數?因爲這確實有效......我只是不知道如何使輸出參數的數量變爲動態。 – mphair 2010-07-21 21:53:08

+0

@mphair:是的,這是幾個輸出參數 - 但不是通過params。對不清楚的道歉。將編輯。 – 2010-07-21 21:55:11

+5

原因是因爲*如果可能有一個變量引用的數組,那麼該數組可能會比對堆棧上的變量的引用壽命更長。*這是C程序中一個非常常見的錯誤;它在CLR程序中永遠不會發生,因爲根本不可能保持這樣的參考。 – 2010-07-21 21:58:03

0

你確定你需要嗎?你能給我們真實的代碼嗎?這從我可以告訴你什麼張貼...

void Main() 
{ 
    object [] f = new object []{ 1, "blah", 4 }; 
    Test(f); 
    Console.WriteLine("{0}, {1}, {2}", f[0], f[1], f[2]); 
    // output 
    // 2, blah, 5 

} 

void Test (object[] parameters) 
{ 
    for(int ii = 0; ii < parameters.Length; ii++) 
    { 
     if(parameters[ii] is int) 
      parameters[ii] = (int)parameters[ii] + 1; 
    } 
} 
+0

問題在於,在將兩個整數和字符串包含在對象[]中後,我需要將它們解析出來。該解決方案與使Test(object [])返回對象[]相似。使用out關鍵字的想法是,我不需要做任何解析......只需將一些變量放入它中,然後立即開始使用它們。 – mphair 2010-07-21 22:03:57

+0

對不起,我沒有看到解析的需要?更多的代碼將有助於... – 2010-07-21 22:05:20

+0

通過解析,我的意思是不得不調用f [0] vs x。另外,在將代碼發送給該函數之前,使用您的代碼,我將不得不將所有我想要的東西打包到一個對象[]中。這是我試圖解決的問題。 – mphair 2010-07-21 22:11:21

0

只是如此你知道,你的「澄清」是完全不同於你原來的問題。這聽起來像你正試圖編寫反序列化代碼。首先,閱讀MSDN Serialization文檔以更多地瞭解.NET可以提供的功能。如果創建自反序列化對象是矯枉過正您的具體情況,你應該考慮使用BinaryReader讀取數據:

byte[] info... 
int x; 
string s; 
int y; 

using (BinaryReader reader = new BinaryReader(new MemoryStream(info))) 
{ 
    x = reader.ReadInt32(); 
    s = reader.ReadString(); 
    y = reader.ReadInt32(); 
} 

請注意,您可能必須建立在BinaryReader.ReadeByte的頂部自己的函數()如果您的數據編碼與BinaryReader預期的不匹配。還要注意,從緩衝區填充「一堆變量」的函數具有一些代碼嗅覺......當然,這些變量是以某種方式相關的,並且您有機會定義一個類(使用解串器!),它代表無論那個概念是什麼。

+0

是的,我試圖將MemoryStream/BinaryReader/BinaryWriter調用整合到一個通用的靜態類中。調用MemoryStream後ostream = new MemoryStream(); BinaryWriter writer = new BinaryWriter(ostream); writer.Write(...); Writer.Write(...); ...一堆次,我試圖做一個通用的讀/寫調用,以便我可以傳入儘可能多的參數,並得到一個字節[] ...或傳遞一個字節[]和儘可能多的變量,我想從字節[]中讀出。我有能力序列化...我只是想簡化它。 – mphair 2010-07-22 15:13:42

+0

你是否控制你正在閱讀的二進制格式?如果是這樣,利用內置的.NET序列化代碼將是最簡單的。你所要做的就是將這些字段標記爲序列化,並讓.NET處理其餘的部分。 – JaredReisinger 2010-07-23 00:54:34

相關問題