基于params,ref,out的參數(shù)問(wèn)題詳解
最近在寫(xiě)程序時(shí)遇到params,ref,out 參數(shù)問(wèn)題?;仡^有自習(xí)看了看MSDN,才鞏固了基礎(chǔ)?,F(xiàn)在和大家分享一下。
params
params 關(guān)鍵字在方法成員的參數(shù)列表中使用,為該方法提供了參數(shù)個(gè)數(shù)可變的能力,它在只能出現(xiàn)一次并且不能在其后再有參數(shù)定義(之前可以)。
示例:
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
class App
{
//第一個(gè)參數(shù)必須是整型,但后面的參數(shù)個(gè)數(shù)是可變的。
//而且由于定的是object數(shù)組,所有的數(shù)據(jù)類型都可以做為參數(shù)傳入
public static void UseParams(int id, params object[] list)
{
Console.WriteLine(id);
for (int i = 0; i < list.Length; i++)
{
Console.WriteLine(list[i]);
}
}
static void Main()
{
//可變參數(shù)部分傳入了三個(gè)參數(shù),都是字符串類型
UseParams(1, "a", "b", "c");
//可變參數(shù)部分傳入了四個(gè)參數(shù),分別為字符串、整數(shù)、浮點(diǎn)數(shù)和雙精度浮點(diǎn)數(shù)數(shù)組
UseParams(2, "d", 100, 33.33, new double[] {1.1, 2.2});
Console.ReadLine();
}
}
}
ref
ref 關(guān)鍵字使參數(shù)按引用傳遞。其效果是,當(dāng)控制權(quán)傳遞回調(diào)用方法時(shí),在方法中對(duì)參數(shù)所做的任何更改都將反映在該變量中。
1.若要使用 ref 參數(shù),則方法定義和調(diào)用方法都必須顯式使用 ref 關(guān)鍵字。
2.傳遞到 ref 參數(shù)的參數(shù)必須最先初始化。這與 out 不同,out 的參數(shù)在傳遞之前不需要顯式初始化。
3.屬性不是變量,因此不能作為 ref 參數(shù)傳遞。
4.盡管 ref 和 out 在運(yùn)行時(shí)的處理方式不同,但它們?cè)诰幾g時(shí)的處理方式是相同的。因此,如果一個(gè)方法采用 ref 參數(shù),而另一個(gè)方法采用 out 參數(shù),則無(wú)法重載這兩個(gè)方法。例如,從編譯的角度來(lái)看,以下代碼中的兩個(gè)方法是完全相同的。如果嘗試這么做,將導(dǎo)致不能編譯該代碼。
5.如果一個(gè)方法采用 ref 或 out 參數(shù),而另一個(gè)方法不采用這兩類參數(shù),則可以進(jìn)行重載。
示例:
按引用傳遞值類型是有用的,但是 ref 對(duì)于傳遞引用類型也是很有用的。這允許被調(diào)用的方法修改該引用所引用的對(duì)象,因?yàn)橐帽旧硎前匆脕?lái)傳遞的。
using System;
class App
{
public static void UseRef(ref int i)
{
i += 100;
Console.WriteLine("i = {0}", i);
}
static void Main()
{
int i = 10;
// 查看調(diào)用方法之前的值
Console.WriteLine("Before the method calling: i = {0}", i);
UseRef(ref i);
// 查看調(diào)用方法之后的值
Console.WriteLine("After the method calling: i = {0}", i);
Console.Read();
}
}
out
out 關(guān)鍵字會(huì)導(dǎo)致參數(shù)通過(guò)引用來(lái)傳遞。這與 ref 關(guān)鍵字類似。
與 ref 的不同之處:
1.ref 要求變量必須在傳遞之前進(jìn)行初始化。
2.盡管作為 out 參數(shù)傳遞的變量不需要在傳遞之前進(jìn)行初始化,但需要調(diào)用方法以便在方法返回之前賦值。
示例:
與 ref 示例不同的地方只要將 ref 改為 out,然后變量 i 僅需要聲明即可。
static void Main()
{
//int i = 10; 改為
int i;
}
相關(guān)文章
使用linq to xml修改app.config示例(linq讀取xml)
這篇文章主要介紹了使用linq to xml修改app.config示例,需要的朋友可以參考下2014-02-02Unity腳本自動(dòng)添加頭部注釋的全過(guò)程
在一些公司需要代碼嚴(yán)格的管理,有時(shí)候會(huì)需要用到每個(gè)腳本的頭部做一些介紹,所以下面這篇文章主要給大家介紹了關(guān)于Unity腳本自動(dòng)添加頭部注釋的相關(guān)資料,需要的朋友可以參考下2022-01-01C# textbox實(shí)時(shí)輸入值檢測(cè)方式
這篇文章主要介紹了C# textbox實(shí)時(shí)輸入值檢測(cè)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07總結(jié)C#網(wǎng)絡(luò)編程中對(duì)于Cookie的設(shè)定要點(diǎn)
這篇文章主要介紹了總結(jié)C#網(wǎng)絡(luò)編程中對(duì)于Cookie的設(shè)定要點(diǎn),文中還給出了一個(gè)cookie操作實(shí)例僅供參照,需要的朋友可以參考下2016-04-04C#中的Task.Delay()和Thread.Sleep()區(qū)別(代碼案例)
Task.Delay(),async/await和CancellationTokenSource組合起來(lái)使用可以實(shí)現(xiàn)可控制的異步延遲。本文通過(guò)多種代碼案例給大家分析C#中的Task.Delay()和Thread.Sleep()知識(shí),感興趣的朋友一起看看吧2021-06-06WinForm實(shí)現(xiàn)最小化到系統(tǒng)托盤(pán)方法實(shí)例詳解
這篇文章主要介紹了WinForm實(shí)現(xiàn)最小化到系統(tǒng)托盤(pán)方法,實(shí)例分析了C#中實(shí)現(xiàn)WinForm最小化到系統(tǒng)托盤(pán)所需的相關(guān)控件與使用技巧,需要的朋友可以參考下2015-05-05