out關鍵字和ref關鍵字的區別

孤沉發表於2024-09-29

我們只需要知道一點,out經常用在多個引數的輸出
ref用在資料的雙向傳遞就好了

public string GetString()
{
   return "Hello,World!";
}
var s=GetString();

這是一個簡單輸出string的方法,但是隻輸出了一個引數
我們輸出兩個引數或者多個引數也會用到列舉,元組,列表,陣列
雖然列舉,元組,列表,陣列能輸出多個引數,但是它們要進行相應的轉化和賦值
使用out就比較簡單了

public void GetString(out int a,out int b)
{
   a=1,b10;
}
int a,b;
GetString(out a,out b);
Console.WriteLine(a);
Console.WriteLine(b);

我們現在嘗試同時使用ref和out寫一個demo

public class RefDemo
{
    public void UsageInt(ref int a, ref int b)
    {
        a = 1; b = 999;
    }

    public void UsageString(ref string a, ref string b)
    {
        a = "123";
        b = "321";
    }
}

 public class OutDemo
 {
     public void UsageInt(out int a,out int b)
     {
         a = 1;b = 999;
     }

     public void UsageString(out string a,out string b)
     {
         a = "123";
         b = "321";
     }
 }
public static void UsageOut()
{
    OutDemo outDemo = new OutDemo();
    int a, b;
    outDemo.UsageInt(out a, out b);
    Console.WriteLine(a);
    Console.WriteLine(b);

    Console.WriteLine("======================");
    string a2, b2;
    outDemo.UsageString(out a2, out b2);
    Console.WriteLine(a2);
    Console.WriteLine(b2);
}

public static void UsageRef()
{
    RefDemo refDemo = new RefDemo();
    int a=0, b=0;
    refDemo.UsageInt(ref a, ref b);
    Console.WriteLine(a);
    Console.WriteLine(b);

    Console.WriteLine("======================");
    string a2="", b2="";
    refDemo.UsageString(ref a2, ref b2);
    Console.WriteLine(a2);
    Console.WriteLine(b2);
}

輸出結果

1
999
======================
123
321

從上面的demo可以看出,我們使用兩個關鍵字除了最開始初始化不同,其他的結果都一樣
其中out關鍵字可以看作ref的子集,out比ref關鍵字強大,因為它不需要初始化,
但是這是假相,沒有很好的體現出ref的作用,我這裡寫這兩個demo,是先讓你們熟悉這兩個關鍵字的用法
接下來我們看看兩個關鍵字的區別

 public static void Ref()
 {
     int number = 10;
     Console.WriteLine("原始值: " + number);

     ModifyNumberFromRef(ref number);
     Console.WriteLine("修改後的值: " + number);

     number = 100;
     Console.WriteLine("再次修改原始值: " + number);

     ModifyNumberFromRef(ref number);
     Console.WriteLine("再次修改後的值: " + number);
 }

 static void ModifyNumberFromRef(ref int num)
 {
     num *= 2;
     Console.WriteLine("在方法內部修改後的值: " + num);
 }

 public static void Out()
 {
     int number = 10;
     Console.WriteLine("原始值: " + number);

     ModifyNumberFromOut(out number);
     Console.WriteLine("修改後的值: " + number);

     number = 100;
     Console.WriteLine("再次修改原始值: " + number);

     ModifyNumberFromOut(out number);
     Console.WriteLine("再次修改後的值: " + number);
 }

 static void ModifyNumberFromOut(out int num)
 {
     num= 100;
     num *= 2;
     Console.WriteLine("在方法內部修改後的值: " + num);
 }

輸出結果

原始值: 10
在方法內部修改後的值: 20
修改後的值: 20
再次修改原始值: 100
在方法內部修改後的值: 200
再次修改後的值: 200
-------------------------
原始值: 10
在方法內部修改後的值: 200
修改後的值: 200
再次修改原始值: 100
在方法內部修改後的值: 200
再次修改後的值: 200

透過輸出我們可以很明顯看出兩個關鍵字的區別

相關文章