में पास करने के लिए मूल्य प्रकारों के उत्परिवर्तनीय रैपर मैं एक इटरेटर लिख रहा हूं जिसे एक उत्परिवर्तनीय पूर्णांक को पारित करने की आवश्यकता है।इटरेटर
public IEnumerable<T> Foo(ref int valueThatMeansSomething)
{
// Stuff
yield return ...;
}
यह मुझे नेट करता है "त्रुटि 476 Iterators को रेफरी या आउट पैरामीटर नहीं हो सकता है"।
मुझे यह पूर्णांक मानरेटर में संशोधित करने और पुनरावर्तक के कॉलर द्वारा उपयोग करने योग्य करने की आवश्यकता है। दूसरे शब्दों में, Foo()
जो भी कॉल करता है, उसे valueThatMeansSomething
और Foo()
का अंतिम मान जानना चाहता है। असल में, मैं एक पूर्णांक चाहता हूं जो एक संदर्भ प्रकार है जो मूल्य प्रकार नहीं है।
केवल एक चीज जिसे मैं सोच सकता हूं वह एक वर्ग लिखना है जो मेरे पूर्णांक को समाहित करता है और मुझे इसे संशोधित करने की अनुमति देता है।
public class ValueWrapper<T>
where T : struct
{
public ValueWrapper(T item)
{
this.Item = item;
}
public T Item { get; set; }
}
तो:
ValueWrapper<int> w = new ValueWrapper<int>(0);
foreach(T item in Foo(w))
{
// Do stuff
}
if (w.Item < 0) { /* Do stuff */ }
वहाँ किसी भी वर्ग या तंत्र बीसीएल में पहले से ही इस संभाल करने के लिए है? ऊपर प्रस्तावित ValueWrapper<T>
के साथ कोई भी दोष?
फ़ील्ड अस्थिर बनाना थ्रेड सुरक्षा सुनिश्चित करने के लिए पर्याप्त नहीं है क्योंकि मनमानी मूल्य प्रकारों को लिखना सी # विनिर्देश द्वारा परमाणु होने की गारंटी नहीं है। अस्थिरता परमाणुता की गारंटी नहीं देता है, यह केवल कुछ संकलक-अनुकूलन-प्रेरित आदेश मुद्दों को समाप्त करता है। –
यदि आप थ्रेड सुरक्षा की परवाह करते हैं, तो ताले का उपयोग करें। –
@Eric: हाँ, अच्छा बिंदु। मैंने मूल रूप से लिखा था कि यह परमाणुता की गारंटी देता है, लेकिन फिर इसे तुरंत हटा दिया गया क्योंकि मुझे एहसास हुआ कि यह आवश्यक नहीं है। – Noldorin