方法引數修飾符in,out,ref
阿新 • • 發佈:2022-03-15
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}"); }想要更快更方便的瞭解相關知識,可以關注微信公眾號