2012-10-02 31 views
0

從訪問者返回新實例是否存在問題?如果是這樣,是否有更好的方法?獲取訪問器返回新實例是不好的做法嗎?

public class Person 
{ 
    private RecIpDet _ipDet; 
    public RecIpDet IpDet 
    { 
     get 
     {     
      if(_ipDet == null) 
       _ipDet = new RecIpDet(); 
      return _ipDet; 
     } 
    } 
} 
+4

好奇,你爲什麼不將_ipDet設置爲新實例? –

+0

我應該改變的錯。 –

+2

那麼問題是什麼呢?現在,get訪問器不返回新的實例。問題與標題不符。 – FishBasketGordo

回答

4

有問題,因爲您從未設置過您的字段,所以每次調用該屬性時都會返回一個新對象。

如果它爲空,您應該設置_ipDet,然後返回它。這叫做lazy instantiation or lazy initialization

public class Person 
{ 
    private RecIpDet _ipDet; 

    public RecIpDet IpDet 
    { 
     get 
     {     
      if (_ipDet == null) 
      { 
       _ipDet = new RecIpDet(); 
      } 

      return _ipDet; 
     } 
    } 
} 

請記住,這不是線程安全的,所以如果這是你的一個因素,你需要一個更強大的機制。對於單線程應用程序,這種懶惰實例化的方法很好。

如果你使用.NET 4.0或更高版本,可以使用Lazy<T>類,我相信這是線程安全的:

public class Person 
{ 
    private Lazy<RecIpDet> _ipDet = new Lazy<RecIpDet>(() => new RecIpDet()); 

    public RecIpDet IpDet 
    { 
     get 
     {     
      return _ipDet.Value; 
     } 
    } 
} 
1

基於您的評論,它似乎你的意思設置實例,所以這是一個很好的懶惰實例化的典型例子(雖然不是線程安全的)。如果你不需要擔心線程安全,然後通過各種手段,這將工作:

get 
{ 
    if (_ipDet == null) 
     _ipDet = new RecIpDet(); 

    return _ipDet 
} 

但是,如果你在.NET 4.0中是我建議Lazy<T>,而不是建立自己的懶惰建設:

public class Person 
{ 
    private Lazy<RecIpDet> _ipDet = new Lazy<RecIpDet>(); 

    public RecIpDet IpDet 
    { 
     get { return _ipDet.Value; } 
    } 
} 

懶惰的值調用構造函數的第一個呼叫類型,是線程安全的(你可以選擇不同的)線程安全的水平以及..

1

截至目前你總是會返回一個新的對象。除非_ipDet被設置爲一個值。這使得你的代碼行爲非常不可預測。 要麼實現單例模式並替換返回新的RecIpDet(); _ipDet = new RecIpDet();或者讓它總是返回一個新的對象,這很好。

4

對於我們來說,這是通常的做法是:

get 
{ 
    return _ipDet ?? (_ipDet = new RecIpDet()); 
} 
0

這是相當不尋常的使用延時實例,其中大部分是爲辛格爾頓模式的時候,在這裏你會在找到更多信息即:

Implementing Singleton pattern

在此頁面中,你甚至會發現一種方法,使線程安全的。

對於可以從應用程序中的任何位置訪問的全局對象,它可能非常有用。

相關問題