Property
C# एक ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग लैंगुएज है जिसके अंतर्गत Property एक बहुत ही महत्वपूर्ण अवधारणा है। Property की अवधारणा Field और Method की अवधारणा का संयुक्त रूप है।
C# प्रोग्रामिंग लैंगुएज के अंतर्गत Property एक क्लास मेम्बर है जो क्लास के किसी फील्ड को दूसरे क्लास के समक्ष एक्सपोज़ करने के लिए किया जाता है।
Property की अवधारणा क्या है? इसको समझने से पहले यह समझते हैं कि फील्ड की अवधारणा में ऐसी क्या कमी या सीमाएं है जिसकी वजह से Property की अवधारणा का विकास हुआ है। प्रॉपर्टी की अवधारणा का विकास फील्ड की अवधारणा के आधार पर हुआ है।
जैसा कि हम जानते हैं कि C# प्रोग्रामिंग के अंतर्गत किसी क्लास के भीतर दो हिस्से होते हैं पहला हिस्सा डाटा से संबंधित फील्ड का होता है जबकि दूसरा हिस्सा डाटा पर कार्य करने वाले मेथड्स का होता है। C# के अंतर्गत क्लास के फील्ड्स बाय डिफॉल्ट नियत रूप से प्राइवेट एक्सेस के होते हैं। इसका अर्थ यह है कि किसी भी क्लास का डाटा या फील्ड बाय डिफॉल्ट बिना एक्सेस modifier के प्राइवेट होता है और कोई भी दूसरा क्लास उस प्राइवेट फील्ड को एक्सेस नहीं कर सकता है, लेकिन अगर कोई दूसरा क्लास उस क्लास के फील्ड को यूज करना चाहे तो फिर फील्ड का एक्सेस मोडीफायर प्राइवेट की जगह पब्लिक होना चाहिए।
किसी भी क्लास के फील्ड को by डिफॉल्ट प्राइवेट इसलिए रखा जाता है ताकि वह फील्ड या उसका डाटा सुरक्षित रहें और बेवजह किसी दूसरे क्लास के ऑब्जेक्ट के द्वारा मैनिपुलेट/ हेरफेर ना हो सके। अगर किसी क्लास का फील्ड पब्लिक है तो उस फील्ड को कोई भी दूसरा क्लास manipulate कर सकता है। अर्थात उस फील्ड को get गेट या set सेट कर सकता है। लेकिन कई बार ऐसी बिजनेस रिक्वायरमेंट होती है जिसके अंतर्गत हम क्लास के फील्ड को पब्लिक नहीं रखना चाहते हैं। दूसरे शब्दों में हम उस क्लास के फील्ड या डाटा को दूसरे क्लास के द्वारा सीधे इस्तेमाल करने से रोकना चाहते हैं। ऐसी हालत में हमें उस फील्ड को प्राइवेट करना होगा।
अब एक संभावना यह है कि हम फील्ड को private रख उसे डायरेक्टली एक्सेस करने का अधिकार दूसरे क्लास को ना दें परंतु साथ ही हम कुछ ऐसा उपाय करें जिसके कारण उस प्राइवेट फील्ड को दूसरे क्लास द्वारा एक्सेस करना संभव हो, तो इसके लिए प्रॉपर्टी के कंसेप्ट को विकसित किया गया हैं। यद्यपि बिना प्रॉपर्टी के भी पब्लिक मेथड के द्वारा भी प्राइवेट फील्ड्स को एक्सपोज़ किया जा सकता है परन्तु यदि पब्लिक मेथड की सहायता से प्राइवेट फील्ड को एक्सपोज़ करें तो इसमें यह संभावना बनती है कि उस मेथड को दूसरा क्लास ओवरराइड या ओवरलोड कर सके इत्यादि, लेकिन प्रॉपर्टी एक ऐसा प्रोग्रामिंग कंस्ट्रक्ट है जो प्राइवेट फील्ड को एक्सपोज करने के विशेष उद्देश्य से ही बनाया जाता है। मेथड की तरह प्रॉपर्टी का ओवरराइडिंग या ओवरलोडिंग नहीं किया जाता है। अतः प्रॉपर्टी का आचरण एक मेथड की तरह होने के बावजूद भी आम मेथड से अलग और विशेष होता है। बिना प्रॉपर्टी के भी पब्लिक मेथड के द्वारा भी प्राइवेट फील्ड्स को एक्सपोज़ किया जा सकता है जिसका उदाहरण नीचे दिया गया है -
namespace PropertyEx
{
class Employee
{
string name;
int age;
//constructor
public Employee(string name, int age)
{
this.name = name;
this.age = age;
}
//method to get name field
public string GetName()
{
return name;
}
//method to set name field
public void SetName(string Name)
{
this.name = Name;
}
//method to get age field
public int GetAge()
{
return age;
}
//method to set age field
public void SetAge(int Age)
{
this.age= Age;
}
}
}
using System;
namespace PropertyEx
{
class Program
{
static void Main(string[] args)
{
Employee e1 = new Employee("Amitabh", 15);
Console.WriteLine("Original name: "+ e1.GetName());
Console.WriteLine("Original age: " + e1.GetAge().ToString());
e1.SetName("Amit");
e1.SetAge (41);
Console.WriteLine("New name: " + e1.GetName());
Console.WriteLine("New age: " + e1.GetAge().ToString());
Console.ReadKey();
}
}
}
C# प्रोग्रामिंग के अंतर्गत प्रॉपर्टी एक प्रकार का खास प्रकार का प्रोग्रामिंग कंस्ट्रक्ट या मेथड होता है जो क्लास के फील्ड को गेट या/और सेट करने की अनुमति प्रदान करता है। प्रोपर्टी C# प्रोग्रामिंग के अंतर्गत डाटा के सुरक्षित यूज को सम्भव बनाता है।
प्रॉपर्टी C# के अंतर्गत एक प्रोग्रामिंग कंस्ट्रक्ट है जिसके अंतर्गत गेट ब्लॉक या / और सेट ब्लॉक होते हैं। गेट ब्लॉक के भीतर हम क्लास के एक फील्ड के गेट करने का अधिकार दूसरे क्लास को प्रोवाइड करते हैं। इसी तरह सेट ब्लॉक के भीतर हम वह लॉजिक लिखते हैं जिसके अनुसार कोई दूसरा क्लास वर्तमान क्लास के एक फील्ड को सेट अर्थात परिवर्तित कर सकता है। इस तरीके से हम कह सकते हैं कि C# प्रोग्रामिंग के अंतर्गत प्रॉपर्टी एक ऐसा प्रोग्रामिंग कंस्ट्रक्ट होता है जिसकी मदद से क्लास के किसी प्राइवेट फील्ड को दूसरे क्लास के ऑब्जेक्ट द्वारा गेट या सेट करने की युक्ति प्रदान करते हैं। यह बात याद रखने वाली है कि एक प्रॉपर्टी क्लास के एक ही फील्ड के गेट सेट होने की लॉजिक निहित करता है। उदाहरण के लिए, अगर क्लास में तीन प्राइवेट फील्ड हैं तो हमें इन तीनों प्राइवेट फील्ड के लिए तीन अलग-अलग प्रॉपर्टी क्लास के भीतर देनी होगी।
Property Syntactic Rules
किसी भी फील्ड की प्रॉपर्टी को डिक्लेअर करने के लिए हमें निम्नलिखित syntactic rules का पालन करना चाहिए
१) प्रॉपर्टी का नाम फील्ड के नाम के अनुरूप होना चाहिए ताकि यह समझ में आ सके कि यह प्रॉपर्टी किस फील्ड के लिए है। उदाहरण के लिए name फील्ड के प्रोपर्टी का नाम Name उचित है।
२) जिस फील्ड का प्रॉपर्टी बनाना हो उन दोनों का डाटाटाइप समान होना चाहिए। उदाहरण के लिए name फील्ड का डाटाटाइप string है तो प्रॉपर्टी Name का भी डाटाटाइप string होगा।
३) प्रॉपर्टी का एक्सेस मोडीफायर public देना चाहिए ताकि वह किसी भी दूसरे क्लास के द्वारा एक एक्सेस किया जा सके। अन्य दूसरे एक्सेस मोडीफायर का भी यूज कर सकते हैं, यह बिजनेस की जरूरतों को ध्यान में रखते हुए निश्चित किया जाता है।
४) प्रॉपर्टी के ब्लॉक को क्लास के ब्लॉक की तरह { } से निरूपित किया जाता है। {} प्रॉपर्टी के ब्लॉक के भीतर get ब्लॉक और set ब्लॉक्स होते हैं।
५) get और set ब्लॉक के भीतर क्लास के उस फील्ड का यूज़ किया जाता है जिसका प्रोपर्टी गेट सेट किया जाता है। गेट ब्लॉक के भीतर रिटर्न स्टेटमेंट होता है जबकि सेट ब्लॉक के भीतर वैल्यू नामक contextual कीवर्ड होता है।
namespace PropertyEx
{
class Employee
{
string name;
int age;
//constructor
public Employee(string name, int age)
{
this.name = name;
this.age = age;
}
public string Name
{
get { return name; }
set { name = value; }
}
public int Age
{
get { return age; }
set { age = value; }
}
}
}
using System;
namespace PropertyEx
{
class Program
{
static void Main(string[] args)
{
Employee e1 = new Employee("Amitabh", 15);
Console.WriteLine("Original name: "+ e1.Name);
Console.WriteLine("Original age: " + e1.Age.ToString());
e1.Name = "Rakesh";
e1.Age = 30;
Console.WriteLine("New name: " + e1.Name);
Console.WriteLine("New age: " + e1.Age.ToString());
Console.ReadKey();
}
}
}
क्लास के भीतर किसी फील्ड के लिए प्रॉपर्टी का होना अनिवार्य नहीं है। अगर किसी क्लास का फील्ड पब्लिक है तो उस फील्ड के लिए प्रॉपर्टी बनाने की आवश्यकता नहीं है।
प्रॉपर्टी हमेशा क्लास के किसी फील्ड के संबंध में बनाया जाता है। एक प्रोपर्टी का सम्बंध क्लास के एक और केवल एक ही फील्ड से होता है।
प्रॉपर्टी केवल get गेट ब्लॉक को निहित कर सकता है या केवल set सेट ब्लॉक को निहित कर सकता है अथवा गेट और सेट दोनों ब्लॉक को निहित कर सकता है।
जब प्रॉपर्टी केवल गेट ब्लॉक को निहित करता है तो ऐसी प्रोपर्टी को readonly प्रोपर्टी कहते हैं।
जब प्रॉपर्टी केवल सेट ब्लॉक को निहित करता है तो ऐसी प्रोपर्टी को writeonly प्रोपर्टी कहते हैं।
जब प्रॉपर्टी गेट और सेट ब्लॉक्स को निहित करता है तो ऐसी प्रोपर्टी को readwrite प्रोपर्टी कहते हैं।
C# के अंतर्गत प्रोपर्टी के गेट ब्लॉक में सदैव return स्टेटमेंट का यूज होता है जबकि सेट ब्लॉक में सदैव value कीवर्ड का यूज होता है। value कीवर्ड एक contextual कीवर्ड है जिसका यूज किसी वैल्यू को फील्ड में सेट करने के लिए किया जाता है।
Convention of Naming Property in a Class
किसी क्लास के भीतर जितने भी फ़ील्ड्स होते हैं उन सभी फ़ील्ड्स के लिए प्रोपर्टी डिफाइन करना जरूरी नहीं होता है। अगर किसी क्लास के भीतर 50 फ़ील्ड्स है तो ऐसा जरूरी नहीं है कि उन सभी 50 फ़ील्ड्स के लिए प्रॉपर्टी हो। एक प्रोग्रामर को कैसे पता चलेगा कि किस फील्ड के लिए प्रॉपर्टी डिफाइन किया गया है। इसे पता करने के लिए पूरे कोड ब्लॉक को स्कैनिंग करना होगा, इसमें समय लगेगा। इससे बचने के लिए एक प्रोग्रामिंग कन्वेंशन यह है कि जिस फील्ड का प्रॉपर्टी बनाना हो उस फील्ड के नाम के पहले अंडरस्कोर का यूज़ किया जाए, ऐसा करने पर यह बोध हो जाएगा कि इस फील्ड का प्रॉपर्टी क्लास के भीतर डिफाइन किया गया है।
Property की अवधारणा के गुण
१) प्रॉपर्टी का मुख्य उद्देश्य क्लास के फील्ड के एक्सेस को सीमित या प्रतिबंधित करने के लिए किया जाता है। उदाहरण के लिए क्लास के फील्ड के एक्सेस को get किया जा सकता है अथवा set किया जा सकता है अथवा दोनों ही किया जा सकता है।
२) प्रॉपर्टी का एक अन्य उद्देश्य क्लास के फील्ड के एक्सेस को शर्तिया तौर पर प्रतिबंधित करने के लिए किया जाता है। उदाहरण के लिए क्लास के फील्ड के एक्सेस को शर्तिया get किया जा सकता है अथवा शर्तिया set किया जा सकता है अथवा दोनों ही शर्तिया किया जा सकता है।
कंडीशनल एक्सेस का उदाहरण
namespace PropertyEx
{
class Employee
{
string name;
int age;
//constructor
public Employee(string name, int age)
{
this.name = name;
this.age = age;
}
public string Name
{
get { return name; }
set
{
if (value != null && value.Length > 0)
{
name = value;
} }
}
public int Age
{
get { return age; }
set
{
if (value > 18 )
{
age = value;
} }
}
}
}
using System;
namespace PropertyEx
{
class Program
{
static void Main(string[] args)
{
Employee e1 = new Employee("Amitabh", 15);
Console.WriteLine("Original name: "+ e1.Name);
Console.WriteLine("Original age: " + e1.Age.ToString());
e1.Name = "Ajay";
e1.Age = 27;
Console.WriteLine("New name: " + e1.Name);
Console.WriteLine("New age: " + e1.Age.ToString());
Console.ReadKey();
}
}
}
© अजीत कुमार, सर्वाधिकार सुरक्षित।
इस आलेख को उद्धृत करते हुए इस लेख के लिंक का भी विवरण दें। इस आलेख को कॉपीराइट सूचना के साथ यथावत साझा करने की अनुमति है। कृपया इसे ऐसे स्थान पर साझा न करें जहाँ इसे देखने के लिए शुल्क देना पडे।
No comments:
Post a Comment