c# - स्थिर क्षेत्र वास्तव में आंतरिक रूप से कैसे काम करते हैं?




java php (8)

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

स्थैतिक सदस्यों और उदाहरण सदस्यों (कीवर्ड static बिना वाले) के बीच का अंतर यह है कि स्थैतिक सदस्य प्रति प्रकार केवल एक बार (वर्ग, संरचना) मौजूद होते हैं और उदाहरण सदस्य प्रति उदाहरण (प्रति वस्तु) में मौजूद होते हैं।

यह केवल संदर्भ है जो स्थैतिक है या नहीं; यह भेद संदर्भित ऑब्जेक्ट पर लागू नहीं होता है (जब तक ऑब्जेक्ट एक मान प्रकार न हो)। एक स्थिर सदस्य, एक उदाहरण सदस्य और एक स्थानीय चर सभी एक ही वस्तु का संदर्भ कर सकते हैं।

इस प्रश्न का उत्तर यहां दिया गया है:

कहो कि आपके पास एक कक्षा है,

class Foo
{
    public static bar;
}

जब आप कहें:

new Foo();

मैं कल्पना कर सकता हूं कि स्मृति में, इस वस्तु के लिए एक स्थान आरक्षित है।

... और जब आप फिर से कहते हैं:

new Foo(); 

... अब आपके पास ऑब्जेक्ट के लिए एक और जगह उपलब्ध है।

हालांकि, स्थिर क्षेत्र वास्तव में कहां रहता है?

मैं वास्तव में सीखने की कोशिश कर रहा हूं:

ऑब्जेक्ट्स के संदर्भ उन ऑब्जेक्ट्स के उसी फ़ील्ड को संदर्भित करते हैं जो वे संदर्भित करते हैं?


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

तो मूल रूप से यह पसंद है

+++++++++++++++++++++++++++++++++++++
+ DATA Segment
+   -static vars
+   
+----------------------------------
+  instances | instances | instances|
+            |           |          |

यहां एकल क्षेत्र को उदाहरणों के बीच साझा किया जाता है।

wikipedia "डेटा क्षेत्र में प्रोग्राम द्वारा उपयोग किए जाने वाले वैश्विक और स्थैतिक चर शामिल हैं
स्पष्ट रूप से एक मूल्य के साथ शुरू किया। "


जावा के लिए, स्थैतिक क्षेत्रों द्वारा संदर्भित वस्तुओं को अन्य वस्तुओं की तरह ढेर पर रहना होगा:

ढेर रनटाइम डेटा क्षेत्र है जिसमें से सभी वर्ग के उदाहरणों और सरणी आवंटित किए जाते हैं।

कक्षा को लोड होने पर फ़ील्ड शुरू किया जाएगा (यदि घोषणा में प्रारंभिकरण होता है), जो निम्न में से किसी एक की पहली घटना से तुरंत होता है:

  • कक्षा का एक उदाहरण बनाया गया है।
  • कक्षा द्वारा घोषित एक स्थिर विधि का आह्वान किया जाता है।
  • कक्षा द्वारा घोषित एक स्थिर क्षेत्र असाइन किया गया है।
  • कक्षा द्वारा घोषित एक स्थिर क्षेत्र का उपयोग किया जाता है और क्षेत्र स्थिर चर नहीं है (§4.12.4)।

स्थैतिक क्षेत्र तक पहुंच 2 विशेष जेवीएम निर्देशों, getstatic और putstatic माध्यम से की putstatic । लेकिन उस भेद के अलावा, स्थिर क्षेत्र गैर स्थैतिक क्षेत्रों के समान हैं।


मैं केवल सी # से परिचित हूं, और यह मेरी समझ है:

फिर आपका प्रोग्राम शुरू होता है, यह सभी संबंधित असेंबली को ऐपडोमेन में लोड करता है। जब assambly लोड किया जाता है, सभी स्थिर रचनाकारों को स्थिर क्षेत्रों सहित बुलाया जाता है। वे वहां रहेंगे, और उन्हें उतारने का एकमात्र तरीका ऐपडोमेन को उतारना है।


यह भाषा की भाषा या भाषा के डिजाइनर पर निर्भर करता है। यदि मैं जावा के बारे में बात करता हूं, तो स्थिर सदस्य JVM के विधि क्षेत्र में संग्रहीत होते हैं और सभी ऑब्जेक्ट उनसे जुड़े होते हैं। एक और बात यह जानना बहुत महत्वपूर्ण है कि हम कक्षा के ऑब्जेक्ट को बनाए बिना स्थिर डेटा सदस्य तक पहुंच सकते हैं। इसका मतलब है कि स्थिर डेटा सदस्यों को स्मृति का आवंटन उस वस्तु के निर्माण पर निर्भर नहीं है कक्षा।


यह भाषा से भाषा तक जंगली रूप से भिन्न होता है, और प्लेटफ़ॉर्म से मंच तक भी जंगली रूप से भिन्न हो सकता है ...

उदाहरण के लिए, .NET पक्ष पर, स्थैतिक सदस्य शासी EEClass परिभाषा के साथ "जुड़े" होते हैं, जो एक ढेर-आवंटित या "कहीं भी" आवंटित सदस्य हो सकता है (सी # spec ढेर / ढेर व्यवहार निर्दिष्ट नहीं करता है, यह एक है वीएम के कार्यान्वयन विवरण)


स्टेटिक वैरिएबल क्लास से संबंधित नहीं है, इसलिए ऑब्जेक्ट में केवल एक bar है, भले ही आप Foo हजारों इंस्टेंट्स को प्रारंभ करें।


स्टेटिक सदस्यों और स्थिरांक ढेर पर संग्रहीत हैं। कचरे पर वस्तुओं के विपरीत जो कचरा संग्रह प्राप्त कर सकते हैं, स्टेटिक सदस्य और स्थिरांक तब तक रहते हैं जब तक कि एपडोमेन टूट नहीं जाता है, इसलिए एक बार स्थिर क्षेत्रों से निपटने में सावधान रहना चाहिए





static-members