北京企業(yè)聚集西安優(yōu)化外
前言:
今天這篇文章我們簡(jiǎn)單學(xué)習(xí)一下C# ref
的用法,在看別人的代碼不至于看不懂邏輯,雖然這是一個(gè)比較簡(jiǎn)單的知識(shí)點(diǎn),但是還是值得我們?nèi)W(xué)習(xí)一下關(guān)于這個(gè)知識(shí)點(diǎn)一些概念,我們知道在C# 中我們的函數(shù)參數(shù),一般都為值引用,C#是一門(mén)解釋型語(yǔ)言,其中對(duì)指針進(jìn)行了封裝,因此用戶(hù)無(wú)法直接調(diào)用對(duì)象的指針,無(wú)法調(diào)用對(duì)象的指針,就不能地址引用了嗎?顯然我們是有其他的方法,ref
在C#中起到地址引用的作用,使用ref就可以對(duì)對(duì)象進(jìn)行地址引用了。創(chuàng)作不易,點(diǎn)贊關(guān)注評(píng)論收藏,你的點(diǎn)贊是我創(chuàng)作的動(dòng)力,也是我學(xué)習(xí)的方向。
ref概述
關(guān)鍵字 ref
指示變量是引用或另一個(gè)對(duì)象的別名。 它在五個(gè)不同的上下文中使用:
- 在方法簽名和方法調(diào)用中,按引用將參數(shù)傳遞給方法。 有關(guān)詳細(xì)信息,請(qǐng)參閱按引用傳遞參數(shù)。
- 在方法簽名中,按引用將值返回給調(diào)用方。 有關(guān)詳細(xì)信息,請(qǐng)參閱引用返回值。
- 在成員正文中,指示引用返回值是否作為調(diào)用方欲修改的引用被存儲(chǔ)在本地。 或指示局部變量按引用訪(fǎng)問(wèn)另一個(gè)值。 有關(guān)詳細(xì)信息,請(qǐng)參閱 Ref 局部變量。
- 在struct 聲明中,聲明
ref
struct 或 readonly ref struct。 有關(guān)詳細(xì)信息,請(qǐng)參閱ref struct 一文。 - ref struct在聲明中,聲明字段是引用。 ref請(qǐng)參閱字段文章。
按引用傳遞參數(shù)
在方法的參數(shù)列表中使用 ref
關(guān)鍵字時(shí),它指示參數(shù)按引用傳遞,而非按值傳遞。 ref
關(guān)鍵字讓形參成為實(shí)參的別名,這必須是變量。 換而言之,對(duì)形參執(zhí)行的任何操作都是對(duì)實(shí)參執(zhí)行的。
1.未使用ref進(jìn)行值傳遞
如圖我們調(diào)用函數(shù)沒(méi)有使用ref
這里只是傳遞值,并沒(méi)傳遞引用,用C語(yǔ)言的概念我們沒(méi)有傳遞地址,所以它的初始的值不會(huì)隨著函數(shù)改變而改變。
2.使用ref進(jìn)行引用傳遞
如圖我們使用了ref的方法,注意ref的使用和我們之前的一些語(yǔ)法有一點(diǎn)區(qū)別,其實(shí)我們可以把ref看作C語(yǔ)言的*
指針標(biāo)記,我們使用ref
調(diào)用函數(shù)時(shí),傳遞的就是地址,所以會(huì)跟著函數(shù)改變我們的初始值,因?yàn)槲覀冊(cè)诤瘮?shù)改變值了,實(shí)現(xiàn)引用傳遞
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Test10113
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e){int test = 100;Console.WriteLine(test);data(ref test);Console.WriteLine(test);}public void data(ref int test){int a = 4000;test = a;Console.WriteLine(a);}
}
}
引用返回值
引用返回值(或 ref 返回值)是由方法按引用向調(diào)用方返回的值。 即是說(shuō),調(diào)用方可以修改方法所返回的值,此更改反映在所調(diào)用方法中的對(duì)象的狀態(tài)中。(講人話(huà)就是:我們平時(shí)函數(shù)的返回值 return 返回的是一個(gè)值,現(xiàn)在用ref返回的就是一個(gè)引用傳遞,就是一個(gè)地址傳遞,這樣避免了值類(lèi)型在方法返回時(shí)的淺拷貝操作,提高了效率
)
private void Form1_Load(object sender, EventArgs e){int test = 100;// Console.WriteLine(test);// data(ref test);int[] datas = new int[] { 1, 2, 3, 4, 5 ,6,7,8,9,10};int data1 = Find(datas);Console.WriteLine(data1);ref int data =ref Find(datas);datas[5] = 100;// Console.WriteLine(test);for(int i = 0; i < datas.Length; i++){Console.WriteLine(datas[i]);}Console.WriteLine(data);}public int data(int test){int a = 4000;Console.WriteLine(a);return test;}public static ref int Find(int[] data){return ref data[5];}
ref 局部變量
ref 局部變量用于指代使用 return ref
返回的值。 無(wú)法將 ref 局部變量初始化為非 ref 返回值。 也就是說(shuō),初始化的右側(cè)必須為引用。 任何對(duì) ref 本地變量值的修改都將反映在對(duì)象的狀態(tài)中,該對(duì)象的方法按引用返回值。
可在以下兩個(gè)位置使用 ref
關(guān)鍵字來(lái)定義 ref 局部變量:(通俗點(diǎn)講就是我們局部變量賦值也是值,使用ref之后就是一個(gè)引用傳遞,就是個(gè)地址,某個(gè)值改變它也會(huì)跟著改變
)
- 在變量聲明之前。
- 緊接在調(diào)用按引用返回值的方法之前。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace Test10113
{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){int test = 100;// Console.WriteLine(test);// data(ref test);int[] datas = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };ref int a = ref datas[0];datas[0] = 100;Console.WriteLine(a);int b = a + 10;Console.WriteLine(b);/* int data1 = Find(datas);Console.WriteLine(data1);ref int data = ref Find(datas);datas[5] = 100;// Console.WriteLine(test);for (int i = 0; i < datas.Length; i++){Console.WriteLine(datas[i]);}Console.WriteLine(data);*/}public int data(int test){int a = 4000;Console.WriteLine(a);return test;}public static ref int Find(int[] data){return ref data[5];}}
}
總結(jié)
這篇文章比較簡(jiǎn)單,只是簡(jiǎn)單的學(xué)習(xí)一下,對(duì)它有更多的認(rèn)識(shí),在有需求的時(shí)候最起碼有路子,雖然很簡(jiǎn)單,但是也是可以學(xué)到東西的,我們學(xué)習(xí)了新的知識(shí),對(duì)我們的知識(shí)儲(chǔ)備及技術(shù)又有新的一點(diǎn)點(diǎn)的進(jìn)步,C#的技術(shù)就是先簡(jiǎn)單再難嘛,積少成多之后才會(huì)成長(zhǎng)才會(huì)進(jìn)步,我們要不斷的學(xué)習(xí)不斷的探索,才能有學(xué)習(xí)的動(dòng)力,才會(huì)有學(xué)習(xí)的欲望,創(chuàng)作不易,點(diǎn)贊評(píng)論收藏關(guān)注,嘿嘿,不喜勿噴!!!!