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

值類型引用類型、值傳遞引用傳遞探討

編輯:C#入門知識

和同事喋喋不休,吵個不停,於是查閱文檔,復習相關的值類型和引用類型、值傳遞和引用傳遞,總結分享!如有錯誤還望指正!一個人思想有限,集思廣益,共同發展。

值類型和引用類型

首先分清C#中的值類型和引用類型的區分:

值類型包括:intchardoublefloatlongshortbyteboolenumstructdecimal

值類型都是派生自ValueType ValueType 是抽象類

值類型不能繼承,只能實現接口。

②string、數組、類(自定義數據類型)、接口、委托、

int[] n={1,2,3};//引用類型。

引用類型都派生自:Object

引用類型可以繼承(類之間可以繼承)

需要知道和明白的規律

1、記住聲明變量都在棧上

2、值類型聲明變量之後,不管值是多大多小,變量大小固定,存在棧上

3、引用類型聲明變量之後,取決於值的多少!大小不固定,存放在棧和堆上

值傳遞案例如下:

    class Program
    {
        static void Main(string[] args)
        {
            //1.值類型=====
            //int n = 10;
            //int m = n;
            //m++;
            //Console.WriteLine(n);
            //Console.ReadKey();

            //2.引用類型========
            //Person p = new Person();
            //p.Age = 17;
            //p.Name = "johnson";
            //p.Email = "[email protected]";

            //Person p1 = p;
            //p1.Age = p.Age + 12;
            //Console.WriteLine(p.Age);
            //Console.ReadKey();

            //案例1
            //int m = 1;
            //M1(m);//值類型作為參數傳遞的時候是【拷貝了一個副本】,所以改變副本不影響原來的內容
            //Console.WriteLine(m);
            //Console.ReadKey();

            //案例2
            //int[] arrInt = { 1, 3, 5, 7, 9, };
            //M2(arrInt);
            //for (int i = 0; i < arrInt.Length; i++)
            //{
            //    Console.WriteLine(arrInt[i]);
            //}
            //Console.ReadKey();

            //案例3
            //int[] arrInt = { 1, 3, 5, 7, 9, };
            //M3(arrInt);
            //for (int i = 0; i < arrInt.Length; i++)
            //{
            //    Console.WriteLine(arrInt[i]);
            //}
            //Console.ReadKey();

            //案例4
            //Person p = new Person();
            //p.Name = "johnson";
            //p.Age = 16;
            //M4(p);
            //Console.WriteLine(p.Name);
            //Console.WriteLine(p.Age);
            //Console.ReadKey();

            //案例5
            Person p = new Person();
            p.Name = "johnson";
            p.Age = 16;
            M5(p);
            Console.WriteLine(p.Name);
            Console.WriteLine(p.Age);
            Console.ReadKey();
        }
        static void M5(Person per)
        {
            per = new Person();
            per.Name = "vinson";
            per.Age = 32;
        }

        static void M4(Person per)
        {
            per.Name = "vinson";
            per.Age = 32;
        }

        static void M3(int[] arr)
        {
            int[] arr1 = { 2, 4, 6 };
            arr = arr1;
            for (int i = 0; i < arr.Length; i++)
            {
                arr[i] = arr[i] + 2;
            }
        }

        static void M2(int[] arr)
        {
            for (int i = 0; i < arr.Length; i++)
            {
                arr[i] = arr[i] + 2;
            }
        }

        static void M1(int n)
        {
            n = 10;
            n++;
        }
    }

    class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public string Email { get; set; }
    }

 

引用傳遞案例

    class Program
    {
        static void Main(string[] args)
        {
            //值傳遞:值類型、引用類型
            //引用傳遞:值類型、引用傳遞 ref

            //1、引用傳遞的是值類型
            //int n = 10;
            //M1(ref n);
            //Console.WriteLine(n);
            //Console.ReadKey();

            //2、引用傳遞的是引用類型
            Person p = new Person();
            p.Name = "johnson";
            M2(ref p);
            Console.WriteLine(p.Name);
            Console.ReadKey();
        }

        private static void M2(ref Person p)
        {
            p = new Person();
            p.Name = "vinson";
        }

        //ref表示“引用傳遞”,引用傳遞傳遞的不是棧中的數據(對於值類型來說,棧中直接保存數據;對於引用類型來說,棧中保存的是“對象的地址”),而是棧本身的地址
        static void M1(ref int m)
        {
            m++;
        }
    }

    class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public string Email { get; set; }
    }

1234

作者: WM/Johnson

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