स्थैतिक आसानी से बनाम कास्ट


1386

मैंने आसपास constऔर static readonlyखेतों के बारे में पढ़ा है । हमारे पास कुछ कक्षाएं हैं जिनमें केवल निरंतर मूल्य हैं। हमारे सिस्टम में विभिन्न चीजों के लिए उपयोग किया जाता है। इसलिए मैं सोच रहा हूं कि क्या मेरा अवलोकन सही है:

क्या इस तरह के निरंतर मूल्यों को हमेशा static readonlyसार्वजनिक होने वाली हर चीज के लिए होना चाहिए ? और केवल constआंतरिक / संरक्षित / निजी मूल्यों के लिए उपयोग करें ?

आप क्या सलाह देते हैं? क्या मुझे शायद static readonlyखेतों का उपयोग नहीं करना चाहिए , बल्कि शायद गुणों का उपयोग करना चाहिए ?


5
यहाँ एक बहुत ही दिलचस्प एकल मामला है जो मैंने अभी-अभी इसके पक्ष में पाया है static readonly: एक कास्ट का उपयोग करने का प्रयास करें, IEnumeratorजो एक अप्राप्य को ट्रिगर करेगाyield और आपको एक खतरनाक "आंतरिक संकलक त्रुटि" मिलेगी । मैंने यूनिटी 3 डी के बाहर कोड का परीक्षण नहीं किया, लेकिन मुझे विश्वास है कि यह मोनो या .NET बग है । यह एक c # मुद्दा है।
cregox

2
डुप्लिकेट के संभावित अंतर के बीच अंतर क्या है?
नवाफल

8
एक और अंतर यह है कि आप एक स्विच में एक
कास्ट

7
static readonlyइस उद्देश्य के लिए switch-caseकथन के रूप में उपयोग नहीं किया जा सकता है case, constइस उद्देश्य के लिए आवश्यक है।
मुस्तफ़िज़ रहमान

3
static readonlyविशेषता पैरामीटर के रूप में भी उपयोग नहीं किया जा सकता है,
Dread Boy

जवाबों:


940

public static readonlyफ़ील्ड थोड़े असामान्य हैं; public staticगुण (केवल a के साथ get) अधिक सामान्य होंगे (शायद किसी private static readonlyफ़ील्ड द्वारा समर्थित )।

constमूल्यों को सीधे कॉल-साइट में जला दिया जाता है; यह दोहरी धार है:

  • यदि मान रनटाइम पर लाया जाता है, तो शायद यह बेकार है
  • यदि आप किसी कास्ट का मान बदलते हैं, तो आपको सभी क्लाइंट्स को फिर से बनाने की जरूरत है
  • लेकिन यह तेज हो सकता है, क्योंकि यह एक विधि कॉल से बचा जाता है ...
  • ... जो कि कभी-कभी JIT द्वारा वैसे भी इनलेट हो सकता है

यदि मान कभी नहीं बदलेगा, तो Zeroकास्ट ठीक है - आदि उचित कॉस्ट बनाते हैं; पी इसके अलावा, staticगुण अधिक सामान्य हैं।


13
एक क्षेत्र में एक संपत्ति क्यों? यदि यह एक अपरिवर्तनीय वर्ग है, तो मुझे कोई अंतर नहीं दिखता है।
माइकल हेडगेथ

73
@ मिचेल - हमेशा की तरह ही कारण; यह कार्यान्वयन को छुपाता है। आप पा सकते हैं (बाद में) आपको आलसी लोड, कॉन्फ़िगरेशन आधारित, एक मुखौटा, या जो कुछ भी होना चाहिए। वास्तविकता में, या तो अक्सर ठीक होगा ...
मार्क ग्रेवेल

