1. 程式人生 > 其它 >方法引數修飾符in,out,ref

方法引數修飾符in,out,ref

  in,out,ref都可能作為方法引數據修飾符,從字面意思可就可以理解這三個關鍵字的含義,那用法是什麼樣子的呢,通過demo來看一下。

定義一個引用型別Order

public class Order
{
    public string OrderNo { get; set; }
    public override string ToString()
    {
        return OrderNo;
    }
}

in引數用法:

Console.WriteLine("in 引數 只能從外部把值傳入方法內部使用");
var i = 10;
InMethod01(in i);
Console.WriteLine($"外:{i}");
//InMethod01(in 10);//錯誤,in後不能是實際的資料

//可以直接傳入資料
InMethod01(10);


//order內的OrderNo傳入方法內部有可能被改掉,但order不可以被替換
var order = new Order { OrderNo = "O000000" };
InMethod02(in order);
Console.WriteLine($"外:{order}");
//InMethod02(in new Order { OrderNo = "abcd" });//錯誤,in後不能是實際的資料

//可以直接傳入資料
InMethod02(new Order { OrderNo = "O000000" });



//int i1;
//Order order1;
//InMethod03(in order1 in i1);//錯誤,不能是沒有賦值的變數

int i1 = 1;
Order order1 = new Order() { OrderNo = "O000000" };
//方法的引數列表中可以有多個in
InMethod03(in order1, in i1);//錯誤,不能是沒有賦值的變數

InMethod03(new Order { OrderNo = "O000000" }, 20);


static void InMethod01(in int i)
{
    //i = 10;//錯誤
    Console.WriteLine($"內:{i}");
}
static void InMethod02(in Order order)
{
    //order = new Order();//錯誤
    order.OrderNo = "O000002"; //正確,這裡可以引數成員賦值
    Console.WriteLine($"內:{order}");
}
static void InMethod03(in Order order, in int i)
{
    //i = 10;
    Console.WriteLine($"內:{i}");
    //order = new Order(); //錯誤

    //order.OrderNo = "O000001"; //正確,這裡可以引數成員賦值
    Console.WriteLine($"內:{order}");
}

out引數用法:

Console.WriteLine("out 引數,是從方法內部把資料帶出來");

//定義呼叫一起
OutMethod01(out int i1);
Console.WriteLine($"外 :{i1}");

//定義呼叫分開
int i2=20; //即使賦值,方法內部接收不到
OutMethod01(out i2);
Console.WriteLine($"外  :{i2}");

//定義呼叫一起
OutMethod02(out Order order1);
Console.WriteLine($"外  :{order1}");

//定義呼叫分開
Order order2;
OutMethod02(out order2);
Console.WriteLine($"外  :{order2}");

//多個out同時存在
OutMethod03(out Order order3, out int i3);
Console.WriteLine($"外  :{order3}");
Console.WriteLine($"外  :{i3}");

Order order4;
int i4=20;//這裡的20是能傳入OutMethod03中的,但在方法內部,不能在給i賦值前使用
OutMethod03(out order4, out i4);
Console.WriteLine($"外  :{order4}");
Console.WriteLine($"外  :{i4}");

//帶有out的引數,在方法內即使有值,也能不使用,只有賦值後才能使用
static void OutMethod01(out int i)
{
    //Console.WriteLine(i);//錯誤
    i = 10;
    Console.WriteLine(i);
}
static void OutMethod02(out Order order)
{
    //Console.WriteLine(order); //錯誤
    order = new Order { OrderNo = "O000001" };
    Console.WriteLine(order);
}
static void OutMethod03(out Order order, out int i)
{
    //Console.WriteLine(i);//錯誤
    //Console.WriteLine(order); //錯誤
    i = 10;
    order = new Order { OrderNo = "O000001" };
    Console.WriteLine(i);//錯誤
    Console.WriteLine(order); //錯誤
}

ref引數用法:

Console.WriteLine("ref 引數,即能把外部的資料傳入,也能把方法裡的引數變化值傳出,這裡更多的是把引數轉成一個引用,穿透方法內外共享");

//RefMethod01(ref 10);//錯誤,這裡只能傳入一個變數,不能是具體的資料

//int i1;//錯誤,ref要求傳入必須有值
//RefMethod01(ref i1);//錯誤
int i1 = 1;
RefMethod01(ref i1);
Console.WriteLine($"外 :{i1}");


var order1 = new Order { OrderNo = "O000000" };
RefMethod02(ref order1);
Console.WriteLine($"外 :{order1}");


Order order2 = new Order { OrderNo = "O000000" };
int i2 = 1;
RefMethod03(ref order2, ref i2);
Console.WriteLine($"外 :{order2}");
Console.WriteLine($"外 :{i2}");


static void RefMethod01(ref int i)
{
    Console.WriteLine($"前:{i}");
    i = 10;
    Console.WriteLine($"後:{i}");
}
static void RefMethod02(ref Order order)
{
    Console.WriteLine($"前:{order}");
    order = new Order { OrderNo = "O000001" };
    Console.WriteLine($"後:{order}");
}
static void RefMethod03(ref Order order, ref int i)
{
    Console.WriteLine($"前:{i}");
    Console.WriteLine($"前:{order}");
    i = 10;
    order = new Order { OrderNo = "O000001" };
    Console.WriteLine($"後:{i}");
    Console.WriteLine($"後:{order}");
}
    想要更快更方便的瞭解相關知識,可以關注微信公眾號