C#中out和ref之間的區別【轉】

首先:兩者都是按地址傳遞的,使用后都將改變原來參數的數值。

其次:ref可以把參數的數值傳遞進函數,但是out是要把參數清空,就是說你無法把一個數值從out傳遞進去的,out進去后,參數的數值為空,所以你必須初始化一次。這個就是兩個的區別,或者說就像有的網友說的,ref是有進有出,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) { }
}

轉載于:https://www.cnblogs.com/dayang12525/p/6247606.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/456587.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/456587.shtml
英文地址,請注明出處:http://en.pswp.cn/news/456587.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何打開.ipynb文件

最近碰到文件名后綴為.ipynb文件,起初沒太在意這種文件格式,用Notepad打開之后看到也是類似于JSON格式的信息,以為也是為其他的一些文件服務的(類似于配置一些HTML文件的配置文件)。但是后來才發現這也是一種文本表示形…

《CCNP TSHOOT 300-135認證考試指南》——2.9節憑記憶完成表格和列表

本節書摘來自異步社區《CCNP TSHOOT 300-135認證考試指南》一書中的第2章,第2.9節憑記憶完成表格和列表,作者 【加】Raymond Lacoste , 【美】Kevin Wallace,更多章節內容可以訪問云棲社區“異步社區”公眾號查看 2.9 憑記憶完成表格和列表CC…

將f2fs文件系統到磁盤

1 用git下載f2fs文件系統tools的源代碼。下載地址如下:http://git.kernel.org/cgit/linux/kernel/git/jaegeuk/f2fs-tools.git 具體的操作如下:git clone git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs-tools.git 通過以…

【python】list append()和extend()區別

list append() ---》添加一個對象整體 extend() ----》添加迭代的對象 append() 添加單一元素在末尾 my_list [geeks, for] my_list.append(geeks) print(my_list) output: [geeks, for, geeks]添加一個list后,也是只添加一個list對象 my_list [geeks, for…

玩Python遇到的問題一二三及解決辦法

文章目錄問題一:python 2.7版本解決TypeError: encoding is an invalid keyword argument for this function。問題二:python讀取文件時提示"UnicodeDecodeError: gbk codec cant decode byte 0x80 in position 205: illegal multibyte sequence&qu…

《MATLAB圖像處理超級學習手冊》導讀

前言 MATLAB圖像處理超級學習手冊圖像是人類獲取信息的重要來源。當今的信息化社會,對圖像處理和圖像分析的要求越來越高,現有的圖像軟件由于采購成本和功能的限制,已經不能完全滿足專業人士的需要,這時就需要專業人士來編寫自己的…

【python】SOCK_STREAM和SOCK_DGRAM兩種類型的區別【轉】

sock_stream 是有保障的(即能保證數據正確傳送到對方)面向連接的SOCKET,多用于資料(如文件)傳送。 sock_dgram 是無保障的面向消息的socket , 主要用于在網絡上發廣播信息。 SOCK_STREAM是基于TCP的,數據傳輸比較有保障。SOCK_DGRAM是基于U…

JavaScript將字符串中的每一個單詞的第一個字母變為大寫其余均為小寫

要求: 確保字符串的每個單詞首字母都大寫,其余部分小寫。 這里我自己寫了兩種方法,或者說是一種方法,另一個是該方法的變種。 第一種: function titleCase(str) {var newarr,newarr1[]; newarr str . toLowerCase() .…

聊天機器人的分類及綜述

文章目錄[toc] 目錄前言:1、技術方向2、chatbot的知識框架3、應用的分類4、chatbot的幾個challenges5、工業應用綜述總結:目錄 前言: 最近由于工作需要,要開發一款智能客服,目前正在搞業務咨詢模塊的功能&#xff0c…

【python】數據結構和算法 + 淺談單鏈表與雙鏈表的區別

有這么一句話說“程序數據結構算法”,也有人說“如果把編程比作做菜,那么數據結構就好比食材(菜),算法就好比廚藝(做菜的技巧)”。 當然這是籠統的說法,不過也稍微懂得了數據結構和…

Ironic 安裝和配置詳解

轉自:http://amar266.blogspot.com/2014/12/ironic-installation-and-configuration.html 1.Install Openstack With Neutron 2.Create and delete vm to test the setup 3.Configure existing setup for ironic 3.1.Configure ironic user in keystone # keystone …

webpack使用優化(基本篇)

轉自:https://github.com/lcxfs1991/blog/issues/2 前言 本文不是webpack入門文章,如果對webpack還不了解,請前往題葉的Webpack入門,或者阮老師的Webpack-Demos。 為什么要使用Webpack 與react一類模塊化開發的框架搭配著用比較好…

word2vec中單詞向詞向量的轉換過程詳解

目錄前言:1、Word2Vec兩種模型的大致印象2、CBOW模型流程舉例3、CBOW模型流程舉例總結: 目錄 前言: 針對word2vec是如何得到詞向量的?這篇文章肯定能解決你的疑惑。該篇文章主要參考知乎某大神的回答,個人在此基礎上…

Python把函數作為參數傳入的高階編程方法

map:接受兩個參數(函數,Iterable),map將傳入的函數依次作用于Iterable的每個元素,并且返回新的Iterable def f(x):return x*x r map(f,[1,2,3,4]) #此時的r為惰性求值——可用next()和for...in取值 #通過list()返…

《編程珠璣(第2版?修訂版)》—第2章2.2節無處不在的二分搜索

本節書摘來自異步社區《編程珠璣(第2版?修訂版)》一書中的第2章2.2節無處不在的二分搜索,作者【美】Jon Bentley,更多章節內容可以訪問云棲社區“異步社區”公眾號查看。 2.2 無處不在的二分搜索我想到的一個數在1到100之間&…

JavaScript學習筆記(四)——jQuery插件開發與發布

jQuery插件就是以jQuery庫為基礎衍生出來的庫,jQuery插件的好處是封裝功能,提高了代碼的復用性,加快了開發速度,現在網絡上開源的jQuery插件非常多,隨著版本的不停迭代越來越穩定好用,在jQuery官網有許多插…

AIML元素詳細說明

目錄前言:1、簡介2、詳細說明總結: 目錄 前言: 智能客服客戶咨詢功能的實現主要依靠的就是Python的AIML庫,這里就先介紹下AIML。 詳細的使用教程可參考:https://github.com/andelf/PyAIML 目前大部分AIML只支持Py…

【解決】如何打開.ipynb文件

最近碰到文件名后綴為.ipynb文件,起初沒太在意這種文件格式,用Notepad打開之后看到也是類似于JSON格式的信息,以為也是為其他的一些文件服務的(類似于配置一些HTML文件的配置文件)。但是后來才發現這也是一種文本表示形…

《樹莓派學習指南(基于Linux)》——1.4 將Raspbian燒錄到SD卡

本節書摘來異步社區《樹莓派學習指南(基于Linux)》一書中的第1章,第1.4節,作者:【英】Peter Membrey ,【澳】David Hows ,更多章節內容可以訪問云棲社區“異步社區”公眾號查看 1.4 將Raspbian燒錄到SD卡 …

python單向鏈表和雙向鏈表的圖示代碼說明

圖示說明: 單向鏈表: insert、 remove、 update、pop方法 class Node:def __init__(self, data):self.data dataself.next Nonedef __str__(self):return str(self.data)# 通過單鏈表構建一個list的結構: 添加 刪除 插入 查找 獲取長…