## - 結論 先上結論,答案是yes,C#中數組確實具有out參數的特性。 ## - 疑問 最近開發一個上位機的功能,有段代碼看得我一直很迷糊,我的認識,函數的執行結果,要麼在函數中通過return返回,要麼通過out或ref參數返回。這段代碼中明顯沒有通過return獲取返回值,輸入參數倒是看起 ...
- 結論
先上結論,答案是yes,C#中數組確實具有out參數的特性。
- 疑問
最近開發一個上位機的功能,有段代碼看得我一直很迷糊,我的認識,函數的執行結果,要麼在函數中通過return返回,要麼通過out或ref參數返回。這段代碼中明顯沒有通過return獲取返回值,輸入參數倒是看起來很像out返回值,但是我反覆確認了N遍,定義就是沒有out或ref類型。這就很是疑惑了,只好先放一邊,先把它當做out參數取返回值理解去完成開發,今天有空終於把這個疑問摸清楚了。
- 驗證
各種百度,網上並沒有答案。於是參照原來的代碼寫了一段Console程式,發現輸入參數(位元組數組)還真是在函數中更改後返回最新值了。此時原先的不明就裡已經確定為就是【位元組數組】的原因了,最初懷疑是Byte類型的原因,在程式中驗證後發現並不是,然後用非位元組類型的數組驗證了下,仍然能在實參中取到函數更新後的值,確定為就是數組的原因。此時已經有點懷疑引用類型值類型的原因了,但是不對啊,平時引用類型string用的這麼多,印象中並不會返回值啊,通過程式驗證,也確定string參數沒有out參數的特性,這就不得其解了。。直到搜到一篇文章,說string類型是一種特殊的引用類型,其實此處就等於是值傳遞,所有的謎團才清晰了。原因就在於參數分傳值與傳址兩種,數組為引用類型,是按地址傳遞的,所以具備out參數的特性。
點擊查看代碼
class Pr
{
private static byte[] m_byBuff = new byte[2048];
static void Main(string[] args)
{
byte[] barr_read = new byte[1024];
int int_read = 0;
byte byte_read=0;
int[] iarr_read = new int[10];
string str_read = "0";
bool r = DataProcess(barr_read);
bool r1 = DataProcess(int_read);
bool r2 = DataProcess(byte_read);
bool r3 = DataProcess(str_read);
//向控制台輸出
System.Console.WriteLine("數組類型實參傳參後值(傳參前為0,傳參函數中有賦值):");
System.Console.WriteLine("arr[0]:{0}",barr_read[0].ToString());
System.Console.WriteLine("arr[1]:{0}", barr_read[1].ToString());
System.Console.WriteLine("arr[2]:{0}", barr_read[2].ToString());
System.Console.WriteLine("arr[3]:{0}", barr_read[3].ToString());
System.Console.WriteLine("int類型實參傳參後值(傳參前為0,傳參函數中有賦值):");
System.Console.WriteLine(int_read.ToString());
System.Console.WriteLine("byte類型實參傳參後值(傳參前為0,傳參函數中有賦值):");
System.Console.WriteLine(byte_read.ToString());
System.Console.WriteLine("string類型實參傳參後值(傳參前為‘0’,傳參函數中有賦值):");
System.Console.WriteLine(str_read);
}
//Main是static的,因此aa也要申明為static,否則無法訪問
private static bool DataProcess(byte[] outbuff)
{
outbuff[0] = (byte)1;
outbuff[1] = (byte)2;
outbuff[2] = (byte)3;
outbuff[3] = (byte)4;
return true;
}
private static bool DataProcess(int[] outbuff)
{
outbuff[0] = 11;
outbuff[1] = 12;
outbuff[2] = 13;
outbuff[3] = 14;
return true;
}
private static bool DataProcess(int outbuff)
{
outbuff=10;
return true;
}
private static bool DataProcess(byte outbuff)
{
outbuff = 20;
return true;
}
private static bool DataProcess(string outbuff)
{
outbuff = "30";;
return true;
}
}
- 參考
https://blog.csdn.net/weixin_44806070/article/details/107882525
https://www.cnblogs.com/mdnx/archive/2012/09/04/2671060.html