2013-01-08 15 views
7

मुझे अक्सर "नई 'अभिव्यक्ति के साथ बनाए गए असाइन किए गए ऑब्जेक्ट्स के बारे में कुछ रेजारपर चेतावनियां मिलती हैं। निम्नलिखित कोड छीनने के बाद स्थिति का प्रदर्शन होगा:डिज़ाइन- असाइन किए गए ऑब्जेक्ट्स को रोकने के लिए पैटर्न

मैं एक सहायक वर्ग (Observer.cs) का उपयोग कर रहा हूं जो किसी अन्य वर्ग (MonitoredClass.cs) से कुछ गुणों पर नज़र रखता है। जब कोई संपत्ति बदलती है, तो पर्यवेक्षक वर्ग बदलते मान को अन्य डेटा वर्ग (DataClass.cs) में लिखता है।

सरलीकृत कोड कतरना:

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:

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; 
    } 
} 

अब तक तो अच्छा।

अगर मैं इस प्रकार ऊपर से मेरी पर्यवेक्षक वर्ग अब का उपयोग करें:

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

की तुलना में मैं एक ReSharper चेतावनी मिलती है "संभव असाइन नहीं किए गए 'नए' अभिव्यक्ति के द्वारा बनाई गई वस्तु"।

मेरा प्रश्न अब है, अगर इस पर्यवेक्षक को डिजाइन करने के लिए कोई बेहतर समाधान/पैटर्न है। मोटे तौर पर, मैं एक निजी क्षेत्र में नया पर्यवेक्षक उदाहरण आवंटित कर सकता हूं। लेकिन मेरे पास ऐसा क्षेत्र है जिसका कभी भी उपयोग नहीं किया जाता है। या मैं संरक्षक में पास करने के बजाय गुणों के साथ monitoredClassInstance और dataClassInstance सेट कर सकता हूं। लेकिन यह केवल चेतावनी को रोकता है, लेकिन वास्तव में वास्तुकला को नहीं बदलता है।

अपने परामर्श, मत, पैटर्न आदि के लिए अग्रिम धन्यवाद

+0

क्या आप एक चर के लिए "नया पर्यवेक्षक (एमसीआई, डीसीआई)" असाइन कर रहे हैं? –

+0

क्या कचरा कलेक्टर आपके न्यूले तत्काल 'ऑब्जर्वर' को इकट्ठा करने से रोकता है? – Jodrell

+0

var a = new Observer (monitoredClassInstance, dataClassInstance); – phnkha

उत्तर

8

यह ठीक हो सकता है। बेशक, यह केवल काम करता है क्योंकि आपने एक ईवेंट हैंडलर संलग्न किया है, जिससे पर्यवेक्षक का जीवनकाल मॉनीटर क्लास के लिए कर रहा है। यदि आपने इवेंट हैंडलर को संलग्न नहीं किया है, तो ऑब्जर्वर के पास इसका कोई संदर्भ नहीं होगा और यह अंततः कचरा इकट्ठा होगा।

इसके बारे में सोच रही थी, यह इसलिए निर्माता निजी बनाने के लिए और इसे बनाने के लिए एक सार्वजनिक स्थैतिक कारखाने विधि लिखने के लिए स्पष्ट हो सकता है:

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; 
    } 
} 

तो फिर तुम को दबाने चेतावनी के अंदर का निरीक्षण करें() कर सकते हैं और जो लोग कहते हैं इसके बारे में चिंता करने की आवश्यकता नहीं होगी।

+0

आप सही हैं। कक्षा के बाहर से यह समाधान बहुत बेहतर दिखता है। – 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; 
} 
} 

और

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

यह केवल चेतावनी बंद नहीं होंगे, लेकिन यह भी आप पर अन्य तरीकों को लागू करने के लिए एक बदलाव देना होगा पर्यवेक्षक, जैसे कि

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

यदि आप किसी सदस्यता में सदस्यता रद्द करना चाहते हैं एन स्पष्ट तरीका।

संबंधित मुद्दे