C#outがあるのにrefを必要としないの?
refとoutはいずれもC#のキーワードであり、実装される機能もそれほど悪くなく、1つのパラメータを指定して参照に従って伝達する.コンパイルされたプログラムでは、文法的な違いしかありません.まとめると、1、refに渡されたパラメータは呼び出し前に初期化されなければならず、outは必要ありません.すなわち、
2、refに渡されたパラメータは関数の内部で直接使用できますが、outはできません.
3、refに渡されたパラメータは関数内部で変更されなくてもよいが、outは関数体を離れる前に付与しなければならない.まとめ:refに対するシステムの制限はもっと少ないと言える.outは呼び出し前に必ず初期化する必要はありませんが、その値は関数内部では表示されません.つまり、outを介して渡された値は使用できません.必ず値を割り当てます.すなわち,関数はこの変数を初期化する責任を負う.
次の例では、簡単な使用を示します.
1.OUT
2.REF
多くの子供靴が聞かれますが、私たちは引用タイプがあるのではないでしょうか.どうしてrefとoutを使うの?はい、私たちは引用タイプがありますが、outとrefを使えば数値タイプも引用タイプと見なすことができます.それは便利ではありませんか.呼び出し元メソッドは、複数の数値タイプの変数を受け入れ、入力された複数の数値タイプの変数を操作する場合があります.引用を伝えると、便利じゃないですか?!そうですか.もちろん、便利のためだけではなく、実質を理解する必要があります.数値オブジェクトを渡すときは、そのオブジェクトのコピーを呼び出し元に渡す方法ですが、REFとOUTパラメータを渡すのは、そのオブジェクトの参照を渡すことで、呼び出し元で実際に渡されたオブジェクトの実際のバージョンを操作することができます.2つの差は、本質的ですよね?
ええ、もちろんrefとoutは値タイプのオブジェクトだけでなく、参照タイプのオブジェクトもパッケージできます.
ここで注意しなければならないことがあります.refとoutを使用して値を渡すと、呼び出し元と被呼び出し元メソッドの両方にこの2つのキーワードが表示されます.
2.refとout修飾のパラメータはメソッドの署名として考慮されない.パラメータパッケージのキーワードがrefとoutだけ異なる2つのメソッドの署名があれば,この2つのメソッドの署名は同じとみなされ,リロードではないという意味である.次のコードがあります.
しかし次の2つの方法は重荷だと考えられています
int i;
SomeMethod( ref i );//
SomeMethod( out i );//
2、refに渡されたパラメータは関数の内部で直接使用できますが、outはできません.
public void SomeMethod(ref int i)
{
int j=i;//
//...
}
public void SomeMethod(out int i)
{
int j=i;//
}
3、refに渡されたパラメータは関数内部で変更されなくてもよいが、outは関数体を離れる前に付与しなければならない.まとめ:refに対するシステムの制限はもっと少ないと言える.outは呼び出し前に必ず初期化する必要はありませんが、その値は関数内部では表示されません.つまり、outを介して渡された値は使用できません.必ず値を割り当てます.すなわち,関数はこの変数を初期化する責任を負う.
次の例では、簡単な使用を示します.
1.OUT
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Text(out string name , out string sex, out string age)
{
name = "louis";
sex = "male";
age = "25";
}
static void Main(string[] args)
{
string name, sex, age;
Text(out name,out sex,out age);
Console.WriteLine("My name is {0},I'm {1},I'm {2}", name, sex, age);
Console.ReadKey();
}
}
}
2.REF
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void TextOut(out string name , out string sex, out string age)
{
name = "louis";
sex = "male";
age = "25";
}
static void TextRef(ref string name, ref string sex, ref string age)
{
name = "ice";
sex = "female";
age = "24";
}
static void Main(string[] args)
{
//string name, sex, age;
//TextOut(out name,out sex,out age);
string name = "louis";
string sex = "male";
string age = "25";
TextRef(ref name, ref sex, ref age);
Console.WriteLine("My name is {0},I'm {1},I'm {2}", name, sex, age);
Console.ReadKey();
}
}
}
多くの子供靴が聞かれますが、私たちは引用タイプがあるのではないでしょうか.どうしてrefとoutを使うの?はい、私たちは引用タイプがありますが、outとrefを使えば数値タイプも引用タイプと見なすことができます.それは便利ではありませんか.呼び出し元メソッドは、複数の数値タイプの変数を受け入れ、入力された複数の数値タイプの変数を操作する場合があります.引用を伝えると、便利じゃないですか?!そうですか.もちろん、便利のためだけではなく、実質を理解する必要があります.数値オブジェクトを渡すときは、そのオブジェクトのコピーを呼び出し元に渡す方法ですが、REFとOUTパラメータを渡すのは、そのオブジェクトの参照を渡すことで、呼び出し元で実際に渡されたオブジェクトの実際のバージョンを操作することができます.2つの差は、本質的ですよね?
ええ、もちろんrefとoutは値タイプのオブジェクトだけでなく、参照タイプのオブジェクトもパッケージできます.
ここで注意しなければならないことがあります.refとoutを使用して値を渡すと、呼び出し元と被呼び出し元メソッドの両方にこの2つのキーワードが表示されます.
2.refとout修飾のパラメータはメソッドの署名として考慮されない.パラメータパッケージのキーワードがrefとoutだけ異なる2つのメソッドの署名があれば,この2つのメソッドの署名は同じとみなされ,リロードではないという意味である.次のコードがあります.
static void Test(out string name);
static void Test(ref string name);// 2 , , 。
しかし次の2つの方法は重荷だと考えられています
static void Test(string name);
static void Test(ref string name);