欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

理解C#中參數(shù)的值和引用以及傳遞結(jié)構(gòu)和類引用的區(qū)別

 更新時(shí)間:2016年01月30日 16:36:34   投稿:goldensun  
這篇文章主要介紹了理解C#中參數(shù)的值和引用以及傳遞結(jié)構(gòu)和類引用的區(qū)別,文中舉了兩段代碼例子來簡(jiǎn)單說明,需要的朋友可以參考下

值與引用參數(shù)之間的區(qū)別:
在 C# 中,既可以通過值也可以通過引用傳遞參數(shù)。在調(diào)用環(huán)境中通過引用傳遞參數(shù)允許函數(shù)成員(方法、屬性、索引器、運(yùn)算符和構(gòu)造函數(shù))更改參數(shù)的值,并保持該更改。若要通過引用傳遞參數(shù),請(qǐng)使用 ref 或 out 關(guān)鍵字。
下面的示例闡釋值與引用參數(shù)之間的區(qū)別:

class Program
{
  static void Main(string[] args)
  {
    int arg;

    // Passing by value.
    // The value of arg in Main is not changed.
    arg = 4;
    squareVal(arg);
    Console.WriteLine(arg);
    // Output: 4

    // Passing by reference.
    // The value of arg in Main is changed.
    arg = 4;
    squareRef(ref arg);
    Console.WriteLine(arg);
    // Output: 16 
  }

  static void squareVal(int valParameter)
  {
    valParameter *= valParameter;
  }

  // Passing by reference
  static void squareRef(ref int refParameter)
  {
    refParameter *= refParameter;
  }
}

向方法傳遞結(jié)構(gòu)和向方法傳遞類引用之間的區(qū)別

下面的示例演示如何使用 結(jié)構(gòu) 到方法與通過 類 實(shí)例不同傳遞給方法。在此示例中,兩個(gè)參數(shù) (結(jié)構(gòu)和類實(shí)例) 將值和兩個(gè)方法通過更改參數(shù)的一個(gè)字段的值。但是,這兩個(gè)方法的結(jié)果是不同的,因?yàn)榈膫鬟f,當(dāng)您通過時(shí)結(jié)構(gòu)什么不同通過,則可以通過類的實(shí)例。
由于結(jié)構(gòu)是 值類型,那么,當(dāng)您對(duì)方法的 使用結(jié)構(gòu)值 ,方法受到并對(duì)結(jié)構(gòu)參數(shù)的副本。方法無法訪問原始結(jié)構(gòu)中調(diào)用方法并不能將其更改任何方式。該方法可以僅更改副本。
類的實(shí)例是 引用類型,而不是值類型。當(dāng)對(duì)方法的 引用類型通過值 ,方法進(jìn)行引用的復(fù)制到類實(shí)例。即方法受到實(shí)例,而不是復(fù)制實(shí)例的地址的副本。在調(diào)用方法的類實(shí)例都有一個(gè)地址,在調(diào)用方法的參數(shù)的地址的副本,因此,兩個(gè)地址是否引用同一對(duì)象。由于該參數(shù)包含該地址的副本,調(diào)用方法不能更改類實(shí)例的地址在調(diào)用方法的。但是,調(diào)用方法可以使用該地址訪問原始地址和該副本引用的類成員。如果調(diào)用方法將類成員,在調(diào)用方法的原始類的實(shí)例也會(huì)發(fā)生更改。
下面的示例的輸出顯示差異。,因?yàn)樵摲椒ㄔ趨?shù)中使用該地址查找類的實(shí)例,的指定字段調(diào)用將類實(shí)例的 willIChange 字段的值傳遞給方法 ClassTaker 。調(diào)用不更改結(jié)構(gòu)的 willIChange 字段在調(diào)用方法為方法 StructTaker ,因?yàn)閰?shù)的值是結(jié)構(gòu)的副本,而不是復(fù)制其地址。 StructTaker 更改該副本,因此,該副本丟失,在向 StructTaker 調(diào)用完成時(shí)。

class TheClass
{
  public string willIChange;
}

