2009-06-19 17 views

答えて

14
  • アウトを使用します。初期化されていないパラメータを渡すと、そのパラメータを初期化して塗りつぶす必要があります(そうでなければ警告またはエラーが発生します)。

    bool IsUserValid(string username);

    void IsUserValid(string username、out bool valid);

上記の宣言はほぼ同じです。値を返す方が簡単なので、この場合は戻り値の型を使用します。しかし、あなたのメソッドも戻り値の両方のパラメータを返すことができないユーザーの生年月日を返す必要がある場合は、それらのいずれかを返すためにパラメータを使用する必要があります(またはメソッドを無効にして両方として返します)。

+0

完璧な説明簡潔で把握しやすいありがとうございました – Marin

1

あなたはあなたのMSDN linkを与えて表示する何より良い方法;)

そのリンクからは:

refとアウトの違いは微妙ですが、重要なです。各パラメータ渡しモードは、わずかに異なるプログラミングシナリオに適用されるように設計されています。 outパラメータとrefパラメータの重要な違いは、それぞれが使用する明確な割り当てルールです。あなたは初期化パラメータを渡すと、あなたはそれを変更する方法/機能を期待するときは、参考を使用

2

注目すべき点の1つは、リファレンスタイプのパラメータで「ref」を使用する場合です。 "ref"は参照のためのものであり、参照が指すオブジェクトの内容のものではありません。

リファレンスで「値」(つまり「ref」または「out」なし)を渡した場合、参照を変更することはできません(したがって、「新しい」はコールに耐えられません)。しかし、この参照が指すプロパティの値を変更することはできます(クラスが許可している場合)。

1

outとrefを使用する(または乱用する)ことは一般的には戸惑うことがあります。構造体や単純なクラスを返すのがよりクリーンです。

refに対しては、outには初期化されていない変数が必要です。関数を終了する前にoutパラメータを設定しない限り、コードはコンパイルされません。

以下のコードは、したがって、ないコンパイルします:

bool TryParse(string text, out int result) 
{ 
    if (text == null) 
    return false; 
    else 
    { 
    // do the parsing 
    } 
} 

のrefのは、それらを設定する必要はありません。また、Hansが言及しているように、refを使用するときに参照型のオブジェクトを実際に "新しく"呼び出すことができます(C++のオブジェクト**ポインタとほぼ同じです)。

0

実際には3出力として値とにより、参照によってた:方法にパラメータを渡す方法。値ことで

デフォルトで、C#でキーワードを持っていません(それはVB.Netで行います。ByVal) - それは値型のコピーを渡します。

紛らわしい
public void SomeMethod1(int num) 
{ 
    num = 2; 
} 

int myNum = 1; 
SomeMethod1(myNum ); 
// myNum is still 1, we just set a new one 

からことで値は、参照タイプの参照のコピーを渡します。それは戻って、インスタンスへの参照型点への変更を意味しますが、あくまでも参考に、実際のポインタのコピーがありますC#またはByRef参照refで今

public void SomeMethod1(MyClass instance) 
{ 
    // changes the name on the instance 
    instance.Name = "test 1"; 

    // we're only nulling the copy passed to this method 
    instance = null; 
} 

public void SomeMethod2(MyClass instance) 
{ 
    // changes the name on the instance 
    instance.Name = "test 2"; 

    // this is a new instance only in this method 
    instance = new MyClass { Name = "new instance" }; 
} 

MyClass myInst = new MyClass { Name = "original" }; 
SomeMethod1(myInst); 
// myInst.Name is now "test 1" 

SomeMethod2(myInst); 
// myInst.Name is now "test 2" 

[OK]をインスタンスへの実際のポインタではなく、コピーを通過参照することによって十分に簡単が、参照型ため

public void SomeMethod1(ref int num) 
{ 
    num = 2; 
} 

int myNum = 1; 
SomeMethod1(ref myNum ); 
// myNum is now 2, we changed the reference 

)VB.Netに構造体の値への参照を渡し
public void SomeMethod1(ref MyClass instance) 
{ 
    // changes the name on the instance 
    instance.Name = "test 1"; 

    // we're nulling the reference passed to this method 
    instance = null; 
} 

public void SomeMethod2(ref MyClass instance) 
{ 
    // changes the name on the instance 
    instance.Name = "test 2"; 

    // this is a new instance replacing the original 
    instance = new MyClass { Name = "new instance" }; 
} 

MyClass myInst = new MyClass { Name = "original" }; 
SomeMethod1(ref myInst); 
// myInst.Name will now throw a NullReferenceException because myInst is null 

SomeMethod2(ref myInst); 
// myInst.Name is now "new instance" 

あなたが(むしろ、あなたが参照しているものよりも)参照自体を変更しているのであれば値による参照とによって両方は参照型についても同様であるが、動作は非常に異なっています。

最後にとして出力は、実際のリターンと同じように、余分なリターン変数です。これらの2つは基本的に同じです:

outパラメータがある場合は、メソッドによって(返り値のように)入力する必要があります。

関連する問題