c#中引用類型作爲值參數和引用參數問題(ref的作用)

c#中引用類型作爲值參數和引用參數問題

一、分類

C#的值類型包括:結構體(數值類型,bool型,用戶定義的結構體),枚舉,可空類型。

C#的引用類型包括:數組,用戶定義的類、接口、委託,object,字符串。

 

二。參數傳遞

  對於引用類型,不管是將其作爲值參數傳遞還是引用參數傳遞,都可以在方法成員內部修改其內容。而值類型則不能修改。首先舉一個簡單的例子

(1)引用類型和值類型作爲參數傳遞的區別:

複製代碼

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 引用類型問題
{
    class Program
    {
        static void test1(ref int val1,int val2)
        {
            val1 = 10;
            val2 = 20;
            Console.WriteLine("val1={0},val2={1}", val1, val2);
        }

        static void Main(string[] args)
        {
            myclass mc = new myclass();
            test1(ref mc.val1, mc.val2);
            Console.WriteLine("函數調用後:val1={0},val2={1}", mc.val1, mc.val2);
            Console.ReadKey();
        }
    }

    class myclass
    {
        public int val1 = 0;
        public int val2 = 0;
    }
}

複製代碼

輸出結果是:  val1=10,val2=20
        函數調用後:val1=10,val2=0

  

  引用類型中,如果在方法內創建新對象並賦值給形參會產生什麼結果呢?

(1)引用類型作爲值參數傳遞時,如果在方法內創建對象並賦值給形參,將切斷形參與實參之間的聯繫,並在方法調用結束後,新對象也不復存在

複製代碼

class myclass
    {
        public int val1 = 10;
    }

    class Program
    {
        static void test1(myclass f1)
        {
            f1.val1 = 60;
            Console.WriteLine("創建新對象前:val1={0}", f1.val1);
            f1 = new myclass();
            Console.WriteLine("創建新對象後:val1={0}", f1.val1);

        }

        static void Main(string[] args)
        {
            myclass mc = new myclass();
            Console.WriteLine("函數調用...");
            test1(mc);
            Console.WriteLine("函數調用後:val1={0}", mc.val1);
            Console.ReadKey();
        }
    }

複製代碼

輸出結果爲:  函數調用...
        創建新對象前:val1=60
        創建新對象後:val1=10
        函數調用後:val1=60

值得注意的是,函數調用結束後並沒有改變val1的值,因爲在方法調用結束後新對象已經不存在了。

 

(2)引用類型對象作爲引用參數傳遞時,如果在方法內創建對象並賦值給形參,在方法結束後該對象依然存在,並且是實參所引用的值

複製代碼

class myclass
    {
        public int val1 = 10;
    }

    class Program
    {
        static void test1(ref myclass f1)
        {
            f1.val1 = 60;
            Console.WriteLine("創建新對象前:val1={0}", f1.val1);
            f1 = new myclass();
            Console.WriteLine("創建新對象後:val1={0}", f1.val1);

        }

        static void Main(string[] args)
        {
            myclass mc = new myclass();
            Console.WriteLine("函數調用...");
            test1(ref mc);
            Console.WriteLine("函數調用後:val1={0}", mc.val1);
            Console.ReadKey();
        }
    }

複製代碼

這段代碼和上面幾乎沒區別,只是在引用參數調用的時候添加了ref關鍵字,但結果卻不一樣

輸出結果爲:  函數調用...
        創建新對象前:val1=60
        創建新對象後:val1=10
        函數調用後:val1=10

函數調用後val1的值也變成了10.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章