2016-11-07 23 views
-1
private static void Foo(Exception e) 
{ 
    e = new Exception("msg1"); 
} 

static void Main(string[] args) 
{ 
    try 
    { 
    int zero = 0; 
    int ecks = 1/zero; 
    } 
    catch (Exception e) 
    { 
    // I thought Exception is passed by reference, therefore Foo changes e to 
    // point to new Exception instance with message "msg1". 
    // But it stays the same 
    Foo(e); 
    throw e; 
    } 
} 

メソッドへの例外の受け渡し

public class MyClass 
{ 
    public string Name { get; set; } 
} 

private static void Foo(MyClass m) { m.Name = "bar"; } 

static void Main(string[] args) 
{ 
    Voda v = new Voda(); 
    v.Name = "name"; 
    Foo(v); // v.Name gets value "bar" 
} 

msdn例外はクラスです。

EDIT

private static void Foo(Exception e) 
{ 
    while (e != null && e.InnerException != null) 
    { 
    // I'm changing where e points. 
    // Therefore caller Exception should now point to most inner exception 
    e = e.InnerException; 
    }); 
} 
+1

使用して、REFキーワード:無効はFoo(REF例外e) – Evk

+2

をあなたは 'ref'を使用していない限り、 C#では何も参照渡しされません。参照型の場合、データへの参照はメソッドに_copied_されます。だからオブジェクトを変更することができます(変更可能な場合)が、呼び出し側メソッドの変数を変更することはできません – MAV

+1

実際には重複していませんが、[見て](http://stackoverflow.com/q/186891/1997232)。 – Sinatr

答えて

1

でそのようにそれを試してみて、 Exception eは同じ場所を指します。次にException eの参照を変更し、それは他の例外を指しています。しかし、オリジナルのeの参照は、「参照渡し」ではなく「値渡し」のケースであるため、同じままです。

+0

しかし、例外はクラスであり、integerやbooleanのようなプリミティブ型ではありません。例外は何とか特別なもので、それは価値によって渡されたものです。 – broadband

+0

参照変数はプリミティブ型のようにプログラムスタックにも格納されることを理解する必要があります。しかし、違いは、参照変数は実際の値が格納されている場所をヒープにポイントし、プリミティブ型はスタック自体に値を格納する点です。ここで参照変数の値は、実際の値が格納されているヒープ上で参照されているメモリ位置のアドレスです。この参照は、ヒープの実際の値ではなく、「値渡し」メソッドによって渡されます。 –

0

あなたは両方の元eようe内部リファレンスのコピーがException eに渡されるメソッドFoo(e)を呼び出すとREF

private static void Foo(ref Exception e) 
{ 
    e = new Exception("msg1"); 
} 

static void Main(string[] args) 
{ 
    try 
    { 
    int zero = 0; 
    int ecks = 1/zero; 
    } 
    catch (Exception e) 
    { 
    // I thought Exception is passed by reference, therefore Foo changes e to 
    // point to new Exception instance with message "msg1". 
    // But it stays the same 
    Foo(ref e); 
    throw e; 
    } 
} 
0

以下の行は、Fooメソッドの現在のスタックでのみ有効な新しいオブジェクトを作成しました。元のmainメソッドは元の例外オブジェクトを指しています。

e = new Exception("msg1"); 

これを実行し、同じシナリオは、MyClassのために発生しますMyClassのクラスのためにこれを再現するために:

private static void Foo(MyClass m) { m = New MyClass(); m.Name = "bar"; } 
関連する問題