42
परिभाषा के अनुसार, एक कॉन्फिडेंस एक कॉन्फिग फाइल से मान नहीं खींच रहा है; इसे संकलन-समय पर शाब्दिक रूप में जलाया जाता है। जिस तरह से आप रनटाइम पर एक निरंतर उपयोग कर सकते हैं वह खेतों के प्रतिबिंब के माध्यम से होता है। किसी अन्य समय जब आप इसका उपयोग करने का प्रयास करते हैं, तो संकलक ने पहले ही शाब्दिक उपयोग के लिए आपके निरंतर उपयोग को प्रतिस्थापित कर दिया था ; यदि आपके कोड में एक विधि 6 स्थिरांक का उपयोग करती है, और आप इसे IL के रूप में निरीक्षण करते हैं, तो किसी भी निरंतर लुकअप का कोई उल्लेख नहीं होगा; शाब्दिक मूल्यों को केवल इन-सीटू
मार्क ग्रेवेल

37
@MarcGravell - चेतावनी: readonlyफ़ील्ड्स का उपयोग स्विच / केस स्टेटमेंट में नहीं किया जा सकता है, इसके बजाय आपको उनकी आवश्यकता है const
लुसियानो

7
@didibus किसी फ़ील्ड को किसी संपत्ति में बदलना, वास्तव में, एपीआई को तोड़ता है। C # में एक फ़ील्ड एक चर की तरह प्रभावी रूप से कार्य करता है, जबकि C # में एक गुण एक गेटर विधि और / या एक सेटर विधि लिखने के लिए एक सिंटैक्स सहायक है। अन्य विधानसभाओं के शामिल होने पर यह अंतर महत्वपूर्ण है। यदि आप किसी फ़ील्ड को किसी प्रॉपर्टी में बदलते हैं, और अन्य असेंबली इस फ़ील्ड पर निर्भर करती हैं, तो उन अन्य असेंबली को फिर से कनेक्ट करना होगा।
स्टीफन बूहेर

237

static readonlyअगर उपभोक्ता अलग विधानसभा में है तो मैं इसका उपयोग करूंगा । दो अलग-अलग विधानसभाओं में कंज्यूमर का होना constऔर अपने आप को पैर में गोली मारना एक अच्छा तरीका है ।


5
इसलिए मुझे लगता है कि जैसा कि कुछ ने उल्लेख किया है या करने के लिए कहा है, यह केवल उन मूल्यों के लिए कास्ट का उपयोग करने के लिए बुद्धिमान हो सकता है जो वास्तव में अच्छी तरह से ज्ञात स्थिरांक हैं यदि उन्हें सार्वजनिक किया जाता है अन्यथा उन्हें आंतरिक, संरक्षित, या निजी एक्सेस स्कोप के लिए आरक्षित किया जाना चाहिए।
जिपरसन

1
@Dio इसका कारण अभी भी मौजूद है क्योंकि यह प्रति से एक मुद्दा नहीं है - इसके बारे में पता होना कुछ है, लेकिन विधानसभा सीमाओं के पार इनलाइन की क्षमता प्रदर्शन के लिए एक अच्छी बात है। यह वास्तव में केवल समझने की बात है कि "निरंतर" का अर्थ है "यह कभी नहीं बदलेगा"।
माइकल Stum

1
@MichaelStum ठीक है मुझे इसे "एक मुद्दा" नहीं कहना चाहिए। मेरे काम की लाइन में, मेरे पास कांस्टेबल हैं और इसे असेंबलियों में साझा करते हैं लेकिन मैं प्रत्येक तैनाती या कोड शिपमेंट के लिए पुनर्मिलन करता हूं। फिर भी, यह तथ्य निश्चित रूप से ध्यान देने योग्य है।
डियो फुंग

1
तो, सामान्य तौर पर, internal constया public static readonlyवांछित दृश्यता पर निर्भर करता है।
इरिडीन

2
@Iiridayn हाँ, यह देखने का एक बुरा तरीका नहीं है। विचार करने के लिए कुछ किनारे-मामले हैं (उदाहरण, यदि प्रतिबिंब का उपयोग करते हैं, या यदि किसी विशेषता पर मान आवश्यक है), और इसके लिए मान्य उपयोग हैं public const(उदाहरण के लिए, मानक का कुछ भी हिस्सा। कभी भी मैं XML के साथ काम करता हूं, तो एक है नेमस्पेस की एक गुच्छा के साथ फ़ाइल public const string।) लेकिन सामान्य रूप से, public constकेवल निहितार्थों पर ठीक से विचार करने के बाद ही उपयोग किया जाना चाहिए।
माइकल स्टम

