① c#中ref到底有什麼作用.
其實,你也不用理解得多復雜!你只要知道,如果用上ref的話,操作的是同一個變數,所以會改變值,如果沒用上ref的話,操作的不是同一個變數,所以值不會改變。這就行了!其他的,以後學得深入了,你就會懂了!現在弄這些問題,只會令你學得很痛苦的!只不過用ref的話,調用的參數要在調用前就要初始化,初始化,你懂吧?就是賦值!
② C#中out和ref之間的區別
ref和out都是C#中的關鍵字,所實現的功能也差不多,都是指定一個參數按照引用傳遞。
對於編譯後的程序而言,它們之間沒有任何區別,也就是說它們只有語法區別。
總結起來,他們有如下語法區別:
1、ref傳進去的參數必須在調用前初始化,out不必,即:
int i;
SomeMethod( ref i );//語法錯誤
SomeMethod( out i );//通過
2、ref傳進去的參數在函數內部可以直接使用,而out不可:
public void SomeMethod(ref int i)
{
int j=i;//通過
//...
}
public void SomeMethod(out int i)
{
int j=i;//語法錯誤
}
3、ref傳進去的參數在函數內部可以不被修改,但out必須在離開函數體前進行賦值。
ref在參數傳遞之前必須初始化;而out則在傳遞前不必初始化,且在 ... 值類型與引用類型之間的轉換過程稱為裝箱與拆箱。
總結:
應該說,系統對ref的限制是更少一些的。out雖然不要求在調用前一定要初始化,但是其值在函數內部是不可見的,也就是不能使用通過out傳進來的值,並且一定要在函數內賦一個值。或者說函數承擔初始化這個變數的責任。
下面談談ref和out到底有什麼區別:
1 關於重載
原則:有out|ref關鍵字的方法可以與無out和ref關鍵字的方法構成重載;但如想在out和ref間重載,編譯器將提示:不能定義僅在ref和out的上的方法重載
2 關於調用前初始值
原則:ref作為參數的函數在調用前,實參必須賦初始值。否則編譯器將提示:使用了未賦值的局部變數;
out作為參數的函數在調用前,實參可以不賦初始值。
3 關於在函數內,引入的參數初始值問題
原則:在被調用函數內,out引入的參數在返回前至少賦值一次,否則編譯器將提示:使用了未賦值的out參數;
在被調用函數內,ref引入的參數在返回前不必為其賦初值。
總結:C#中的ref和out提供了值類型按引用進行傳遞的解決方案,當然引用類型也可以用ref和out修飾,但這樣已經失去了意義。因為引用數據類型本來就是傳遞的引用本身而非值的拷貝。ref和out關鍵字將告訴編譯器,現在傳遞的是參數的地址而不是參數本身,這和引用類型默認的傳遞方式是一樣的。同時,編譯器不允許out和ref之間構成重載,又充分說明out和ref的區別僅是編譯器角度的,他們生成的IL代碼是一樣的。有人或許疑問,和我剛開始學習的時候一樣的疑惑:值類型在託管堆中不會分配內存,為什麼可以按地址進行傳遞呢?值類型雖然活在線程的堆棧中,它本身代表的就是數據本身(而區別於引用數據類型本身不代表數據而是指向一個內存引用),但是值類型也有它自己的地址,即指針,現在用ref和out修飾後,傳遞的就是這個指針,所以可以實現修改後a,b的值真正的交換。這就是ref和out給我們帶來的好處。
首先:兩者都是按地址傳遞的,使用後都將改變原來參數的數值。
其次:rel可以把參數的數值傳遞進函數,但是out是要把參數清空,就是說你無法把一個數值從out傳遞進去的,out進去後,參數的數值為空,所以你必須初始化一次。這個就是兩個的區別,或者說就像有的網友說的,rel是有進有出,out是只出不進。
ref(C# 參考)
ref 關鍵字使參數按引用傳遞。其效果是,當控制權傳遞回調用方法時,在方法中對參數的任何更改都將反映在該變數中。若要使用 ref 參數,則方法定義和調用方法都必須顯式使用 ref 關鍵字。
例如:
class RefExample
{
static void Method(ref int i)
{
i = 44;
}
static void Main()
{
int val = 0;
Method(ref val);
// val is now 44
}
}
傳遞到 ref 參數的參數必須最先初始化。這與 out 不同,後者的參數在傳遞之前不需要顯式初始化。
盡管 ref 和 out 在運行時的處理方式不同,但在編譯時的處理方式相同。因此,如果一個方法採用 ref 參數,而另一個方法採用 out 參數,則無法重載這兩個方法。例如,從編譯的角度來看,以下代碼中的兩個方法是完全相同的,因此將不會編譯以下代碼:
class CS0663_Example
{
// Compiler error CS0663: "cannot define overloaded
// methods that differ only on ref and out".
public void SampleMethod(ref int i) { }
public void SampleMethod(out int i) { }
}
但是,如果一個方法採用 ref 或 out 參數,而另一個方法不採用這兩個參數,則可以進行重載,如下例所示:
class RefOutOverloadExample
{
public void SampleMethod(int i) { }
public void SampleMethod(ref int i) { }
}
out(C# 參考)
out 關鍵字會導致參數通過引用來傳遞。這與 ref 關鍵字類似,不同之處在於 ref 要求變數必須在傳遞之前進行初始化。若要使用 out 參數,方法定義和調用方法都必須顯式使用 out 關鍵字。
例如:
class OutExample
{
static void Method(out int i)
{
i = 44;
}
static void Main()
{
int value;
Method(out value);
// value is now 44
}
}
盡管作為 out 參數傳遞的變數不必在傳遞之前進行初始化,但需要調用方法以便在方法返回之前賦值。
ref 和 out 關鍵字在運行時的處理方式不同,但在編譯時的處理方式相同。因此,如果一個方法採用 ref 參數,而另一個方法採用 out 參數,則無法重載這兩個方法。例如,從編譯的角度來看,以下代碼中的兩個方法是完全相同的,因此將不會編譯以下代碼:
class CS0663_Example
{
// Compiler error CS0663: "Cannot define overloaded
// methods that differ only on ref and out".
public void SampleMethod(out int i) { }
public void SampleMethod(ref int i) { }
}
但是,如果一個方法採用 ref 或 out 參數,而另一個方法不採用這兩類參數,則可以進行重載,如下所示:
class RefOutOverloadExample
{
public void SampleMethod(int i) { }
public void SampleMethod(out int i) { }
}
③ c#中的void和ref到底代表了什麼意思,什麼時候使用
一、void 是C#中「無返回值函數"的定義。
eg.
publicvoidHello()
{
//sayhellohere
}
publicstringHello()
{
return"Hello";
}
你可以看到,兩個都是C#中的函數, 用void聲明的函數體不需要有返回值,而用類型聲明的函數體必須有對應類型的返回值(return ),否則編譯器會報錯。
二、ref關鍵字是用來定義引用變數傳遞的。
C#中的類型分為值類型 和 引用類型。我舉個簡單例子。
voidMain()
{
inta=1;
Sum(a);
a=?//運行到這里時a等於幾?
}
publicvoidSum(inta)
{
a=a+1;
}
這個void 中,傳入了a,然後對其+1; 但是如果只是這么寫 運行完Sum(a)之後, a還是=1。
因為在Void Main方法里, a = 1; 但是他把a傳遞給Sum(a)方法時,是傳遞的一個值進去,對於Main()方法來說,傳完之後就不再關注這個變數了,所以 a還是一直等於1。
但是將Sum方法改為:
publicvoidSum(refinta)
{
a=a+1;
}
ref int a 就是告訴編譯器, 這個int類型的變數a,是做引用傳遞的。
如果再用Main()調用Sum方法時, 運行之後 a = 2;
④ c#編程中關鍵字"ref"在什麼時候使用是在定義函數之後沒有設定返回值的時候使用嗎它的作用
還是以例子來說明吧;
1. ref:
int i =0;
有函數fun(ref i)和fun(i)
它們的函數體都是{ i = 3;},那麼在執行以下兩段代碼後:
(1)int i = 0; fun(i); System.Console.WriteLine(i.ToString());
(2)int i = 0; fun(ref i); System.Console.WriteLine(i.ToString());
(1)的輸出是1,(2)的輸出是3,
2. out:
int i; //注意,這里只是聲明了變數i,並沒有對其初始化
有函數fun(ref i)、fun(out i)和fun(i)
它們的函數體都是{ i = 3;},那麼在執行以下三段代碼後:
(1)int i = 0; fun(i); System.Console.WriteLine(i.ToString());
(2)int i = 0; fun(ref i); System.Console.WriteLine(i.ToString());
(3)int i = 0; fun(out i); System.Console.WriteLine(i.ToString());
(1)和(2)在編譯的時候都會報錯:錯誤 CS0165: 使用了未賦值的局部變數「i」
而(3)能正常編譯,而且輸出3
對於你的問題,的確,ref和out跟C/C++中的指針很類似,但是ref和out還是有區別的,主要就是在於ref應用的場合是已經有了一個變數了,想在另外一個函數里頭對其進行修改,這時只能用ref,out的話適用於函數想返回多個值的時候,比如一個函數做某個運算,結果是一個int,但是無論函數運行成功或失敗,它都會返回一個int,但我們在調用的時候還想知道函數的執行是否成功了,這個時候就可以用一個這樣的函數:int i; bool fun(out i); 通過fun函數返回的bool值可以知道函數執行是否成功,然後通過out的i我們可以知道函數運算得出的結果,因此一般情況out主要用於一個函數返回多個返回值的時候。
最後總結一下:
Ref和Out這兩個關鍵字都能夠提供相似的功效,其作用也很像C中的指針變數。稍有不同之處是:
使用Ref型參數時,傳入的參數必須先被初始化。而Out則不需要,對Out而言,就必須在方法中對其完成初始化。
使用Ref和Out時都必須注意,在方法的參數和執行方法時,都要加Ref或Out關鍵字。以滿足匹配。
Out更適合用在需要Return多個返回值的地方,而Ref則用在需要被調用的方法修改調用者的引用的時候。
⑤ REF是什麼意思
REF是Reference的縮寫,為參考尺寸的意思。
參考尺寸依ASME Y14.5上的定義是:在別處已有標示的尺寸,為了看圖人的方便,在其他位置重復標示的尺寸。可以由現有尺寸計算出來的尺寸,但也是為了看圖人的方便,而標示的尺寸。參考尺寸是不可量測的。
(5)ref關鍵字用於告訴編譯器擴展閱讀:
尺寸標注基本規則:
1、機件的真實大小應以圖樣上所注的尺寸數值為依據,與圖形的大小及繪圖的准確度無關。
2、尺寸,以毫米為單位時,不需標注計量單位的代號或名稱,如採用其他單位,則必須註明相應的計量單位的代號或名稱。
3、機件的每一尺寸,一般只標注一次,並應標注在反映該結構最清晰的圖形上。
⑥ c# ref和out區別僅僅是參數需不需要初始化
ref和out使用時的區別是:
①:ref指定的參數在函數調用時候必須初始化,不能為空的引用。而out指定的參數在函數調用時候可以不初始化;
②:out指定的參數在進入函數時會清空自己,必須在函數內部賦初值。而ref指定的參數不需要。
一:ref 關鍵字使參數按引用傳遞。
其效果是,當控制權傳遞回調用方法時,在方法中對參數所做的任何更改都將反映在該變數中。若要使用 ref 參數,則方法定義和調用方法都必須顯式使用 ref 關鍵字。
也即是說,在方法中對參數的設置和改變將會直接影響函數調用之處(代碼①及②)。無論是函數的定義還是調用時均不可忽略關鍵字ref.
二:ref定義的參數在使用前必須初始化,無論在函數定義時候參數有沒有賦予初值。這條正好區分out指定的參數可以不在調用函數的時候進行初始化。
三 :對out來說,第一條同樣適用。將代碼①以及②中的ref全部修改成out,則可與使用ref得到同樣的結果。
四:out指定的參數必須在函數定義的時候就賦初值。否則則出現錯誤。對比ref指定的參數則可以不在函數內部進行賦初值,在函數調用時候再賦初值也可以。
⑦ 在c#中Ref關鍵字的作用是啥
方法參數上的 ref 方法參數關鍵字使方法引用傳遞到方法的同一個變數。當控制傳遞回調用方法時,在方法中對參數所做的任何更改都將反映在該變數中。 若要使用 ref 參數,必須將參數作為 ref 參數顯式傳遞到方法。ref 參數的值被傳遞到 ref 參數。 傳遞到 ref 參數的參數必須最先初始化。將此方法與 out 參數相比,後者的參數在傳遞到 out 參數之前不必顯式初始化。 屬性不是變數,不能作為 ref 參數傳遞。
⑧ ref是什麼意思
REF是Reference的縮寫,為參考尺寸的意思。同時也指一個識別系統,也是計算機程序中的一個關鍵字,瑞士的一個公司名。
參考尺寸依ASME Y14.5上的定義是:在別處已有標示的尺寸,為了看圖人的方便,在其他位置重復標示的尺寸。可以由現有尺寸計算出來的尺寸,但也是為了看圖人的方便,而標示的尺寸。參考尺寸是不可量測的。
1、ref關鍵字:讓參數按照引用傳遞。其效果是,當控制權傳遞回調用方法時,在方法中對參數所做的任何更改都將反映在該變數中;也等同將值類型的數據使用引用方式傳參。
2、若要使用ref參數,則方法定義和調用方法都必須顯式使用ref關鍵字。
3、傳遞到ref參數的參數必須最先初始化。這與 out 不同,out 的參數在傳遞之前不需要顯式初始化。盡管ref和out在運行時的處理方式不同,但它們在編譯時的處理方式是相同的。因此,如果一個方法採用ref參數,而另一個方法採用out 參數,則無法重載這兩個方法。
⑨ C#中關鍵字ref的作用是什麼
一般ref被用來傳參數的。
方法參數上的 ref 方法參數關鍵字使方法引用傳遞到方法的同一個變數。
當控制傳遞回調用方法時,在方法中對參數所做的任何更改都將反映在該變數中。
若要使用 ref 參數,必須將參數作為 ref 參數顯式傳遞到方法。
ref 參數的值被傳遞到 ref 參數。 傳遞到 ref 參數的參數必須最先初始化。
將此方法與 out 參數相比,後者的參數在傳遞到 out 參數之前不必顯式初始化。 屬性不是變數,不能作為 ref 參數傳遞。