2011-04-05 22 views
5

मैं एक वर्ग की संपत्ति है कि इस प्रकार दिखता है।सी # कोड विश्लेषण 2227 भ्रम

private void RecipeSearch() 
{ 
      this.RecipeList = RecipeManagerService.SearchByUnit(SearchCriteria) 
           .Where(recipe => recipe.IsApproved == true && !recipe.IsHidden).ToList(); 
} 

कोड विश्लेषण एक सीए 2227 चेतावनी जारी करने वाले है: RecipeList बदलें रीड-ओनली को सेटर को हटाने के द्वारा। क्या कोई मुझे बता सकता है क्यों?

+0

क्या कुछ भी सेटटर का उपयोग करता है? – Douglas

+0

@ डगलस - हाँ, मेरे पास XAML है। – Hosea146

उत्तर

3

List<T> ऑब्जेक्ट पर सार्वजनिक सेटटर जोड़ना खतरनाक है। आप अपने सेटर निजी बनाकर इस चेतावनी को खत्म कर सकते हैं:

public List<Recipe> RecipeList 
{ 
    get { return this._recipeList; } 

    private set 
    { 
     this._recipeList = value; 
     OnPropertyChanged("RecipeList"); 
    } 
} 

यह अभी भी अपने वर्ग इस विधि है, लेकिन कोई बाहरी स्रोत बदलने के लिए अनुमति देगा।

+0

धन्यवाद। यह वही है जो मुझे करना चाहिए। – Hosea146

1

क्या आप RecipeList के साथ एक और उदाहरण गड़बड़ करना चाहते हैं? आम तौर पर, मैं संग्रह के मालिक के उदाहरण को छोड़कर कुछ भी अपने संग्रह उदाहरणों को बदलने नहीं देता हूं। आप इसे private बना सकते हैं।

2

मुझे लगता है कि यह सुझाव दे रहा है कि आम तौर पर संग्रह गुण स्वयं को उत्परिवर्तनीय नहीं होना चाहिए - संग्रह के लिए यह अधिक आम है, और बस एक सेटटर के माध्यम से उपलब्ध है।

RecipeList.Clear(); 
RecipeList.AddRange(RecipeManagerService 
           .SearchByUnit(SearchCriteria) 
           .Where(r => r.IsApproved && !r.IsHidden)); 

ध्यान दें कि यह नहीं आग परिवर्तन घटना हालांकि ... आप देख सकते हैं:

यह केवल एक सुझाव हालांकि :)

इस मामले में आप का उपयोग करेंगे इसके बजाय ObservableCollection का उपयोग करें।

इसका यह भी अर्थ होगा कि कोई भी नुस्खा सूची की सामग्री को बदल सकता है ... क्या आप निश्चित रूप से यह चाहते हैं? एक और विकल्प ReadOnlyCollection<T> संपत्ति या उस तरह कुछ ऐसा खुलासा करना है, और केवल अपनी कक्षा में परिवर्तन करना है। यह वास्तव में निर्भर करता है कि आप क्या करने की कोशिश कर रहे हैं।

0

मुझे नहीं लगता कि कोड के बारे में कुछ भी अवैध है, लेकिन संग्रह सामान्य गुणों के लिए कोई सार्वजनिक सेटटर नहीं है। आपकी निजी RecipeSearch विधि को केवल _recipeList सेट करना चाहिए और ईवेंट को बढ़ाएं, या आप _recipeList स्वयं को एक सुरक्षित संपत्ति बना सकते हैं जो ईवेंट को संभालती है।

1

MSDN description काफी स्पष्ट है:

एक लिखने योग्य संग्रह संपत्ति की अनुमति देता है एक उपयोगकर्ता एक पूरी तरह से अलग संग्रह

साथ संग्रह को बदलने के लिए यह अच्छा OO नहीं होगा अगर ग्राहक आपकी कक्षा में सूची व्यंजनों की पूरी तरह से अलग सूची होने के लिए सूची बदल सकती है। यह encapsulation के खिलाफ है।

ग्राहकों को सुनिश्चित करना केवल आइटम जोड़ना या निकालना है जो आप शायद करना चाहते हैं।

0

सूची संपत्ति को दो तरीकों से उत्परिवर्तित करने की अनुमति देना (इसके अपने Add और Remove विधियों और पूरी तरह से सूची उदाहरण) उन संपत्तियों का उपभोग करने वालों के लिए एक अस्पष्ट इंटरफेस बनाता है। यह जिम्मेदारियों को भ्रमित करता है और एक बड़ा तकनीकी ऋण/रखरखाव ओवरहेड बनाता है।

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

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