निम्नलिखित कोड दो CA2000 चेतावनियां उत्पन्न करता है (दूसरों के बीच, लेकिन यह बात नहीं है)।स्वामित्व स्थानांतरित होने पर CA2000 चेतावनी से कैसे छुटकारा पाएं?
public sealed class Item: IDisposable
{
public void Dispose() {}
}
public sealed class ItemContainer
{
public void Add(Item item)
{
}
}
public sealed class Test: IDisposable
{
private ICollection<Item> itemCollection;
private ItemContainer itemContainer;
private void Add(Item item)
{
itemCollection.Add(item);
}
public void Initialize()
{
var item1 = new Item(); // no warning
itemCollection.Add(item1);
var item2 = new Item(); // CA2000: call Dispose on object item2
Add(item2);
var item3 = new Item(); // CA2000: call Dispose on object item3
itemContainer.Add(item3);
}
public void Dispose() {}
}
ध्यान दें कि आइटम 1 के लिए कोई चेतावनी उत्पन्न नहीं है। ऐसा लगता है, कोड विश्लेषण मानता है कि ICollection
आइटम की ज़िम्मेदारी लेगा और अंत में इसका निपटान करेगा।
क्या मेरे Add
विधियों को चिह्नित करने का कोई तरीका है, ताकि चेतावनी दूर हो जाए?
मैं CA1062 के लिए ValidatedNotNullAttribute
के समान कुछ ढूंढ रहा हूं।
संपादित करें: इसे स्पष्ट करने के लिए: यह मेरा असली कोड नहीं है। असली कोड में, सब ठीक से निपटान किया जाता है।
यह सिर्फ इतना है कि सीए यह नहीं पहचानता कि मेरे Add
विधियों को कॉल स्वामित्व स्थानांतरित करता है। मैं इसे अपने एड विधियों के साथ उसी तरह व्यवहार करना चाहूंगा जिस तरह से यह ICollection.Add
का इलाज करता है।
उसी दायरे में निपटना एक विकल्प नहीं है।
मेरा स्वयं का जवाब स्वीकार किया गया, क्योंकि मैंने इस मामले में यही किया है: एक वर्ग पर आईसीओलेक्शन लागू करें जो पहले से ही IDISposable लागू किया गया है। मैं पूरी तरह से डेमियन से सहमत हूं: अगर सीए को आईडीस्पोजेबल और आईसीओलेक्शन दोनों की आवश्यकता होती है तो यह अधिक समझ में आ जाएगा। – Henrik
क्या इंडेक्स द्वारा डिस्पोजेबल वस्तुओं के शब्दकोश पर कुछ समान करने का कोई तरीका है? – Dave