2010-05-28 10 views
14

मुझे या तो एक स्थिर या सामान्य कक्षा कब पसंद करनी चाहिए? या: उनके बीच क्या अंतर है?एक स्थिर वर्ग और सामान्य कक्षा के बीच क्या अंतर है?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace staticmethodlar 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      SinifA.method1(); 
     } 
    } 

    static class SinifA 
    { 
     public static void method1() 
     { 
      Console.WriteLine("Deneme1"); 
     } 
    } 

    public static class SinifB 
    { 
     public static void method2() 
     { 
      Console.WriteLine("Deneme2"); 
     } 
    } 
    public class sinifC 
    { 
     public void method3() 
     { 
      Console.WriteLine("Deneme3"); 
     } 
    } 

    public class sinifD : sinifC 
    { 
     void method4() 
     { 
      Console.WriteLine("Deneme4"); 
     } 

     sinifC sinifc = new sinifC(); // I need to use it :) 
    } 
} 
+0

संबंधित प्रश्न http://stackoverflow.com/questions/1493862/making-methods-all-static-in-class – R0MANARMY

+3

संभावित डुप्लिकेट [सी # - "स्थैतिक" वर्ग क्या है?] (Http: // stackoverflow .com/प्रश्न/695056/c-what-is-a-static-class) –

उत्तर

24

स्टेटिक कक्षाओं में स्थैतिक वस्तुएं होती हैं जिन्हें कई बार तत्काल नहीं किया जा सकता है। आम तौर पर मैं स्थिर कक्षाओं का उपयोग करता हूं जो स्थिर विधियों को घरों में रखना है जो गणना, सामान्य प्रसंस्करण पैटर्न, स्ट्रिंग आउटपुट प्रारूप आदि प्रदान करते हैं। स्टेटिक क्लास हल्के वजन होते हैं और उन्हें तत्काल आवश्यकता नहीं होती है।

उदाहरण के लिए System.IO.File एक स्थिर वर्ग है जिसमें स्थिर विधि Exists() है। आप इसे कॉल करने के लिए फ़ाइल ऑब्जेक्ट नहीं बनाते हैं।आप बल्कि इस

System.IO.File myFile = new System.IO.File(filePath);

if(myFile.Exists()) { /* do work */ }

कर आप सॉफ्टवेयर में कई वस्तुओं की आवश्यकता होती है की तुलना में इस

System.IO.File.Exists(filePath)

है जैसे कि यह आह्वान है, तो आप गतिशील कक्षाओं का उपयोग करें। उदाहरण के लिए यदि आप एक सूची प्रणाली है आप कई Product वस्तुओं हो सकता है और उस मामले में आप इस तरह इस

public class Product 
{ 

    public int ProductID { get; private set; } 
    public string ProductName { get; private set; } 
    public int Qty   { get; set; } 

    public Product(int productID, string productName, int total) 
    { 
     this.ProductID = productID; 
     this.ProductName = productName; 
     this.Qty = total; 
    }  
} 
3
MSDN documentation on static classes से

:

एक वर्ग स्थिर घोषित किया जा सकता, यह दर्शाता है कि यह केवल स्थिर सदस्यों में शामिल है। नए कीवर्ड का उपयोग करके एक स्थिर वर्ग के उदाहरण बनाना संभव नहीं है। स्टेटिक कक्षाएं .NET Framework सामान्य भाषा रनटाइम (सीएलआर) द्वारा स्वचालित रूप से लोड की जाती हैं जब कक्षा या प्रोग्राम युक्त नामस्थान लोड होता है।

+0

कोई आश्चर्य करता है कि उन सभी जीबी दस्तावेज़ क्या हैं। –

+0

क्या "दस्तावेज़ीकरण पढ़ना सीखें" टिप्पणी वास्तव में आवश्यक थी? निश्चित रूप से, मैं आपके प्रश्न का उत्तर दूंगा लेकिन आपको यह भी दिखाऊंगा कि एक बुद्धिमानी से बेहतर @ss मैं क्या कर सकता हूं। शुभ शुक्रवार! – DenaliHardtail

+1

@ वैगिंग साइबेरियाई: उसे संदेह का लाभ देना, यह खोज वाक्यांश ** स्थिर वर्ग सी # ** के लिए पहला Google परिणाम है, हां यह आवश्यक था। मुझे एक प्रश्न पोस्ट करने से पहले एक Google खोज करना पसंद नहीं है एक अनुचित आवश्यकता है। – R0MANARMY

4

आप कक्षा निर्माता के माध्यम से "सामान्य" कक्षाओं के उदाहरण बना सकते हैं।

var normal = new Normal(); 

आप स्थैतिक कक्षाओं के उदाहरण नहीं बना सकते हैं। वे केवल स्थिर तरीके हो सकते हैं।

यह भी ध्यान देने योग्य है कि अवस्था वर्गों में extension methods घोषित करना चाहिए।

+0

ठीक है जब मैं स्थिर वर्ग का उपयोग करता हूं? – Penguen

+1

विस्तार विधियों के बारे में अच्छा बिंदु। – R0MANARMY

0

स्टेटिक सदस्यों को कक्षा के उदाहरण का उपयोग किये बिना बुलाया जा सकता है। उदाहरण के लिए, मैथ क्लास को तुरंत चालू किए बिना मैथ.एरिया द्वारा एरिया विधि कॉल के साथ एक स्थिर मैथ क्लास को बुलाया जाना चाहिए।

13
  • स्थैतिक वर्ग instantiated या inherited नहीं हो सकते हैं।
  • स्थिर कक्षाओं को आउटपुट MSIL में संकलक द्वारा sealed और abstract के रूप में चिह्नित किया गया है।
  • स्थैतिक वर्गों के सभी सदस्यों को स्थिर भी होना चाहिए।
  • केवल स्थिर वर्ग extension methods होस्ट कर सकते हैं।
  • स्थिर वर्गों का उपयोग सामान्य प्रकार के तर्कों के रूप में नहीं किया जा सकता है।
+0

क्या आप कृपया मुझे "केवल स्थिर वर्ग विस्तार विधियों को होस्ट कर सकते हैं" के बारे में और बता सकते हैं। सामान्य कक्षाएं एक्सटेन्शन विधियों की मेजबानी क्यों नहीं कर सकती हैं? धन्यवाद! – Catbuilts

1

सरल शब्दों में:

एक स्थिर वर्ग new कीवर्ड का उपयोग instantiated नहीं किया जा सकता है। स्थिर वर्ग में सभी विधियां स्थैतिक होनी चाहिए और बिना किसी तत्कालता के कहा जा सकता है।

एक "सामान्य" वर्ग तत्काल होना चाहिए हालांकि "सामान्य" वर्ग में किसी भी स्थिर तरीके को तत्काल बिना बुलाया जा सकता है।

"सामान्य" वर्ग में गैर स्थैतिक तरीकों को पहले कक्षा को तुरंत चालू किए बिना बुलाया नहीं जा सकता है।

+0

फिर स्टैटिक क्लास फ़ंक्शन मेथड 1() और सामान्य श्रेणी वाले स्थिर फ़ंक्शन विधि 1() के बीच अंतर क्या है। और कौन सा परिदृश्य हम उपरोक्त विधि का उपयोग करेंगे .. –

0

एक स्थिर वर्ग एक है कि instantiated नहीं किया जा सकता है के रूप में एक गतिशील वर्ग का प्रयोग करेंगे। इसलिए, इसे किसी ऑब्जेक्ट के कई उदाहरणों के लिए 'टेम्पलेट' के रूप में उपयोग नहीं किया जा सकता है जो सामान्य श्रेणी के रूप में कक्षा परिभाषा के अनुरूप होता है। सामान्य श्रेणी में, परिभाषित डेटा सदस्यों को कक्षा के प्रत्येक "उदाहरण" के लिए बनाया जाता है, और प्रत्येक "उदाहरण" में यह इन डेटा सदस्यों का अपना सेट है, इसलिए ये उदाहरण किसी ऑब्जेक्ट के लिए अलग-अलग "इकाइयों" या जटिल इन-मेमोरी डेटा संरचनाओं का प्रतिनिधित्व करते हैं (जिसे आपने कक्षा को प्रतिनिधित्व करने के लिए कोड किया था)।

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

0

एक सामान्य श्रेणी वह है जिसे आप तुरंत कर सकते हैं और वस्तुओं के साथ उपयोग कर सकते हैं।

एक स्थैतिक वर्ग वह है जिसे instansiated नहीं किया जा सकता है और विस्तारित नहीं किया जा सकता है।

इसका मतलब है कि a static class is sealed and abstract डिफ़ॉल्ट रूप से, आप

एक स्थिर वर्ग संकलक की MSIL पर लग सकता है सील और एक स्थिर कक्षा के सामने सार डालता है।

तो, क्योंकि एक स्थिर वर्ग instantiated नहीं किया जा सकता है, आप उदाहरण के तरीकों परिभाषित

स्थिर कक्षाओं पर

नहीं हो सकता है, इसलिए सभी तरीकों बिल्कुल स्थिर और सार्वजनिक होना चाहिए के रूप में आप

चाहेगा उन्हें इस्तेमाल करें।

A static class is singleton by default. 

स्टेटिक कक्षाएं विस्तार तरीकों को परिभाषित करने के लिए उपयोग किया जाता है क्योंकि आप

उन्हें instansiate नहीं करना चाहती।

स्टेटिक क्लास अद्वितीय सेवाओं के वैश्विक प्रदाता की तरह हैं।

मुझे उम्मीद है कि आपको समझ में आएगा और आपको स्थिर वर्गों को समझने में मदद मिलेगी।

0

यह मेमोरी एड्रेसिंग के मामले में "स्थैतिक" और "उदाहरण" के बारे में सोचने में मदद कर सकता है।

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

var result = Math.Pow(3, 3); // static - Math class can't be instanced 

एक वस्तु जो स्थैतिक नहीं है उसे एक या अधिक बार स्थापित किया जा सकता है; आप कह रहे हैं, "मेरे लिए इस प्रकार का ऑब्जेक्ट बनाएं" और ऑब्जेक्ट को मेमोरी एड्रेस दिया गया है। आप कई उदाहरण बना सकते हैं जो सभी अलग-अलग मेमोरी पतों में मौजूद हैं। ऑब्जेक्ट का निर्माण new कीवर्ड का उपयोग कर स्पष्ट है।

var Ted = new Employee(); // instance - creates a new object at a new address 

यह वह जगह है जहां लोग एएसपी .NET वेब प्रोग्रामिंग में परेशानी में पड़ते हैं; प्रति वर्ग डोमेन एक बार स्थिर वर्ग बनाए जाते हैं और इसलिए उनके रचनाकारों को केवल एक बार बुलाया जाता है।

संबंधित मुद्दे