struct TheStruct
{
  public string willIChange;
}

class TestClassAndStruct
{
  static void ClassTaker(TheClass c)
  {
    c.willIChange = "Changed";
  }

  static void StructTaker(TheStruct s)
  {
    s.willIChange = "Changed";
  }

  static void Main()
  {
    TheClass testClass = new TheClass();
    TheStruct testStruct = new TheStruct();

    testClass.willIChange = "Not Changed";
    testStruct.willIChange = "Not Changed";

    ClassTaker(testClass);
    StructTaker(testStruct);

    Console.WriteLine("Class field = {0}", testClass.willIChange);
    Console.WriteLine("Struct field = {0}", testStruct.willIChange);

    // Keep the console window open in debug mode.
    Console.WriteLine("Press any key to exit.");
    Console.ReadKey();
  }
}

輸出:

  Class field = Changed
  Struct field = Not Changed


相關(guān)文章

  • 一文看懂C#中List的擴(kuò)容機(jī)制

    一文看懂C#中List的擴(kuò)容機(jī)制

    這篇文章主要介紹了C#中的擴(kuò)容機(jī)制,文中以實(shí)例代碼輔助,幫助大家更好的工作和學(xué)習(xí),感興趣的小伙伴不妨了解下
    2020-05-05
  • C#開發(fā)WinForm根據(jù)條件改變DataGridView行顏色

    C#開發(fā)WinForm根據(jù)條件改變DataGridView行顏色

    這篇文章介紹了C#開發(fā)WinForm根據(jù)條件改變DataGridView行顏色的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • C#如何通過RFC連接sap系統(tǒng)

    C#如何通過RFC連接sap系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C#如何通過RFC連接sap系統(tǒng)的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • C#中獲取文件大小問題

    C#中獲取文件大小問題

    這篇文章主要介紹了C#中獲取文件大小問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C#基于SerialPort類實(shí)現(xiàn)串口通訊詳解

    C#基于SerialPort類實(shí)現(xiàn)串口通訊詳解

    這篇文章主要為大家詳細(xì)介紹了C#基于SerialPort類實(shí)現(xiàn)串口通訊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C#中調(diào)用DLL時(shí)未能加載文件或程序集錯(cuò)誤的處理方法(詳解)

    C#中調(diào)用DLL時(shí)未能加載文件或程序集錯(cuò)誤的處理方法(詳解)

    下面小編就為大家?guī)硪黄狢#中調(diào)用DLL時(shí)未能加載文件或程序集錯(cuò)誤的處理方法(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-02-02
  • c# 繪制中國象棋棋盤與棋子

    c# 繪制中國象棋棋盤與棋子

    這篇文章主要介紹了c# 繪制中國象棋棋盤與棋子,文中實(shí)例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • C#操作字符串方法總結(jié)實(shí)例代碼

    C#操作字符串方法總結(jié)實(shí)例代碼

    這篇文章主要介紹了C#操作字符串方法總結(jié)實(shí)例代碼,需要的朋友可以參考下
    2017-10-10
  • 分享我在工作中遇到的多線程下導(dǎo)致RCW無法釋放的問題

    分享我在工作中遇到的多線程下導(dǎo)致RCW無法釋放的問題

    最近在做項(xiàng)目中遇到一個(gè)問題,在調(diào)用一個(gè)類庫中的方法時(shí),出現(xiàn)如下異常信息:嘗試釋放正在使用的RCW,活動(dòng)線程或其他線程上正在使用該 RCW,釋放正在使用的 RCW 的嘗試會(huì)導(dǎo)致?lián)p壞或數(shù)據(jù)丟失
    2015-12-12
  • C#借助OpenCvSharp讀取攝像頭并顯示的實(shí)現(xiàn)示例

    C#借助OpenCvSharp讀取攝像頭并顯示的實(shí)現(xiàn)示例

    OpenCvSharp是一個(gè)OpenCV的.Net wrapper,應(yīng)用最新的OpenCV庫開發(fā),本文主要介紹了C#借助OpenCvSharp讀取攝像頭并顯示的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2022-05-05

最新評(píng)論