2016-11-07 57 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例外是類。

編輯

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關鍵字:無效美孚(REF例外五) – Evk

+2

除非你使用'ref', C#中沒有任何內容是通過引用傳遞的。對於參考類型,數據的_reference_被複制到方法中。所以你可以改變對象(如果它是可變的),但你不能在調用方法中改變變量 – MAV

+1

不是真的重複,但[看看](http://stackoverflow.com/q/186891/1997232)。 – Sinatr

回答

1

當你調用方法Foo(e)e的參考副本被傳遞到Exception e這樣既原始eException e指向相同的位置。然後您更改Exception e中的引用,並指向其他一些異常。但原始e中的參考仍保持不變,因爲它是「按值傳遞」而不是「通過參考傳遞」的情況。

+0

但是異常是類,它不是像整型或布爾型的原始類型。異常是特殊的,它通過價值傳遞。 – broadband

+0

您需要明白,引用變量也存儲在程序堆棧中,就像基本類型一樣。但區別在於引用變量指向存儲實際值的堆,而基元類型將值存儲在堆棧本身中。在這裏,參考變量的值是它在存儲實際值的堆所指的內存位置的地址。此引用通過「傳遞值」方法傳遞,而不是堆中的實際值。 –

0

嘗試這樣說,這與裁判

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方法棧中創建了一個新的對象。原始的主要方法仍然指向原始的異常對象。

e = new Exception("msg1"); 

要重現此爲MyClass的類這樣做,那麼同樣的情形會爲MyClass的發生:

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