स्टैटिक बनाम इंस्टेंस डिज़ाइन
तय करें कि स्टैटिक स्थिति कब उपयुक्त है।
स्टैटिक बनाम इंस्टेंस डिज़ाइन, CoddyKit पर C# अकादमी का एक निःशुल्क पाठ है। यह 4 में से 4वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह C# अकादमी सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। C# अकादमी पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
एक डिज़ाइन संबंधी निर्णय
स्थैतिक और इंस्टेंस के बीच चुनाव एक डिज़ाइन संबंधी निर्णय है। मुख्य प्रश्न यह है: क्या व्यवहार हर ऑब्जेक्ट की स्थिति पर निर्भर करता है, या केवल उसके इनपुट पर?
using System;
class Program
{
// Depends only on inputs -> good static method
static int Max(int a, int b) => a > b ? a : b;
static void Main()
{
Console.WriteLine(Max(3, 8));
}
}स्थिति-रहित तर्क के लिए स्थैतिक का उपयोग करें
यदि किसी विधि को किसी इंस्टेंस फ़ील्ड की आवश्यकता नहीं है और वह केवल इनपुट को बदलती है, तो उसे static बनाएँ। गणितीय सहायक विधियाँ और फ़ॉर्मैटर इसके प्रमुख उदाहरण हैं।
using System;
static class Convert2
{
public static double MilesToKm(double miles) => miles * 1.60934;
}
class Program
{
static void Main()
{
Console.WriteLine(Convert2.MilesToKm(10).ToString("0.0") + " km");
}
}स्थिति के लिए इंस्टेंस का उपयोग करें
यदि व्यवहार हर ऑब्जेक्ट के अनुसार बदलने वाले डेटा पर निर्भर करता है, तो इंस्टेंस का उपयोग करें। हर ऑब्जेक्ट अपनी स्थिति स्वयं रखता है।
using System;
class Counter
{
private int _count;
public void Increment() => _count++;
public int Value => _count;
}
class Program
{
static void Main()
{
var a = new Counter();
var b = new Counter();
a.Increment();
a.Increment();
b.Increment();
Console.WriteLine("a=" + a.Value + ", b=" + b.Value);
}
}साझा स्थिति वैश्विक स्थिति होती है
स्थैतिक फ़ील्ड प्रभावी रूप से वैश्विक होता है। जब किसी प्रोग्राम के कई भाग उसे पढ़ते और लिखते हैं, तो इससे सूक्ष्म त्रुटियाँ उत्पन्न हो सकती हैं। जब हर उपयोगकर्ता को अपनी अलग प्रति चाहिए, तब इंस्टेंस की स्थिति को प्राथमिकता दें।
using System;
class BadCart
{
public static int Items; // shared by EVERYONE -> usually wrong for a cart
}
class Program
{
static void Main()
{
BadCart.Items++;
BadCart.Items++;
Console.WriteLine("All carts share: " + BadCart.Items);
}
}जाँच-योग्यता
शुद्ध स्थैतिक विधियों की जाँच करना आसान होता है: वही इनपुट, वही आउटपुट। इसके विपरीत, बदलने योग्य स्थैतिक स्थिति जाँचों के बीच बनी रहती है और उन्हें अस्थिर बना देती है।
using System;
static class Calc
{
public static int Add(int a, int b) => a + b; // trivially testable
}
class Program
{
static void Main()
{
Console.WriteLine(Calc.Add(2, 2) == 4 ? "pass" : "fail");
}
}निर्माता सहायक विधियों के लिए स्थैतिक का उपयोग
वर्णनात्मक नाम के साथ कॉन्फ़िगर किए गए इंस्टेंस बनाने के लिए स्थैतिक निर्माता विधियाँ एक साफ़-सुथरा तरीका हैं।
using System;
class Color
{
public int R, G, B;
private Color(int r, int g, int b) { R = r; G = g; B = b; }
public static Color Red() => new Color(255, 0, 0);
public static Color White() => new Color(255, 255, 255);
}
class Program
{
static void Main()
{
var c = Color.Red();
Console.WriteLine(c.R + "," + c.G + "," + c.B);
}
}सिर्फ़ new से बचने के लिए स्थैतिक का उपयोग न करें
ऑब्जेक्ट बनाने से बचने के लिए हर चीज़ को स्थैतिक न बनाएँ। यदि कोई प्रकार स्थिति वाली वस्तु का मॉडल बनाता है, तो इंस्टेंस उस स्थिति को अलग और सुरक्षित रखते हैं।
using System;
class Player
{
public string Name;
public int Health = 100;
public void TakeDamage(int d) => Health -= d;
}
class Program
{
static void Main()
{
var p1 = new Player { Name = "A" };
var p2 = new Player { Name = "B" };
p1.TakeDamage(30);
Console.WriteLine(p1.Name + ": " + p1.Health + ", " + p2.Name + ": " + p2.Health);
}
}दोनों का उचित मिश्रण
कई वर्ग साझा स्थिरांकों या गणनाकर्ताओं के लिए स्थैतिक सदस्यों और हर ऑब्जेक्ट के डेटा के लिए इंस्टेंस सदस्यों का उपयोग करते हैं। यह मिश्रण पूरी तरह प्रचलित शैली के अनुरूप है।
using System;
class Invoice
{
private static int _seq = 1000;
public readonly int Number;
public decimal Amount;
public Invoice(decimal amount)
{
Number = _seq++;
Amount = amount;
}
}
class Program
{
static void Main()
{
var i1 = new Invoice(50m);
var i2 = new Invoice(75m);
Console.WriteLine(i1.Number + " / " + i2.Number);
}
}समवर्ती निष्पादन की चिंता
साझा स्थैतिक स्थिति को एक ही समय में कई थ्रेड इस्तेमाल कर सकते हैं, जिससे दौड़ की स्थितियों का जोखिम रहता है। एक ही थ्रेड तक सीमित इंस्टेंस की स्थिति डिफ़ॉल्ट रूप से अधिक सुरक्षित होती है।
using System;
class SafeCalc
{
// No shared mutable state -> naturally thread-safe
public static long Factorial(int n)
{
long result = 1;
for (int i = 2; i <= n; i++) result *= i;
return result;
}
}
class Program
{
static void Main()
{
Console.WriteLine(SafeCalc.Factorial(5));
}
}एक सरल सामान्य नियम
स्थैतिक = ऐसा व्यवहार जो प्रकार से संबंधित हो और किसी ऑब्जेक्ट-विशिष्ट स्थिति का उपयोग न करे। इंस्टेंस = ऐसा व्यवहार जो किसी विशेष ऑब्जेक्ट को पढ़े या बदले। संदेह होने पर, स्थिति से संबंधित हर चीज़ के लिए इंस्टेंस को प्राथमिकता दें।
using System;
class Temperature
{
public double Celsius; // instance state
public static double ToF(double c) => c * 9 / 5 + 32; // stateless helper
}
class Program
{
static void Main()
{
var t = new Temperature { Celsius = 30 };
Console.WriteLine(Temperature.ToF(t.Celsius));
}
}सब कुछ साथ में
अच्छा डिज़ाइन स्थिति-रहित सहायक विधियों (स्थैतिक) को स्थिति-युक्त मॉडल (इंस्टेंस) से अलग रखता है और साझा बदलने योग्य स्थिति को सोच-समझकर न्यूनतम रखता है।
using System;
static class TaxRules
{
public static decimal Apply(decimal amount, decimal rate) => amount + amount * rate;
}
class Sale
{
public decimal Subtotal;
public decimal Total(decimal rate) => TaxRules.Apply(Subtotal, rate);
}
class Program
{
static void Main()
{
var s = new Sale { Subtotal = 100m };
Console.WriteLine(s.Total(0.2m));
}
}त्वरित जाँच
स्थैतिक और इंस्टेंस डिज़ाइन के अंतर की अपनी समझ जाँचें।
पुनरावलोकन
ऐसे स्थिति-रहित तर्क के लिए स्थैतिक चुनें जो केवल इनपुट पर निर्भर करता है, जैसे सहायक विधियाँ, निर्माता विधियाँ और स्थिरांक। हर ऑब्जेक्ट की स्थिति से जुड़े व्यवहार के लिए इंस्टेंस चुनें। बदलने योग्य स्थैतिक स्थिति प्रभावी रूप से वैश्विक होती है, उसकी जाँच करना कठिन होता है और समवर्ती निष्पादन संबंधी त्रुटियों का जोखिम रहता है, इसलिए इसे न्यूनतम और सोच-समझकर रखें।
using System;
static class Util { public static int Sq(int n) => n * n; }
class Box { public int Size; public int Area() => Util.Sq(Size); }
class Program
{
static void Main()
{
var box = new Box { Size = 4 };
Console.WriteLine(box.Area());
}
}एआई शिक्षक के साथ C# सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 93
- पाठ
- 346
अक्सर पूछे जाने वाले प्रश्न
क्या “स्टैटिक बनाम इंस्टेंस डिज़ाइन” पाठ निःशुल्क है?
हाँ—“स्टैटिक बनाम इंस्टेंस डिज़ाइन” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और C# अकादमी पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। C# अकादमी पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“स्टैटिक बनाम इंस्टेंस डिज़ाइन” में मैं क्या सीखूँगा?
तय करें कि स्टैटिक स्थिति कब उपयुक्त है। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ C# अकादमी का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या C# अकादमी शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर C# अकादमी शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 4वाँ पाठ है।
“स्टैटिक बनाम इंस्टेंस डिज़ाइन” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस C# अकादमी पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर C# अकादमी पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- स्टैटिक मेथड और फील्ड
- यूटिलिटी के लिए स्टैटिक क्लास
- कॉन्स्टेंट और readonly फील्ड
- स्टैटिक बनाम इंस्टेंस डिज़ाइन