यह एक संभव अंतर का एक उदाहरण है:
class SimpleClass
{
static readonly long A = DateTime.Now.Ticks;
static readonly long B = DateTime.Now.Ticks;
static SimpleClass()
{
}
}
A
और B
, एक ही मूल्य होने की गारंटी नहीं कर रहे हैं, हालांकि, अगर आप निर्माता में लिखने के लिए गए थे, आप इसे की गारंटी दे सकें:
class SimpleClass
{
static readonly long A;
static readonly long B;
static SimpleClass()
{
var ticks = DateTime.Now.Ticks;
A = ticks;
B = ticks;
}
}
इसके अलावा, स्थिर सदस्यों के तत्काल के लिए आदेश जारी करता है।एक वर्ग घोषणा की
स्थिर क्षेत्र चर initializers कि शाब्दिक क्रम में क्रियान्वित कर रहे हैं कार्य की एक दृश्य है जिसमें वे में प्रदर्शित करने के अनुरूप:
स्थिर क्षेत्र आरंभीकरण के बारे में ECMA-334 के अनुसार
कक्षा घोषणा। यदि स्थिर कन्स्ट्रक्टर (§17.11) कक्षा में मौजूद है, तो निष्पादन स्थिर क्षेत्र प्रारंभकर्ता स्थैतिक कन्स्ट्रक्टर निष्पादित करने से ठीक पहले होता है।
class SimpleClass
{
public static readonly long A = IdentityHelper.GetNext();
public static readonly long B = IdentityHelper.GetNext();
static SimpleClass()
{
}
}
public static class IdentityHelper
{
public static int previousIdentity = 0;
public static int GetNext()
{
return ++previousIdentity;
}
}
: अन्यथा, स्थिर क्षेत्र initializers उस वर्ग के एक स्थिर क्षेत्र
तो का पहला प्रयोग करने से पहले एक कार्यान्वयन पर निर्भर समय पर क्रियान्वित कर रहे हैं, हम कुछ इस तरह लिख सकते हैं यहां, A
B
से पहले असाइन किए जाने की गारंटी है। इस उदाहरण में, A
1
होगा, और B
2
होगा। हम गारंटी दे सकते हैं कि A
< B
(माना जाता है कि पहचान अधिक नहीं है और थ्रेडिंग के साथ कोई समस्या नहीं है)। अब, अगर हम फिर से आदेश क्षेत्रों:
public static readonly long B = IdentityHelper.GetNext();
public static readonly long A = IdentityHelper.GetNext();
कार्यक्षमता बदल जाता है। इस प्रकार, हमने एक दुष्प्रभाव बनाया है जो फ़ील्ड परिभाषाओं को फिर से व्यवस्थित करके तुरंत स्पष्ट नहीं होता है।
एक अधिक होने की संभावना परिदृश्य है, हम ऐसा करना चाहते हो सकता है:
class SimpleClass
{
public static readonly long A = IdentityHelper.GetExpensiveResult().A;
public static readonly long B = IdentityHelper.GetExpensiveResult().B;
static SimpleClass()
{
}
}
यहाँ, हम क्षेत्रों के बीच GetExpensiveResult()
साझा नहीं कर सकते।
यह स्थिर विशिष्ट प्रश्न नहीं है, प्रश्न गैर स्थैतिक प्रारंभिकरण के लिए भी मान्य है। –
संभावित डुप्लिकेट [कन्स्ट्रक्टर में या घोषणा में कक्षा फ़ील्ड शुरू करें?] (Http://stackoverflow.com/questions/24551/initialize-class-fields-in-constructor-or-at-declaration) –
@CyrilGandon यह नहीं है एक डुप्ली - यह स्थिर रचनाकारों के बारे में है जो पैरामीटर स्वीकार नहीं करते हैं। डुप्लिक टैग को हटाने पर विचार करें। –