c#.net中引數修飾符ref,out ,params得區別
params 關鍵字可以指定在引數數目可變處採用引數的方法引數。
在方法宣告中的 params 關鍵字之後不允許任何其他引數,並且在方法宣告中只允許一個 params 關鍵字。
示例
// cs_params.cs
using System;
public class MyClass
{
public static void UseParams(params int[] list)
{
for ( int i = 0 ; i < list.Length ; i++ )
Console.WriteLine(list[i]);
Console.WriteLine();
}
public static void UseParams2(params object[] list)
{
for ( int i = 0 ; i < list.Length ; i++ )
Console.WriteLine(list[i]);
Console.WriteLine();
}
public static void Main()
{
UseParams(1, 2, 3);
UseParams2(1, 'a', "test");
int[] myarray = new int[3] {10,11,12};
UseParams(myarray);
}
}
輸出
1
2
3
1
a
test
10
11
12
===============================================
方法引數上的 out 方法引數關鍵字使方法引用傳遞到方法的同一個變數。當控制傳遞迴呼叫方法時,在方法中對引數所做的任何更改都將反映在該變數中。
當希望方法返回多個值時,宣告 out 方法非常有用。使用 out 引數的方法仍然可以返回一個值。一個方法可以有一個以上的 out 引數。
若要使用 out 引數,必須將引數作為 out 引數顯式傳遞到方法。out 引數的值不會傳遞到 out 引數。
不必初始化作為 out 引數傳遞的變數。然而,必須在方法返回之前為 out 引數賦值。
屬性不是變數,不能作為 out 引數傳遞。
如果兩個方法的宣告僅在 out 的使用方面不同,則會發生過載。不過,無法定義僅在 ref 和 out 方面不同的過載。例如,以下過載宣告是有效的:
class MyClass
{
public void MyMethod(int i) {i = 10;}
public void MyMethod(out int i) {i = 10;}
}
而以下過載宣告是無效的:
class MyClass
{
public void MyMethod(out int i) {i = 10;}
public void MyMethod(ref int i) {i = 10;}
}
有關傳遞陣列的資訊,請參見使用 ref 和 out 傳遞陣列。
示例
// cs_out.cs
using System;
public class MyClass
{
public static int TestOut(out char i)
{
i = 'b';
return -1;
}
public static void Main()
{
char i; // variable need not be initialized
Console.WriteLine(TestOut(out i));
Console.WriteLine(i);
}
}
輸出
-1
b
========================================
方法引數上的 ref 方法引數關鍵字使方法引用傳遞到方法的同一個變數。當控制傳遞迴呼叫方法時,在方法中對引數所做的任何更改都將反映在該變數中。
若要使用 ref 引數,必須將引數作為 ref 引數顯式傳遞到方法。ref 引數的值被傳遞到 ref 引數。
傳遞到 ref 引數的引數必須最先初始化。將此方法與 out 引數相比,後者的引數在傳遞到 out 引數之前不必顯式初始化。
屬性不是變數,不能作為 ref 引數傳遞。
如果兩種方法的宣告僅在它們對 ref 的使用方面不同,則將出現過載。但是,無法定義僅在 ref 和 out 方面不同的過載。例如,以下過載宣告是有效的:
class MyClass
{
public void MyMethod(int i) {i = 10;}
public void MyMethod(ref int i) {i = 10;}
}
但以下過載宣告是無效的:
class MyClass
{
public void MyMethod(out int i) {i = 10;}
public void MyMethod(ref int i) {i = 10;}
}
有關傳遞陣列的資訊,請參見使用 ref 和 out 傳遞陣列。
示例
// cs_ref.cs
using System;
public class MyClass
{
public static void TestRef(ref char i)
{
// The value of i will be changed in the calling method
i = 'b';
}
public static void TestNoRef(char i)
{
// The value of i will be unchanged in the calling method
i = 'c';
}
// This method passes a variable as a ref parameter; the value of the
// variable is changed after control passes back to this method.
// The same variable is passed as a value parameter; the value of the
// variable is unchanged after control is passed back to this method.
public static void Main()
{
char i = 'a'; // variable must be initialized
TestRef(ref i); // the arg must be passed as ref
Console.WriteLine(i);
TestNoRef(i);
Console.WriteLine(i);
}
}
輸出
b
b
參考資料:MSDN[@more@]
在方法宣告中的 params 關鍵字之後不允許任何其他引數,並且在方法宣告中只允許一個 params 關鍵字。
示例
// cs_params.cs
using System;
public class MyClass
{
public static void UseParams(params int[] list)
{
for ( int i = 0 ; i < list.Length ; i++ )
Console.WriteLine(list[i]);
Console.WriteLine();
}
public static void UseParams2(params object[] list)
{
for ( int i = 0 ; i < list.Length ; i++ )
Console.WriteLine(list[i]);
Console.WriteLine();
}
public static void Main()
{
UseParams(1, 2, 3);
UseParams2(1, 'a', "test");
int[] myarray = new int[3] {10,11,12};
UseParams(myarray);
}
}
輸出
1
2
3
1
a
test
10
11
12
===============================================
方法引數上的 out 方法引數關鍵字使方法引用傳遞到方法的同一個變數。當控制傳遞迴呼叫方法時,在方法中對引數所做的任何更改都將反映在該變數中。
當希望方法返回多個值時,宣告 out 方法非常有用。使用 out 引數的方法仍然可以返回一個值。一個方法可以有一個以上的 out 引數。
若要使用 out 引數,必須將引數作為 out 引數顯式傳遞到方法。out 引數的值不會傳遞到 out 引數。
不必初始化作為 out 引數傳遞的變數。然而,必須在方法返回之前為 out 引數賦值。
屬性不是變數,不能作為 out 引數傳遞。
如果兩個方法的宣告僅在 out 的使用方面不同,則會發生過載。不過,無法定義僅在 ref 和 out 方面不同的過載。例如,以下過載宣告是有效的:
class MyClass
{
public void MyMethod(int i) {i = 10;}
public void MyMethod(out int i) {i = 10;}
}
而以下過載宣告是無效的:
class MyClass
{
public void MyMethod(out int i) {i = 10;}
public void MyMethod(ref int i) {i = 10;}
}
有關傳遞陣列的資訊,請參見使用 ref 和 out 傳遞陣列。
示例
// cs_out.cs
using System;
public class MyClass
{
public static int TestOut(out char i)
{
i = 'b';
return -1;
}
public static void Main()
{
char i; // variable need not be initialized
Console.WriteLine(TestOut(out i));
Console.WriteLine(i);
}
}
輸出
-1
b
========================================
方法引數上的 ref 方法引數關鍵字使方法引用傳遞到方法的同一個變數。當控制傳遞迴呼叫方法時,在方法中對引數所做的任何更改都將反映在該變數中。
若要使用 ref 引數,必須將引數作為 ref 引數顯式傳遞到方法。ref 引數的值被傳遞到 ref 引數。
傳遞到 ref 引數的引數必須最先初始化。將此方法與 out 引數相比,後者的引數在傳遞到 out 引數之前不必顯式初始化。
屬性不是變數,不能作為 ref 引數傳遞。
如果兩種方法的宣告僅在它們對 ref 的使用方面不同,則將出現過載。但是,無法定義僅在 ref 和 out 方面不同的過載。例如,以下過載宣告是有效的:
class MyClass
{
public void MyMethod(int i) {i = 10;}
public void MyMethod(ref int i) {i = 10;}
}
但以下過載宣告是無效的:
class MyClass
{
public void MyMethod(out int i) {i = 10;}
public void MyMethod(ref int i) {i = 10;}
}
有關傳遞陣列的資訊,請參見使用 ref 和 out 傳遞陣列。
示例
// cs_ref.cs
using System;
public class MyClass
{
public static void TestRef(ref char i)
{
// The value of i will be changed in the calling method
i = 'b';
}
public static void TestNoRef(char i)
{
// The value of i will be unchanged in the calling method
i = 'c';
}
// This method passes a variable as a ref parameter; the value of the
// variable is changed after control passes back to this method.
// The same variable is passed as a value parameter; the value of the
// variable is unchanged after control is passed back to this method.
public static void Main()
{
char i = 'a'; // variable must be initialized
TestRef(ref i); // the arg must be passed as ref
Console.WriteLine(i);
TestNoRef(i);
Console.WriteLine(i);
}
}
輸出
b
b
參考資料:MSDN[@more@]
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/443058/viewspace-908092/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- out,ref,params引數傳遞
- Lua中呼叫ref和out修飾引數的函式/過載函式函式
- c# 方法引數(傳值,傳引用,ref,out,params,可選引數,命名引數)C#
- ref和out區別
- C#中ref和out的區別C#
- ref和out的區別
- vue中v-model和.sync修飾符區別Vue
- iOS中assign和weak修飾符的區別iOS
- solidity 引用型別修飾符memory、calldata與storage 常量修飾符Constant與Immutable區別Solid型別LDA
- C#中ref、out及特殊說明引數的用法C#
- java中的修飾符Java
- c# ref out 區別 比較 彙總C#
- NET|Ref 和out 的區別和聯絡
- Kotlin 主建構函式引數的修飾符Kotlin函式
- Vue - 按鍵修飾符 && 系統修飾符Vue
- Java 修飾符Java 修飾符
- java修飾符Java
- Java中的native修飾符Java
- out關鍵字和ref關鍵字的區別
- 關於Java中各種修飾符與訪問修飾符的說明 (轉)Java
- vue 事件修飾符Vue事件
- vue sync 修飾符Vue
- 繼承&修飾符繼承
- iOS __block修飾符iOSBloC
- Java 常用修飾符Java
- 訪問修飾符
- final修飾和static final修飾的區別
- 深入理解 Java 中 protected 修飾符Java
- Java中”失效”的private修飾符解析Java
- java中final修飾符的用法Java
- Spring中ref local=""與ref bean=""的區別SpringBean
- C#深入學習:泛型修飾符in,out、逆變委託型別和協變委託型別C#泛型型別
- 開心檔之C++ 修飾符型別C++型別
- C#語法糖系列 —— 第二篇:聊聊 ref,in 修飾符底層玩法C#
- 探索 Solidity 中的各種修飾符Solid
- Java的static修飾符Java
- 許可權修飾符
- Rust 中 *、&、mut、&mut、ref、ref mut 的用法和區別Rust