संपादित करें: कुछ नमूना कोड जो कि कई (शायद सभी?) सरणी पर पुनरावृत्त करने के संभावित तरीकों की खोज करता है।
एनम प्रकार डिफ़ॉल्ट रूप से int से "व्युत्पन्न" माना जाता है। आप इस तरह के बाइट, लघु, लंबे, आदि
दोनों ही मामलों में के रूप में, यदि आप चाहते अन्य पूर्णांक प्रकारों में से एक से प्राप्त करने के लिए चुन सकते हैं, Enum.GetValues
करने के लिए कॉल ReportStatus ऑब्जेक्ट की श्रृंखला लौटा रहा है।
पहले लूप में विविध कीवर्ड का उपयोग करने से संकलक को निर्दिष्ट प्रकार के सरणी का उपयोग करने के लिए कहा जाता है, जो कि रिपोर्ट वैरिएबल है, जो मान चर के प्रकार को निर्धारित करने के लिए है। Enums के लिए ToString कार्यान्वयन enum प्रविष्टि का नाम वापस करना है, न कि पूर्णांक मूल्य का प्रतिनिधित्व करता है, यही कारण है कि नाम पहले लूप से आउटपुट हो रहे हैं।
दूसरे पाश में एक इंट चर का उपयोग करने से मान Enum.GetValues
द्वारा लौटाए गए मानों को रिपोर्टस्टैटस से int में परिवर्तित रूप से परिवर्तित किया जा सकता है। एक int पर कॉलिंग ToString, निश्चित रूप से, एक स्ट्रिंग को पूर्णांक मान का प्रतिनिधित्व करते हैं। अंतर्निहित रूपांतरण व्यवहार में अंतर का कारण बनता है।
अपडेट: जैसा कि अन्य ने इंगित किया है, Enum.GetValues फ़ंक्शन ऐरे के रूप में टाइप की गई ऑब्जेक्ट देता है, और नतीजतन यह ऑब्जेक्ट प्रकारों का एक गणना है, रिपोर्टस्टैटस प्रकार नहीं।
भले ही, अंतिम परिणाम एक ही है सरणी या अधिक पुनरावृत्ति कि क्या ReportStatus []:
class Program
{
enum ReportStatus
{
Assigned = 1,
Analyzed = 2,
Written = 3,
Reviewed = 4,
Finished = 5,
}
static void Main(string[] args)
{
WriteValues(Enum.GetValues(typeof(ReportStatus)));
ReportStatus[] values = new ReportStatus[] {
ReportStatus.Assigned,
ReportStatus.Analyzed,
ReportStatus.Written,
ReportStatus.Reviewed,
ReportStatus.Finished,
};
WriteValues(values);
}
static void WriteValues(Array values)
{
foreach (var value in values)
{
Console.WriteLine(value);
}
foreach (int value in values)
{
Console.WriteLine(value);
}
}
static void WriteValues(ReportStatus[] values)
{
foreach (var value in values)
{
Console.WriteLine(value);
}
foreach (int value in values)
{
Console.WriteLine(value);
}
}
}
बस कुछ अतिरिक्त मनोरंजन के लिए, मैं निर्दिष्ट से अधिक बार-बार दोहराना के कई अलग अलग तरीकों का प्रदर्शन नीचे कुछ कोड जोड़ दिया है एक फोरैच लूप के साथ सरणी, जिसमें टिप्पणियां शामिल हैं जो विस्तार से बताती हैं कि प्रत्येक मामले में क्या हो रहा है।
class Program
{
enum ReportStatus
{
Assigned = 1,
Analyzed = 2,
Written = 3,
Reviewed = 4,
Finished = 5,
}
static void Main(string[] args)
{
Array values = Enum.GetValues(typeof(ReportStatus));
Console.WriteLine("Type of array: {0}", values.GetType().FullName);
// Case 1: iterating over values as System.Array, loop variable is of type System.Object
// The foreach loop uses an IEnumerator obtained from System.Array.
// The IEnumerator's Current property uses the System.Array.GetValue method to retrieve the current value, which uses the TypedReference.InternalToObject function.
// The value variable is passed to Console.WriteLine(System.Object).
// Summary: 0 box operations, 0 unbox operations, 1 usage of TypedReference
Console.WriteLine("foreach (object value in values)");
foreach (object value in values)
{
Console.WriteLine(value);
}
// Case 2: iterating over values as System.Array, loop variable is of type ReportStatus
// The foreach loop uses an IEnumerator obtained from System.Array.
// The IEnumerator's Current property uses the System.Array.GetValue method to retrieve the current value, which uses the TypedReference.InternalToObject function.
// The current value is immediatly unboxed as ReportStatus to be assigned to the loop variable, value.
// The value variable is then boxed again so that it can be passed to Console.WriteLine(System.Object).
// Summary: 1 box operation, 1 unbox operation, 1 usage of TypedReference
Console.WriteLine("foreach (ReportStatus value in values)");
foreach (ReportStatus value in values)
{
Console.WriteLine(value);
}
// Case 3: iterating over values as System.Array, loop variable is of type System.Int32.
// The foreach loop uses an IEnumerator obtained from System.Array.
// The IEnumerator's Current property uses the System.Array.GetValue method to retrieve the current value, which uses the TypedReference.InternalToObject function.
// The current value is immediatly unboxed as System.Int32 to be assigned to the loop variable, value.
// The value variable is passed to Console.WriteLine(System.Int32).
// Summary: 0 box operations, 1 unbox operation, 1 usage of TypedReference
Console.WriteLine("foreach (int value in values)");
foreach (int value in values)
{
Console.WriteLine(value);
}
// Case 4: iterating over values as ReportStatus[], loop variable is of type System.Object.
// The foreach loop is compiled as a simple for loop; it does not use an enumerator.
// On each iteration, the current element of the array is assigned to the loop variable, value.
// At that time, the current ReportStatus value is boxed as System.Object.
// The value variable is passed to Console.WriteLine(System.Object).
// Summary: 1 box operation, 0 unbox operations
Console.WriteLine("foreach (object value in (ReportStatus[])values)");
foreach (object value in (ReportStatus[])values)
{
Console.WriteLine(value);
}
// Case 5: iterating over values as ReportStatus[], loop variable is of type ReportStatus.
// The foreach loop is compiled as a simple for loop; it does not use an enumerator.
// On each iteration, the current element of the array is assigned to the loop variable, value.
// The value variable is then boxed so that it can be passed to Console.WriteLine(System.Object).
// Summary: 1 box operation, 0 unbox operations
Console.WriteLine("foreach (ReportStatus value in (ReportStatus[])values)");
foreach (ReportStatus value in (ReportStatus[])values)
{
Console.WriteLine(value);
}
// Case 6: iterating over values as ReportStatus[], loop variable is of type System.Int32.
// The foreach loop is compiled as a simple for loop; it does not use an enumerator.
// On each iteration, the current element of the array is assigned to the loop variable, value.
// The value variable is passed to Console.WriteLine(System.Int32).
// Summary: 0 box operations, 0 unbox operations
Console.WriteLine("foreach (int value in (ReportStatus[])values)");
foreach (int value in (ReportStatus[])values)
{
Console.WriteLine(value);
}
// Case 7: The compiler evaluates var to System.Object. This is equivalent to case #1.
Console.WriteLine("foreach (var value in values)");
foreach (var value in values)
{
Console.WriteLine(value);
}
// Case 8: The compiler evaluates var to ReportStatus. This is equivalent to case #5.
Console.WriteLine("foreach (var value in (ReportStatus[])values)");
foreach (var value in (ReportStatus[])values)
{
Console.WriteLine(value);
}
}
}
- उपरोक्त नमूने में मेरी टिप्पणियां अपडेट की गईं; डबल-चेकिंग पर मैंने देखा कि System.Array.GetValue विधि वास्तव में सरणी के तत्व को निकालने और इसे System.Object के रूप में वापस करने के लिए टाइपेड रेफरेंस क्लास का उपयोग करती है। मैंने मूल रूप से लिखा था कि एक मुक्केबाजी अभियान वहां हो रहा था, लेकिन यह तकनीकी रूप से मामला नहीं है। मुझे यकीन नहीं है कि बॉक्स ऑपरेशन की तुलना किस प्रकार टाइप की गई है। TypedReference.InternalToObject; मुझे लगता है कि यह सीएलआर कार्यान्वयन पर निर्भर करता है। भले ही, मेरा मानना है कि विवरण अब कम या ज्यादा सही हैं।
विजुअल स्टूडियो का कहना है कि जब आप 'var' पर होवर करते हैं तो यह प्रकार क्या होता है? – ChrisF
कोई विचार नहीं, लेकिन बहुत उपयोगी लगता है! – sbenderli
@ एसबेन्द्रली - मैंने अभी जांच की है और यह 'System.Object' है, जो शायद अंतर को समझाने का कोई तरीका है। – ChrisF