2013-05-10 11 views
5

私は差がオブジェクトパラメータが参照される方法に関して、以下の方法の間にあるのだろうか。2つのメソッドとrefオブジェクトparとwithoutの違いは何ですか?

public void DoSomething(object parameter){} 

public void DoSomething(ref object parameter){} 

私は参照を変更したい場合にref object parameterを使用すべきobjectに同じ参照のオブジェクトを上書きしないでください。

+2

RTM:http://msdn.microsoft.com/en-us/library/14akc2c7.aspx –

答えて

8
public void DoSomething(object parameter) 
{ 
    parameter = new Object(); // original object from the callee would be unaffected. 
} 

public void DoSomething(ref object parameter) 
{ 
    parameter = new Object(); // original object would be a new object 
} 

記事を参照してください:Parameter Passing in C# by Jon Skeet

C#ではrefキーワードは、元のオブジェクトがrefキーワードを指定せずに、新しいオブジェクトまたはnullを割り当てることができ、その後に使用されている場合、参照型オブジェクトのアドレスは、値渡しされますそれは不可能です。

は、次の例を考えてみましょう:

class Program 
{ 
    static void Main(string[] args) 
    { 
     Object obj1 = new object(); 
     obj1 = "Something"; 

     DoSomething(obj1); 
     Console.WriteLine(obj1); 

     DoSomethingCreateNew(ref obj1); 
     Console.WriteLine(obj1); 

     DoSomethingAssignNull(ref obj1); 
     Console.WriteLine(obj1 == null); 
     Console.ReadLine(); 
    } 
    public static void DoSomething(object parameter) 
    { 
     parameter = new Object(); // original object from the callee would be unaffected. 
    } 

    public static void DoSomethingCreateNew(ref object parameter) 
    { 
     parameter = new Object(); // original object would be a new object 
    } 

    public static void DoSomethingAssignNull(ref object parameter) 
    { 
     parameter = null; // original object would be a null 
    } 
} 

出力は次のようになります。

Something 
System.Object 
True 
0

引数を渡すのByVal: を説明変数自体を変更することはできません手順を意味した値で引数を渡します。

引数引数渡し変数: 引数を参照渡しで説明します。つまり、プロシージャは変数自体を変更できます。

+1

しかし、 'objects'はデフォルトで参照によって' c# 'に渡されています。 – harry180

+0

参照自体をオブジェクトの値として数えるのでなければ? –

0

ref objectという意味は、引数はobjectタイプである必要があります。あなたがドキュメントを読み込むことができます

を仮パラメータが参照パラメータである場合には、メソッド呼び出しで対応する 引数は、変数参照(§5.3に続くキーワードREF で構成する必要があります。 3)を入力します。参照パラメータとして を渡す前に、変数を確実に割り当てる必要があります。

1

refで変数を渡すと、関数はその変数を別のオブジェクトに代入することができます。 C#ので

object parameter = new object(); 

FailedChangeRef(parameter); // parameter still points to the same object 
ChangeRef(ref parameter); // parameter now points to null 

public void FailedChangeRef(object parameter) 
{ 
      parameter = null; // this has no effect on the calling variable 
} 

public void ChangeRef(ref object parameter) 
{ 
      parameter = null; 
} 
0

、メソッドの引数のデフォルトのメカニズムは価値によってパスです。あなたはそう、などの

public void DoSomething(object parameter){} // Pass by value 

のメソッドを宣言している場合そのため、オブジェクトの新しいコピーが作成されるので、パラメータの変更が渡された元のオブジェクトには影響しません。uは、REFによってパラメータを渡すとき

はしかし、それは今、あなたが最初に渡されたオブジェクト上のアドレス上で動作しているリファレンス

public void DoSomething(ref object parameter) // Pass by reference 

によってパスです。したがって、メソッド内のパラメータを変更していると、元のオブジェクトに影響します。

関連する問題