2013-01-08 16 views
7

"Yeni 'ifadeyle oluşturulmuş atanmamış atanmış nesneler" ile ilgili sık sık bazı yeniden başlatıcı uyarılar alıyorum. Takip eden kod aşağıdaki durumu gösterecektir:Tasarım - Atanmamış nesneleri önlemek için desen

Bazı özellikleri başka bir sınıftan (MonitoredClass.cs) izleyen bir yardımcı sınıf (Observer.cs) kullanıyorum. Bir özellik değiştiğinde, gözlemci sınıfı değiştirilen değeri başka bir veri sınıfına yazar (DataClass.cs). snipped

basitleştirilmiş kodu:

MonitoredClass.cs:

public class MonitoredClass : INotifyPropertyChanged 
{ 
    // simplified: in fact property calls OnPropertyChange(..) 
    public string Property1 { get; set; } 
} 

DataClass.cs:

public class DataClass 
{ 
    public string LastProperty1Value { get; set; } 
} 

Observer.cs: Şimdiye kadar

public class Observer 
{ 
    private MonitoredClass _monitoredClass; 
    private DataClass _dataClass; 
    public Observer(MonitoredClass monitoredClass, DataClass dataClass) 
    { 
     _monitoredClass = monitoredClass; 
     _dataClass = dataClass; 
     _monitoredClass.PropertyChanged+=MonitoredClassPropertyChanged; 
    } 

    private void MonitoredClassPropertyChanged(..) 
    { 
     _dataClass.LastProperty1Value = _monitoredClass.Property1; 
    } 
} 

çok iyi.

benim Gözlemci sınıfı aşağıdaki gibi yukarıdan şimdi kullanıyorsanız:

... 
new Observer(monitoredClassInstance, dataClassInstance); 
... 

Bir resharper uyarı almak daha " 'yeni' ifadesi yarattığı olası atanmamış nesne". Bu gözlemciyi tasarlamak için daha iyi bir çözüm/model varsa, şimdi sorum şu:. Kabadan, yeni gözlemci örneğini özel bir alana ayırabilirim. Ama hiç kullanılmayan bir alanım var. Veya monitöredClassInstance ve dataClassInstance özelliklerini, yapıcıda iletmek yerine özelliklerini ayarlayabilirim. Ancak bu sadece uyarıyı engeller, fakat aslında mimariyi değiştirmez. vb tavsiye, görüş, desen için şimdiden

Teşekkür

+0

"Yeni Gözlemci (mci, dci)" bir değişkene mi atanıyorsunuz? –

+0

Çöp toplayıcısını newley örneklenmiş 'Observer'ı toplamadan ne engeller? – Jodrell

+0

var a = yeni Gözlemci (monitoredClassInstance, dataClassInstance); – phnkha

cevap

8

Olduğu gibi iyi olabilir. Tabii ki, sadece bir olay işleyicisini eklediğinizden, böylece Gözlemcinin ömrünü MonitoredClass'a bağladığınız için çalışır. Eğer bir olay işleyicisini takmamış olsaydınız, o zaman Gözlemcinin kendisine atıfta bulunmayacağı ve (eninde sonunda) çöp toplayacağı söylenebilir.

düşünüyorum da nedenle yapıcı özel yapmak ve oluşturmak için bir kamu statik fabrika yöntemi yazmaya daha net olabilir:

public class Observer 
{ 
    private MonitoredClass _monitoredClass; 
    private DataClass _dataClass; 

    public static void Observe(MonitoredClass monitoredClass, DataClass dataClass) 
    { 
     new Observer(monitoredClass, dataClass); 
    } 

    private Observer(MonitoredClass monitoredClass, DataClass dataClass) 
    { 
     _monitoredClass = monitoredClass; 
     _dataClass = dataClass; 
     _monitoredClass.PropertyChanged+=MonitoredClassPropertyChanged; 
    } 

    private void MonitoredClassPropertyChanged(..) 
    { 
     _dataClass.LastProperty1Value = _monitoredClass.Property1; 
    } 
} 

Sonra uyarı içinde) (gözlemleyin bastırmak ve insanların kim çağrı bunun için endişelenmenize gerek yok.

+0

haklısın. Sınıfın dışından bu çözüm çok daha iyi görünüyor. – rhe1980

2
public class Observer 
{ 
private MonitoredClass _monitoredClass; 
private DataClass _dataClass; 

public void Setup(MonitoredClass monitoredClass, DataClass dataClass) 
{ 
    _monitoredClass = monitoredClass; 
    _dataClass = dataClass; 
    _monitoredClass.PropertyChanged+=MonitoredClassPropertyChanged; 
} 

private void MonitoredClassPropertyChanged(..) 
{ 
    _dataClass.LastProperty1Value = _monitoredClass.Property1; 
} 
} 

ve

Observer o = new Observer(); 
o.Setup(foo, bar); 

Bu yalnızca uyarıyı engellemez ama aynı zamanda diğer yöntemlerin uygulanması için bir değişiklik verecekti gözlemci gibi

public void Close() 
{ 
    _monitoredClass.PropertyChanged-=MonitoredClassPropertyChanged; 
} 

bir de aboneliği iptal kontrol etmek isterseniz n açık yol.