199

कुछ और अधिक प्रासंगिक बातों पर ध्यान दिया जाना चाहिए:

const int a

  • आरंभिक होना चाहिए।
  • संकलन समय पर होना चाहिए ।

आसानी से int a

  • बिना आरंभ किए, डिफ़ॉल्ट मान का उपयोग कर सकते हैं।
  • आरंभीकरण रन टाइम पर किया जा सकता है (संपादित करें: केवल कंस्ट्रक्टर के भीतर)।

39
ctorएकमात्र के भीतर ।
अमित कुमार घोष

1
केवल कंस्ट्रक्टर के भीतर ही नहीं बल्कि घोषणा में भी ( docs.microsoft.com/en-us/dotnet/csharp/language-reference/… )।
डेक्रिस्टो

176

यह अन्य उत्तरों के लिए सिर्फ एक पूरक है। मैं उन्हें (अब चार साल बाद) नहीं दोहराऊंगा।

ऐसी परिस्थितियां हैं जहां एक constऔर एक गैर-कॉन्स्टेंट में अलग-अलग शब्दार्थ हैं। उदाहरण के लिए:

const int y = 42;

static void Main()
{
  short x = 42;
  Console.WriteLine(x.Equals(y));
}

प्रिंट करता है True, जबकि:

static readonly int y = 42;

static void Main()
{
  short x = 42;
  Console.WriteLine(x.Equals(y));
}

लिखता है False

कारण यह है कि विधि x.Equalsमें दो अधिभार हैं, एक जो एक short( System.Int16) में लेता है और एक जो एक object( System.Object) लेता है । अब सवाल यह है कि क्या एक या दोनों मेरे yतर्क के साथ लागू होते हैं ।

जब yएक संकलन समय निरंतर (शाब्दिक) है, constके मामले में, यह महत्वपूर्ण हो जाता है कि वहाँ एक अंतर्निहित रूपांतरण मौजूद है से int करने के लिए short प्रदान की है कि intएक निरंतर है, और प्रदान की है कि सी # संकलक पुष्टि करता है कि अपने मूल्य एक की रेंज में है short( जो 42है)। C # भाषा विशिष्टता में निहित निरंतर अभिव्यक्ति रूपांतरण देखें । इसलिए दोनों ओवरलोड पर विचार करना होगा। अधिभार Equals(short)को प्राथमिकता दी जाती है (कोई भी shortएक है object, लेकिन सभी नहीं objectहैं short)। तो yपरिवर्तित किया जाता है short, और उस अधिभार का उपयोग किया जाता है। फिर Equalsदो shortसमान मूल्य की तुलना करता है , और जो देता है true

जब yएक स्थिर नहीं है, कोई अंतर्निहित से रूपांतरण intकरने के लिए shortमौजूद है। ऐसा इसलिए है क्योंकि आम तौर पर एक intमें फिट करने के लिए बहुत बड़ा हो सकता है short। (एक स्पष्ट रूपांतरण मौजूद है, लेकिन मैंने यह नहीं कहा Equals((short)y), इसलिए यह प्रासंगिक नहीं है।) हम देखते हैं कि केवल एक अधिभार लागू होता है, Equals(object)एक। तो yबॉक्सिंग की जाती है object। फिर Equalsएक तुलना करने के लिए जा रहा है System.Int16एक के लिए System.Int32, और के बाद से रन-टाइम प्रकार भी सहमत नहीं हैं, कि निकलेगा false

हम यह निष्कर्ष निकालते हैं कि कुछ (दुर्लभ) मामलों में, एक constप्रकार के सदस्य को static readonlyफ़ील्ड में बदलना (या दूसरा तरीका, जब यह संभव हो) प्रोग्राम के व्यवहार को बदल सकता है।


17
स्वीकृत उत्तर के लिए एक अच्छा जोड़। मैं जोड़ना चाहूंगा कि डेटा प्रकारों और अन्य समान दिशा-निर्देशों (जैसे पकड़ने की कोशिश आदि) के उचित रूपांतरण को अनुभवी प्रोग्रामरों का एक प्रधान होना चाहिए और संकलक के पास नहीं छोड़ा जाना चाहिए। फिर भी, मैंने यहां से कुछ नया सीखा। धन्यवाद।
18

