2012-04-18 16 views
2

我想從另一個類A初始化B類型的對象,爲什麼我仍然得到空?是否有可能不使用refout修飾符?爲什麼我不能以相同的方式初始化對象(不使用ref)?

class A 
    { 
     public void Initialize(B value) 
     { 
      if (value == null) 
      { 
       value = new B(); 
      } 
     } 
    } 

    class B 
    { 

    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      A a = new A(); 
      B b = null; 
      a.Initialize(b); 
     } 
    } 

[UPD]我以爲b變量可以通過ref,因爲它傳遞的類的實例。

+0

你爲什麼期待別的什麼?請閱讀http://pobox.com/~skeet/csharp/parameters.html – 2012-04-18 08:11:20

回答

6

這是可能的,只是做初始化()的函數:

class A 
{ 
    public B Initialize(B value) 
    { 
     if (value == null) 
     { 
      value = new B(); 
     } 
     return value; 
    } 
} 

,並調用它像:

static void Main(string[] args) 
    { 
     A a = new A(); 
     B b = null; 
     b = a.Initialize(b); 
    } 

這是一個很好的解決方案,數據流是清晰可見的。沒有驚喜。

但除此之外,只需使用一個ref(不是out):public void Initialize(ref B value)和呼叫a.Initialize(ref b);


我想b變量可以由裁判通過,因爲它是類的實例。

爲了回答這個問題,你需要非常精確的措辭:b一個類的實例。 b是對實例的引用。實例永遠不會有名字。

b被視爲值類型:引用通過值傳遞給方法。除非你使用ref

+1

''''操作符在這裏很方便:'public B Initialize(B value){return value新B(); }':) – Guffa 2012-04-18 08:19:11

+0

@Guffa - 我知道,但我對原始代碼進行了微小的更改。 – 2012-04-18 08:27:52

+0

@HenkHolterman thanx的解釋。我真的不知道「b不是一個類的實例,b是對一個實例的引用」。 – 2012-04-18 09:51:22

1

public void Initialize(B value)

在此方法中,value就像是一個局部變量,當你分配的東西給它, 來電不受影響。

有沒有可能不使用ref和out修飾符?

不以這種方式,這就是ref/out的用途。

雖然您可以返回新的對象,並將其分配給調用者。

public B Initialize() { 
    return new B(); 
    } 

... 
    b = a.Initialize(); 
相關問題