asp.Net(c#)ref,out,paramsの違い

3726 ワード

NO.1 params
メソッド(関数)の可変パラメータを持つキーワードです.
原則:メソッド宣言のparamsキーワードの後に他のパラメータは許可されず、メソッド宣言ではparamsキーワードが1つしか許可されません.
例(vs 2005にコピーすれば使用可能であり、以下説明しない)


public partial class Form1 : Form
{
public static void UseParams(params int[] list)
{
string temp = "";
for (int i = 0; i < list.Length; i++)
temp = temp +" " +list[i].ToString();
MessageBox.Show(temp);
}
public static void UseParams2(params object[] list)
{
string temp = "";
for (int i = 0; i < list.Length; i++)
temp = temp + " " + list[i].ToString();
MessageBox.Show(temp);
}
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
UseParams(1, 2, 3);// 3
UseParams(1, 2); // 2 ,
UseParams2(1, 'a', "test");
int[] myarray = new int[3] { 10, 11, 12 };
UseParams(myarray); // , :)
}
}
NO.2 out
これは参照伝達Lです.
原則1:メソッド(関数)がoutをパラメータとして使用する場合、メソッド(関数)がoutパラメータに対して行った変更は、その変数に反映されます.
原則2:メソッドが複数の値を返すことを望む場合、outメソッドを宣言することは非常に有用である.outパラメータを使用する方法では、値を返すことができます.1つの方法は、outパラメータを1つ以上持つことができる.
原則3:outパラメータを使用するには、outパラメータとしてメソッドにパラメータを明示的に渡す必要があります.outパラメータの値はoutパラメータに渡されません.
原則4:outパラメータとして渡される変数を初期化する必要はありません.outパラメータはメソッド(関数)に入ったときに自分を空にし、自分をきれいなパラメータにする必要があります.このため、メソッドが戻る前にoutパラメータに値を付けなければなりません(アドレスに値のないパラメータだけは.netでは受け入れられません).
原則5:属性は変数ではなく、outパラメータとして渡すことはできません.
原則6:2つのメソッドの宣言が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を使用して配列を伝達するを参照してください.
例添付
NO.2 ref
refはただのアドレス!!!
原則1:メソッド(関数)がrefをパラメータとして使用する場合、メソッド(関数)がrefパラメータに加えた変更は、その変数に反映されます.
原則2:メソッドを呼び出すと、メソッドでパラメータに加えた変更が変数に反映されます.
原則3:refパラメータを使用するには、パラメータをrefパラメータとしてメソッドに明示的に渡す必要があります.refパラメータの値はrefパラメータに渡すことができる.
原則4:refパラメータが伝達する変数は初期化しなければならない.refパラメータはメソッド(関数)に入ったときもそれ自身であり、このアドレスが元の値を指しているため、refパラメータもその方法の内部で操作しないことができる.
原則6:2つのメソッドの宣言が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を使用して配列を伝達するを参照してください.


public static string TestOut(out string i)
{
i = "out b";
return "return value";
}
public static void TestRef(ref string i)
{
//
i = "ref b";
}
public static void TestNoRef(string refi)
{
// ,
refi = "on c";
}
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string outi;//
MessageBox.Show(TestOut(out outi));//
// "return value";
MessageBox.Show(outi);// out
// "out b";
string refi = "a"; //
TestRef(ref refi); //
MessageBox.Show(refi);
// "ref b";
TestNoRef(refi);// ref
MessageBox.Show(refi);
// "ref b";
}