वाह, मैं लंबे समय से C # में प्रोग्रामिंग कर रहा हूं और मैंने कभी अनुमान नहीं लगाया होगा कि शॉर्ट की सीमा के भीतर एक कॉन्स्टेंट इंट को संक्षेप में शॉर्ट में बदला जा सकता है। मुझे कहना होगा कि यह अजीब है। मुझे C # बहुत पसंद है, लेकिन ये अजीब असंगतताएं हैं जो बहुत अधिक मूल्य नहीं जोड़ती हैं, लेकिन लगातार विचार करने के लिए बहुत सारी आवश्यक मस्तिष्क शक्ति को जोड़ना कष्टप्रद हो सकता है, खासकर शुरुआती लोगों के लिए।
माइक मैरीनोस्की

@ मायकेमरीनोव्स्की काफी सच है। लेकिन मुझे लगता है कि उन्होंने बयान को short x = 42;कानूनी बनाने के लिए वह नियम (अन्य कारणों के अलावा) बनाया । क्योंकि वहां आपके पास intशाब्दिक अर्थात् शाब्दिक रूप है 42, जिसे संक्षेप में बदल दिया गया है short x। लेकिन फिर, उन्होंने इसे केवल संख्यात्मक शाब्दिकों तक सीमित कर दिया है; हालाँकि, उन्होंने ऐसी चीज़ों को अनुमति देने का विकल्प चुना, short x = y;जहाँ yपरिभाषित किया गया है const int y = 42;, और फिर उन्होंने इसे समाप्त कर दिया।
जेपी स्टिग नील्सन

87

ध्यान देने योग्य बात यह है कि कब्ज आदिम / मूल्य प्रकार (अपवाद होने के कारण) तक ही सीमित है


30
वास्तव में constअन्य प्रकारों के लिए भी इस्तेमाल किया जा सकता है, सिवाय इसके कि इसे शून्य करने के लिए आरंभीकृत किया जाना है, जो इसे बेकार बनाता है :)
nawfal

6
अपवाद के रूप में System.Exception? :)
मेमट ऑलसेन

4
दरअसल @nawfal, केवल मूल्य प्रकार जिसके लिए constइस्तेमाल किया जा सकता है, sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, bool, के साथ साथ किसी भी enumप्रकार के। constकी तरह, अन्य मूल्य प्रकार के लिए इस्तेमाल नहीं किया जा सकता है DateTimeया TimeSpanया BigInteger। यह भी IntPtrसंरचना के लिए इस्तेमाल नहीं किया जा सकता है (कुछ द्वारा "आदिम" प्रकार माना जाता है; शब्द आदिम प्रकार सी # में भ्रामक है)। Used constसभी संदर्भ प्रकारों के लिए इस्तेमाल किया जा सकता है । यदि प्रकार है string, तो किसी भी स्ट्रिंग मान को निर्दिष्ट किया जा सकता है। अन्यथा, मान होना चाहिए null
जेपी स्टिग नीलसन

@JeppeStigNielsen - मैंने हाल ही में इस बारे में सर्विस के साथ एक तर्क दिया था - उन्होंने बताया कि आप कुछ भी (मूल्य और संदर्भ प्रकार) constका उपयोग कर सकते हैं default। के लिए structप्रकार, यह अपने सभी सदस्यों के मूलभूत मूल्यों के लिए सेट के साथ एक उदाहरण है।
वाई हा ली

28

स्टेटिक रीड ओनली : staticरनटाइम में कंस्ट्रक्टर के जरिए वैल्यू बदली जा सकती है। लेकिन मेंबर फंक्शन के जरिए नहीं।

लगातार : डिफ़ॉल्ट रूप से static। मूल्य कहीं से भी नहीं बदला जा सकता (Ctor, Function, runtime etc no-जहाँ)।

रीड ओनली : रनटाइम के दौरान कंस्ट्रक्टर के जरिए वैल्यू बदली जा सकती है। लेकिन मेंबर फंक्शन के जरिए नहीं।

आप मेरे रेपो: C # प्रॉपर्टी के प्रकार देख सकते हैं


1
बुरी खबर ... टूटी कड़ी!
फेर आर


अच्छे स्निपेट्स स्याम --াই :)
मुहम्मद आशिक़ुज्जमान

25

readonlyकीवर्ड से अलग है constकीवर्ड। एक constक्षेत्र को केवल क्षेत्र की घोषणा पर आरंभ किया जा सकता है। एक readonlyक्षेत्र को घोषणा में या एक निर्माण में आरंभीकृत किया जा सकता है। इसलिए, readonlyखेतों में इस्तेमाल किए गए कंस्ट्रक्टर के आधार पर अलग-अलग मूल्य हो सकते हैं। इसके अलावा, जबकि एक constक्षेत्र एक संकलन-समय स्थिर है, इस readonlyक्षेत्र का उपयोग रनटाइम स्थिरांक के लिए किया जा सकता है

लघु और स्पष्ट MSDN संदर्भ यहाँ


16

constऔर readonlyसमान हैं, लेकिन वे समान नहीं हैं।

एक constक्षेत्र एक संकलन-समय स्थिर है, जिसका अर्थ है कि संकलन-समय पर उस मूल्य की गणना की जा सकती है। एक readonlyफ़ील्ड अतिरिक्त परिदृश्यों को सक्षम करता है जिसमें प्रकार के निर्माण के दौरान कुछ कोड चलना चाहिए। निर्माण के बाद, एक readonlyफ़ील्ड नहीं बदला जा सकता है।

उदाहरण के लिए, constसदस्यों का उपयोग सदस्यों को परिभाषित करने के लिए किया जा सकता है:

struct Test
{
    public const double Pi = 3.14;
    public const int Zero = 0;
}

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

public class Color
{
    public static Color Black = new Color(0, 0, 0);
    public static Color White = new Color(255, 255, 255);
    public static Color Red   = new Color(255, 0, 0);
    public static Color Green = new Color(0, 255, 0);
    public static Color Blue  = new Color(0, 0, 255);
    private byte red, green, blue;

    public Color(byte r, byte g, byte b) => (red, green, blue) = (r, g, b);
}

लेकिन फिर इसके साथ मैकिंग से कलर के क्लाइंट को रखने के लिए कुछ भी नहीं है, शायद ब्लैक एंड व्हाइट मूल्यों को स्वैप करके। कहने की जरूरत नहीं है, इससे रंग वर्ग के अन्य ग्राहकों के लिए अड़चन पैदा होगी। "आसानी से" सुविधा इस परिदृश्य को संबोधित करती है।

केवल readonlyघोषणाओं में कीवर्ड को शुरू करने से , हम क्लाइंट कोड को आसपास से रोकने से रोकते हुए लचीली आरंभीकरण को संरक्षित करते हैं।

public class Color
{
    public static readonly Color Black = new Color(0, 0, 0);
    public static readonly Color White = new Color(255, 255, 255);
    public static readonly Color Red   = new Color(255, 0, 0);
    public static readonly Color Green = new Color(0, 255, 0);
    public static readonly Color Blue  = new Color(0, 0, 255);
    private byte red, green, blue;

    public Color(byte r, byte g, byte b) => (red, green, blue) = (r, g, b);
}

यह ध्यान रखना दिलचस्प है कि कॉन्स्टेबल सदस्य हमेशा स्थिर होते हैं, जबकि एक नियमित सदस्य एक नियमित क्षेत्र की तरह या तो स्थिर हो सकता है या नहीं।

इन दोनों उद्देश्यों के लिए एक ही कीवर्ड का उपयोग करना संभव है, लेकिन इससे या तो संस्करण संबंधी समस्याएं या प्रदर्शन समस्याएं होती हैं। उस क्षण के लिए मान लें कि हमने इस (कॉन्स्टेबल) और डेवलपर के लिए एक एकल कीवर्ड का उपयोग किया है:

public class A
{
    public static const C = 0;
}

और एक अलग डेवलपर ने कोड लिखा है जो A पर निर्भर है:

public class B
{
    static void Main() => Console.WriteLine(A.C);
}

अब, उत्पन्न होने वाला कोड इस बात पर भरोसा कर सकता है कि एसी एक संकलन-समय स्थिर है? यानी, क्या AC का उपयोग केवल मान 0 से बदला जा सकता है? यदि आप इसके लिए "हाँ" कहते हैं, तो इसका मतलब है कि A का डेवलपर उस तरह से बदलाव नहीं कर सकता है जैसे AC को इनिशियलाइज़ किया जाता है - यह A के डेवलपर के हाथों को बिना अनुमति के रखता है।

यदि आप इस प्रश्न के लिए "नहीं" कहते हैं तो एक महत्वपूर्ण अनुकूलन छूट जाता है। शायद A का लेखक सकारात्मक है कि AC हमेशा शून्य रहेगा। दोनों कांस्टेबल का उपयोग और आसानी से ए के डेवलपर को इरादा निर्दिष्ट करने की अनुमति देता है। यह बेहतर संस्करण व्यवहार और बेहतर प्रदर्शन के लिए बनाता है।


12

मेरी प्राथमिकता उपयोग करने के लिए है स्थिरांक जब भी मैं कर सकते हैं, जो जैसा कि ऊपर उल्लेख शाब्दिक अभिव्यक्ति या कुछ है कि मूल्यांकन की आवश्यकता नहीं है तक सीमित है।

अगर मैं उस सीमा के खिलाफ मारा गया, तो मैं स्थिर रूप से एक कैविटी के साथ आसानी से वापस आ गया । मैं आम तौर पर एक सार्वजनिक स्थैतिक संपत्ति का उपयोग करता हूं, जिसमें एक गटर और एक स्थायी निजी स्थैतिक क्षेत्र में मार्क उल्लेख होता है


7

Const: कॉन्स्ट "स्थिर" के अलावा कुछ भी नहीं है, जिसका एक वैरिएबल स्थिर है लेकिन संकलन समय पर है। और इसके लिए एक मूल्य निर्दिष्ट करना अनिवार्य है। डिफ़ॉल्ट रूप से एक कॉन्स्टेबल स्थिर होता है और हम पूरे प्रोग्राम में एक कॉन्स्टेबल वैरिएबल का मान नहीं बदल सकते हैं।

स्टेटिक रीडऑनली: स्टैटिक रीडॉनली टाइप वैरिएबल की वैल्यू रनटाइम पर या कंपाइल टाइम पर असाइन की जा सकती है और रनटाइम में बदली जा सकती है। लेकिन इस वेरिएबल की वैल्यू को केवल स्टैटिक कंस्ट्रक्टर में बदला जा सकता है। और आगे नहीं बदला जा सकता है। यह केवल एक बार रनटाइम में बदल सकता है

संदर्भ: सी-शार्पनर


6

अन्य असेंबली के लिए एक बाद के संस्करण में बदल सकता है कि एक मूल्य को उजागर करते समय एक स्थिर पठनीय क्षेत्र लाभप्रद है।

उदाहरण के लिए, मान लीजिए विधानसभा X इस प्रकार एक स्थिरांक को उजागर करती है:

public const decimal ProgramVersion = 2.3;

यदि विधानसभा Yसंदर्भ Xऔर इस स्थिरांक का उपयोग करता है, तो मान 2.3 को विधानसभा में बेक किया जाएगाY तो संकलित । इसका मतलब यह है कि अगर Xबाद में 2.4 पर स्थिर सेट के साथ recompiled है, Yतब Yभी 2.3 के पुराने मूल्य का उपयोग तब तक किया जाएगा जब तक कि recompiled नहीं। एक स्थैतिक आसानी से क्षेत्र इस समस्या से बचा जाता है।

इसे देखने का एक और तरीका यह है कि भविष्य में परिवर्तित होने वाला कोई भी मूल्य परिभाषा के अनुसार स्थिर नहीं है, और इसलिए इसे एक के रूप में नहीं दर्शाया जाना चाहिए।


3

स्थिरांक:

  1. मूल्य घोषणा पर दिया जाना चाहिए
  2. लगातार समय संकलित करें

सिफ़ पढ़िये:

  1. मूल्य घोषणाओं पर या निर्माण के दौरान रनटाइम के दौरान दिया जा सकता है। मूल्य इस्तेमाल किए गए निर्माणकर्ता पर निर्भर हो सकता है।
  2. निरंतर समय चलाएं

3

Const : कॉन्स्टेबल वैरिएबल वैल्यूज़ को डिक्लेरेशन के साथ परिभाषित करना होता है और उसके बाद यह नहीं बदलेगा। const स्पष्ट रूप से स्थिर हैं इसलिए बिना वर्ग उदाहरण बनाए हम उन तक पहुंच सकते हैं। यह संकलन समय पर एक मूल्य है

ReadOnly : पठनीय चर मान जिन्हें हम रनटाइम पर कंस्ट्रक्टर के उपयोग के साथ-साथ घोषित करते समय परिभाषित कर सकते हैं। वर्ग उदाहरण के बिना आसानी से चर पहुंच नहीं सकते।

स्थैतिक रूप से पठनीय : स्टैटिक रेडोनली वैरिएबल वैल्यूज जिसे हम केवल स्टैटिक कंस्ट्रक्टर के माध्यम से ही घोषित कर सकते हैं, लेकिन किसी अन्य कंस्ट्रक्टर के साथ नहीं। ऐसे वैरिएबल भी जिन्हें हम क्लास इंस्टेंस बनाए बिना एक्सेस कर सकते हैं।

अगर हम अलग-अलग विधानसभाओं में चर का उपभोग करने के लिए स्थिर हो तो बेहतर विकल्प होगा। कृपया नीचे दिए गए लिंक में पूर्ण विवरण देखें

https://www.stum.de/2009/01/14/const-strings-a-very-convenient-way-to-shoot-yourself-in-the-foot/


क्या आप मुझे बता सकते हैं कि आपने उत्तर को क्यों रद्द कर दिया है, इसलिए मैं खुद को यहां भी अपडेट कर सकता हूं।
15:

DV नहीं, लेकिन यह हो सकता है कि यह उत्तर वास्तव में यहां पहले से मौजूद व्यापक उत्तर के लिए कुछ भी नहीं जोड़ता है।
मार्क एल।

वास्तव में, 90 के दशक के उत्तरार्ध में जावा में याद करें कि हमारे पास एक प्रोजेक्ट था जिसमें कई लोग अलग-अलग जार का निर्माण कर रहे थे, जिसमें क्लास की फाइलों के साथ इंटरऑपरेटेड (एक दूसरे को संदर्भित) और पब्लिक कास्ट स्ट्रिंग में
दिक्कत

2

C # .net में स्थैतिक और स्थैतिक आसानी से खेतों के बीच एक मामूली अंतर है

कॉन्स का संकलन समय पर मूल्य के साथ किया जाना चाहिए।

कॉन्स्ट डिफ़ॉल्ट रूप से स्थिर है और इसे निरंतर मूल्य के साथ आरंभ करने की आवश्यकता है, जिसे बाद में संशोधित नहीं किया जा सकता है। इसका उपयोग सभी डेटाटिप्स के साथ नहीं किया जा सकता है। पूर्व तिथि के लिए। इसका उपयोग DateTime डेटाटाइप के साथ नहीं किया जा सकता है।

public const DateTime dt = DateTime.Today;  //throws compilation error
public const string Name = string.Empty;    //throws compilation error
public static readonly string Name = string.Empty; //No error, legal

आसानी से स्थिर के रूप में घोषित किया जा सकता है, लेकिन आवश्यक नहीं है। घोषणा के समय आरंभ करने की आवश्यकता नहीं है। एक बार कंस्ट्रक्टर का उपयोग करके इसका मान सौंपा या बदला जा सकता है। इसलिए एक बार रीडऑनली फ़ील्ड के मान को बदलने की संभावना है (इससे कोई फर्क नहीं पड़ता, अगर यह स्थिर है या नहीं), जो कि कांस्टेबल के साथ संभव नहीं है।


0

लगातार नाम का अर्थ है, वे क्षेत्र जो बदलते नहीं हैं और आमतौर पर कोड में संकलित समय पर सांख्यिकीय रूप से परिभाषित होते हैं।

केवल चर ही वे क्षेत्र हैं जो विशिष्ट परिस्थितियों में बदल सकते हैं।

जब आप पहली बार उन्हें एक स्थिर की तरह घोषित करते हैं, तो उन्हें या तो प्रारंभिक किया जा सकता है, लेकिन आमतौर पर वे निर्माणकर्ता के अंदर ऑब्जेक्ट निर्माण के दौरान आरंभीकृत होते हैं।

प्रारंभिक स्थिति में, ऊपर उल्लिखित शर्तों के बाद उन्हें नहीं बदला जा सकता है।

स्टेटिक रीड-ओनली मुझे लगता है कि मेरे लिए एक गरीब पसंद है, अगर यह स्थिर है और यह कभी नहीं बदलता है, तो बस इसे सार्वजनिक कॉन्स्ट का उपयोग करें, अगर यह बदल सकता है तो यह एक स्थिर नहीं है और फिर, अपनी आवश्यकताओं के आधार पर, आप या तो पढ़ सकते हैं। -एक या सिर्फ एक नियमित चर।

इसके अलावा, एक और महत्वपूर्ण अंतर यह है कि एक स्थिर वर्ग का है, जबकि केवल पढ़ने वाला चर उदाहरण के अंतर्गत आता है!


0

एक कांस्टेबल (संकलन-समय पर निर्धारित किया जा रहा है) का उपयोग उन मामलों में किया जा सकता है, जहां स्विच स्टेटमेंट, या एक्टर्स एक्टर्स की तरह एक स्थिर स्थैतिक नहीं हो सकता है। इसका कारण यह है कि आसानी से खेतों को केवल रन-टाइम पर हल किया जाता है, और कुछ कोड निर्माणों को संकलन समय आश्वासन की आवश्यकता होती है। एक रचना में एक स्थिर स्थैतिक की गणना की जा सकती है, जो अक्सर एक आवश्यक और उपयोगी चीज होती है। अंतर कार्यात्मक है, जैसा कि मेरी राय में उनका उपयोग होना चाहिए।

स्मृति आवंटन के संदर्भ में, कम से कम स्ट्रिंग्स (एक संदर्भ प्रकार होने के नाते) के साथ, इसमें कोई अंतर नहीं है कि दोनों को नजरबंद किया गया है और एक इंटर्न उदाहरण का संदर्भ देगा।

व्यक्तिगत रूप से, मेरा डिफ़ॉल्ट आसानी से स्थिर है, क्योंकि यह मेरे लिए अधिक अर्थपूर्ण और तार्किक समझ में आता है, खासकर जब से संकलन समय पर अधिकांश मूल्यों की आवश्यकता नहीं होती है। और, वैसे, सार्वजनिक रूप से पढ़े जाने वाले स्टैटिक्स असामान्य या असामान्य नहीं हैं क्योंकि चिह्नित उत्तर बताता है: उदाहरण के लिए, System.String.Emptyएक है।


0

कांस्टेबल और स्थिर घोषित करने के बीच एक और अंतर स्मृति आवंटन में है।

एक स्थिर फ़ील्ड उस प्रकार के उदाहरण के बजाय किसी ऑब्जेक्ट के प्रकार के अंतर्गत आता है । नतीजतन, एक बार वर्ग को पहली बार संदर्भित करने के बाद, स्थिर क्षेत्र शेष समय के लिए मेमोरी में "लाइव" होगा, और स्थिर क्षेत्र का एक ही उदाहरण प्रकार के सभी उदाहरणों द्वारा संदर्भित किया जाएगा।

दूसरी ओर, एक कास्ट फ़ील्ड "प्रकार के एक उदाहरण के अंतर्गत आता है।

यदि आपके लिए डील्लोकेशन की स्मृति अधिक महत्वपूर्ण है, तो कास्ट का उपयोग करना पसंद करें । यदि गति है, तो स्थिर पढ़ने का उपयोग करें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.