程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 懂得C#中參數的值和援用和傳遞構造和類援用的差別

懂得C#中參數的值和援用和傳遞構造和類援用的差別

編輯:C#入門知識

懂得C#中參數的值和援用和傳遞構造和類援用的差別。本站提示廣大學習愛好者:(懂得C#中參數的值和援用和傳遞構造和類援用的差別)文章只能為提供參考,不一定能成為您想要的結果。以下是懂得C#中參數的值和援用和傳遞構造和類援用的差別正文


值與援用參數之間的差別:
在 C# 中,既可以經由過程值也能夠經由過程援用傳遞參數。在挪用情況中經由過程援用傳遞參數許可函數成員(辦法、屬性、索引器、運算符和結構函數)更改參數的值,並堅持該更改。若要經由過程援用傳遞參數,請應用 ref 或 out 症結字。
上面的示例闡釋值與援用參數之間的差別:

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;
  }
}

向辦法傳遞構造和向辦法傳遞類援用之間的差別

上面的示例演示若何應用 構造 到辦法與經由過程 類 實例分歧傳遞給辦法。在此示例中,兩個參數 (構造和類實例) 將值和兩個辦法經由過程更改參數的一個字段的值。然則,這兩個辦法的成果是分歧的,由於的傳遞,當您經由過程時構造甚麼分歧經由過程,則可以經由過程類的實例。
因為構造是 值類型,那末,當您對辦法的 應用構造值 ,辦法遭到並對構造參數的正本。辦法沒法拜訪原始構造中挪用辦法其實不能將其更改任何方法。該辦法可以僅更改正本。
類的實例是 援用類型,而不是值類型。當對辦法的 援用類型經由過程值 ,辦法停止援用的復制到類實例。即辦法遭到實例,而不是復制實例的地址的正本。在挪用辦法的類實例都有一個地址,在挪用辦法的參數的地址的正本,是以,兩個地址能否援用統一對象。因為該參數包括該地址的正本,挪用辦法不克不及更改類實例的地址在挪用辦法的。然則,挪用辦法可使用該地址拜訪原始地址和該正本援用的類成員。假如挪用辦法將類成員,在挪用辦法的原始類的實例也會產生更改。
上面的示例的輸入顯示差別。,由於該辦法在參數中應用該地址查找類的實例,的指定字段挪用將類實例的 willIChange 字段的值傳遞給辦法 ClassTaker 。挪用不更改構造的 willIChange 字段在挪用辦法為辦法 StructTaker ,由於參數的值是構造的正本,而不是復制其地址。 StructTaker 更改該正本,是以,該正本喪失,在向 StructTaker 挪用完成時。

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


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved