ref

 

ref 參數修飾詞的作用讓你利用方法去操作一變數或物件時,

不須將整個實體傳進去操作,而只是傳參考進去即可,

好處是可以增進效能。

 

一、pass value types by reference

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            int v = 333;
            Console.WriteLine(v);

            Change(ref v);
            Console.WriteLine(v);
        }

        static void Change(ref int value)
        {
            value = 1000;
        }
    }
}

執行結果

說明:

將一變數當作參考傳進方法時,

argument 和 parameter 的前面都要加上 ref 參數修飾詞。

 

二、pass reference types by reference

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Product item = new Product("water", 100);
            Console.WriteLine("Name: {0}, ID: {1}\n", item.ItemName, item.ItemID);

            ChangeByReference(ref item);
            Console.WriteLine("Name: {0}, ID: {1}\n", item.ItemName, item.ItemID);
        }

        private static void ChangeByReference(ref Product itemRef)
        {
            itemRef = new Product("wine", 1);
            itemRef.ItemID = 50;
        }
    }

    class Product
    {
        public Product(string name, int newID)
        {
            ItemName = name;
            ItemID = newID;
        }

        public string ItemName { get; set; }
        public int ItemID { get; set; }
    }
}

執行結果

 

三、Ref locals

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            int v = 333;
            Console.WriteLine(v);

            ref int context = ref v;
            context = 1000;
            Console.WriteLine(v);
        }
    }
}

執行結果

說明:

上例示範將變數 v 的參考指定給另一個參考 context,

此時修改 context 的內容時,也會連動到 v 的內容。

 

四、Reference return values

方法也可以回傳參考,如下格式

static ref int Change(ref int value)
{
    value = 1000;
    return ref value;
}

 

範例

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            int v = 333;
            Console.WriteLine(v);

            ref int context = ref Change(ref v);

            Console.WriteLine(context);
        }

        static ref int Change(ref int value)
        {
            value = 1000;
            return ref value;
        }
    }
}

執行結果

說明:

由於方法會回傳參考回去,所以也需要一個參考去接住他 (Ref locals)。