首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# ref 關鍵字深度解析 (1):值型別與參考型別差異

     編輯:關於C語言

前置知識

  • 值型別:int、struct 等,傳值會複製。
  • 參考型別:class,傳遞參考(類似指標)。
  • struct 在 C# 是值型別,C++ 則與 class 幾乎相同,易混淆。

MSDN 範例:值型別

public static void TestRef(ref char i) { i = 'b'; }
public static void TestNoRef(char i) { i = 'c'; }

char i = 'a';
TestRef(ref i); Console.WriteLine(i); // b
TestNoRef(i); Console.WriteLine(i);   // b

改為參考型別測試

public class MyClass { public int Value; }

public static void TestRef(ref MyClass m) { m.Value = 10; }
public static void TestNoRef(MyClass m) { m.Value = 20; }
public static void TestCreateRef(ref MyClass m) { m = new MyClass(); m.Value = 100; }
public static void TestCreateNoRef(MyClass m) { m = new MyClass(); m.Value = 200; }

MyClass m = new MyClass(); m.Value = 1;
TestRef(ref m); Console.WriteLine(m.Value);   // 10
TestNoRef(m); Console.WriteLine(m.Value);     // 20
TestCreateRef(ref m); Console.WriteLine(m.Value); // 100
TestCreateNoRef(m); Console.WriteLine(m.Value);   // 100

觀察重點

  • TestRef/TestNoRef 皆修改物件屬性,結果相同。
  • TestCreateRef 重新指派呼叫端變數,影響後續。
  • TestCreateNoRef 僅修改區域參數,呼叫端仍指向原物件(Value=100)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved