अपरिवर्तनीय ऑब्जेक्ट पैटर्न
ऐसे ऑब्जेक्ट डिज़ाइन करें जो बनने के बाद कभी न बदलें।
अपरिवर्तनीय ऑब्जेक्ट पैटर्न, CoddyKit पर C# अकादमी का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह C# अकादमी सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। C# अकादमी पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
अपरिवर्तनीय ऑब्जेक्ट डिज़ाइन करना
अपरिवर्तनीय ऑब्जेक्ट निर्माण के बाद कभी नहीं बदलता। अपरिवर्तनीयता साझा परिवर्तनीय स्थिति से जुड़ी कई प्रकार की बग हटाती है और ऑब्जेक्ट को पास करना तथा कैश करना सुरक्षित बनाती है।
केवल-get प्रॉपर्टी
सबसे सरल अपरिवर्तनीय प्रॉपर्टी केवल-get वाली होती है, जिसे कंस्ट्रक्टर से एक बार असाइन किया जाता है।
using System;
class Point {
public int X { get; }
public int Y { get; }
public Point(int x, int y) { X = x; Y = y; }
}
var p = new Point(3, 4);
Console.WriteLine(p.X + "," + p.Y); // 3,4इनिशियलाइज़र सिंटैक्स के लिए इनिट
जब आप अपरिवर्तनीयता के साथ सुविधाजनक ऑब्जेक्ट-इनिशियलाइज़र सिंटैक्स चाहते हैं, तब init प्रॉपर्टी का उपयोग करें।
using System;
class Color {
public int R { get; init; }
public int G { get; init; }
public int B { get; init; }
}
var c = new Color { R = 255, G = 128, B = 0 };
Console.WriteLine(c.R + "," + c.G + "," + c.B); // 255,128,0अनिवार्य फ़ील्ड के लिए required
required + init को संयोजित करें, ताकि आवश्यक फ़ील्ड न तो भूलें और न ही बाद में बदल सकें।
using System;
class Money {
public required decimal Amount { get; init; }
public required string Currency { get; init; }
}
var m = new Money { Amount = 9.99m, Currency = "USD" };
Console.WriteLine(m.Amount + " " + m.Currency); // 9.99 USDबदलाव करने के बजाय नए ऑब्जेक्ट लौटाना
अपरिवर्तनीय प्रकार “बदलाव” वाले कार्यों को ऐसी विधियों के रूप में उजागर करते हैं जो नया इंस्टेंस लौटाती हैं और मूल को बिना बदले छोड़ देती हैं।
using System;
class Point {
public int X { get; init; }
public int Y { get; init; }
public Point Move(int dx, int dy) => new Point { X = X + dx, Y = Y + dy };
}
var a = new Point { X = 1, Y = 1 };
var b = a.Move(2, 3);
Console.WriteLine(a.X + "," + a.Y + " -> " + b.X + "," + b.Y); // 1,1 -> 3,4अपरिवर्तनीय संग्रह
संग्रह वाले फ़ील्ड के लिए अपरिवर्तनीय या केवल-पठन संग्रह संग्रहीत करें, ताकि ऑब्जेक्ट के माध्यम से उसकी सामग्री में बदलाव न किया जा सके।
using System;
using System.Collections.Immutable;
class Team {
public ImmutableList<string> Members { get; init; } = ImmutableList<string>.Empty;
}
var t = new Team { Members = ["Ada", "Lin"] };
var t2 = new Team { Members = t.Members.Add("Sam") };
Console.WriteLine(t.Members.Count + " " + t2.Members.Count); // 2 3सुरक्षात्मक कॉपी बनाना
यदि आपको परिवर्तनीय संग्रह स्वीकार करना ही पड़े, तो उसे अंदर लेते समय कॉपी कर लें, ताकि बाहरी बदलाव ऑब्जेक्ट के भीतर न पहुँच सकें।
using System;
using System.Collections.Generic;
using System.Linq;
class Snapshot {
private readonly int[] data;
public Snapshot(IEnumerable<int> source) => data = source.ToArray();
public IReadOnlyList<int> Data => data;
}
var list = new List<int> { 1, 2, 3 };
var snap = new Snapshot(list);
list.Add(4); // does not affect snap
Console.WriteLine(snap.Data.Count); // 3मान-आधारित समानता
अपरिवर्तनीय ऑब्जेक्ट अक्सर मान-आधारित समानता चाहते हैं: समान डेटा वाले दो इंस्टेंस समान माने जाते हैं। रिकॉर्ड यह सुविधा अपने-आप देते हैं; क्लास में ओवरराइड आवश्यक होते हैं।
using System;
record Coord(int X, int Y);
Console.WriteLine(new Coord(1, 2) == new Coord(1, 2)); // Trueबिना अतिरिक्त प्रयास थ्रेड-सुरक्षा
अपरिवर्तनीय ऑब्जेक्ट कभी नहीं बदलते, इसलिए उन्हें लॉक के बिना साझा करना स्वाभाविक रूप से थ्रेड-सुरक्षित होता है।
using System;
class ReadonlyConfig {
public required string Env { get; init; }
}
var cfg = new ReadonlyConfig { Env = "prod" };
// safe to read from many threads without synchronization
Console.WriteLine(cfg.Env); // prodreadonly फ़ील्ड और स्ट्रक्चर
मान-प्रकारों के लिए फ़ील्ड स्तर पर अपरिवर्तनीयता लागू करने हेतु readonly फ़ील्ड और readonly struct का उपयोग करें।
using System;
readonly struct Vector {
public readonly double X, Y;
public Vector(double x, double y) { X = x; Y = y; }
public double Length => Math.Sqrt(X * X + Y * Y);
}
Console.WriteLine(new Vector(3, 4).Length); // 5सभी बातों को एक साथ लागू करना
required, init, मान-आधारित समानता और बदलाव न करने वाली अद्यतन विधि को संयोजित करने वाला पूरी तरह अपरिवर्तनीय प्रकार।
using System;
record Account(string Id, decimal Balance) {
public Account Deposit(decimal amount) => this with { Balance = Balance + amount };
}
var a = new Account("A1", 100m);
var b = a.Deposit(50m);
Console.WriteLine(a.Balance + " -> " + b.Balance); // 100 -> 150त्वरित जाँच
अपरिवर्तनीय-अद्यतन सिद्धांत की पुष्टि करें।
पुनरावलोकन
आपने अपरिवर्तनीय ऑब्जेक्ट के लिए उपयोगी प्रतिरूप सीखे।
- अनिवार्य डेटा के लिए केवल-get या
initप्रॉपर्टी औरrequiredका उपयोग करें। - बदलावों को नए इंस्टेंस लौटाने वाली विधियों के रूप में मॉडल करें।
- अपरिवर्तनीय या सुरक्षात्मक रूप से कॉपी किए गए संग्रह संग्रहीत करें।
- रिकॉर्ड मान-आधारित समानता और
withकॉपी देते हैं; अपरिवर्तनीयता थ्रेड-सुरक्षा देती है।
एआई शिक्षक के साथ C# सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 93
- पाठ
- 346
अक्सर पूछे जाने वाले प्रश्न
क्या “अपरिवर्तनीय ऑब्जेक्ट पैटर्न” पाठ निःशुल्क है?
हाँ—“अपरिवर्तनीय ऑब्जेक्ट पैटर्न” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और C# अकादमी पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। C# अकादमी पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“अपरिवर्तनीय ऑब्जेक्ट पैटर्न” में मैं क्या सीखूँगा?
ऐसे ऑब्जेक्ट डिज़ाइन करें जो बनने के बाद कभी न बदलें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ C# अकादमी का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या C# अकादमी शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर C# अकादमी शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।
“अपरिवर्तनीय ऑब्जेक्ट पैटर्न” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस C# अकादमी पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर C# अकादमी पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- केवल-init सेटर
- required मॉडिफ़ायर
- अपरिवर्तनीय ऑब्जेक्ट पैटर्न
- रिकॉर्ड पर with एक्सप्रेशन