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.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM