C# in Hindi : LINQ to SQL

LINQ to SQL

C# आपको LINQ to SQL interface provide करती है जिसके द्वारा आप relational database पर SQL queries perform कर पाते है। इस interface के द्वारा queries perform करने के लिए आपको SQL (Structured Query Language) सीखने की आवश्यकता नहीं होती है।

जब आप किसी relational database के लिए LINQ queries perform करते है तो LINQ to SQL interface उस query को सबसे पहले SQL query में convert करता है। SQL query में convert करने के बाद यह interface query को SQL server को pass करता है। SQL server उस query को execute करता है और result return करता है। SQL server के द्वारा return किये गए result को LINQ to SQL interface object के रूप में convert करता है जो result को programming environment में represent करता है।

LINQ to SQL interface के द्वारा आप database पर query perform करने के अलावा create, insert, update और delete operations भी perform कर सकते है। साथ यह interface transactions और prepared statements के लिए भी support provide करता है।

C# आपको System.Data.Linq namespace provide करती है। इस namespace में वे classes provide की गयी है जो LINQ to SQL application के लिए support provide करती है।

Object Relational Mapping (ORM)

LINQ to SQL interface के साथ काम करने के लिए आपको databases के relational objects (tables आदि) को objects oriented object types में convert करना होता है। यह process ORM कहलाती है।

ORM process में object to relational mapping होती (ORM)  है। इसके लिए OR designer का प्रयोग किया जाता है। यह tool आपको C# द्वारा provide किया जाता है।

जब ORM process perform की जाती है तो relational database की tables classes में, columns properties में, rows instances में और stored procedures methods में convert कर दिए जाते है।

ORM process perform करने के लिए सबसे पहले आप SQL server से connection establish करते है। SQL server से connect करने के लिए आप Visual Studio Express की View menu से Server Explorer option choose करते है।

LINQ-to-SQL-Connection-1

जब आप Server Explorer option select करते है तो Visual Studio Express की left side में server explorer pane open हो जाता है। इस pane में से आप Data Connections option पर right click करके Add Connection option choose करते है।

LINQ-to-SQL-Connection-2
जब आप Add Connection option पर click करते है तो आपको अलग अलग data sources की list show होती है। इस list में से आप MySQL SQL Server option को choose करते है।
इसके बाद आप next window में आप अपने MySQL server से जुड़े user name और password की information enter करते है और OK button पर click करते है।

यदि आपके द्वारा enter की गयी information सही होती है तो आपका SQL server connect हो जाता है। इसके बाद database tables को OR designer में drag किया जाता है। जैसे ही ऐसा किया जाता है सभी relational elements object oriented types में convert हो जाते है। इसके बाद LINQ के माध्यम से उन पर queries perform की जाती है।

Previous: C# LINQ to XML

C# in Hindi : LINQ to XML

LINQ to XML

LINQ to XML एक programming interface है जिसके द्वारा आप in memory XML documents पर LINQ queries perform कर सकते है। 

XML data को hold और process करने का एक माध्यम है जिसे काफी अधिक use किया जाता है। इसलिए ये जरुरी था की XML documents में available data को query करने के लिए भी एक interface create किया जाए। 
LINQ to XML interface द्वारा XML documents को query करना बहुत ही आसान हो जाता है। क्योंकि यह programming environment में किया जाता है इसलिए आपको किसी प्रकार की technology सिखने की भी आवश्यकता नहीं होती है। 

System.Xml.Linq

अपने program में LINQ to XML operations perform करने के लिए आपको System.Xml.Linq namespace को use करने की आवश्यकता होती है। इस namespace में LINQ to XML queries perform करने के लिए बहुत सी classes provide की गयी है। 
इस namespace को आप अपने program में इस प्रकार include करते है। 
using System.Linq.Xml;

हालाँकि System.Linq.Xml namespace में बहुत सी classes available लेकिन इस tutorial में उन ही classes के बारे में बताया गया है जो basic operations perform करने के लिए महत्वपूर्ण है। 

XElement & XDocument 

किसी भी XML document पर LINQ queries execute करने से पहले आपका उसे memory में load करना आवश्यक होता है।

XElement और XDocument classes आपको System.Xml.Linq namespace में provide की गयी है। इन classes को XML documents को memory में load करने के लिए प्रयोग किया जाता है।

ये दोनों ही classes Load() method provide करती है जो XML document को load करता है। यह method argument के रूप में एक XMLReader object या URL accept करता है जो load की किये जाने वाले document को specify करता है।

इन classes द्वारा XML document को memory में आप इस प्रकार load करते है।

XElement XEobj = XElement.Load(“URL-OF-XML-DOCUMENT”);

OR

XDocument XDobj = XDocument.Load(“URL-OF-XML-DOCUMENT”);

XElement और XDocument classes में फर्क सिर्फ इतना है की XDocument class का object XML declaration, DTD और processing instructions contain कर सकता है।

Elements()

Elements() method XElement और XDocument दोनों ही classes में provide किया गया है। इस method द्वारा आप किसी XML document के सभी elements (tags) को retrieve करते है। 
जैसा की आपको पता है LINQ query के result को सिर्फ IEnumerable<T> object में store किया जा सकता है इसलिए इस method द्वारा return किये गए result को आप IEnumerable<XElement> या IEnumerable<XDocument> objects में store करते है। 
Elements() method द्वारा आप इस प्रकार XML document के elements को प्राप्त करते है। 
IEnumerable<XElement> IEnumObj = XEobj.Elements();

OR

IEnumerable<XDocument> IEnumObj = XDobj.Elements();

Accessing All Elements

एक बार query के result को IEnumerable<T> object में store करने के बाद उसे आप foreach loop द्वारा print कर सकते है। 
किसी IEnumerable<T> object को foreach loop द्वारा इस प्रकार traverse किया जा सकता है। 
foreach(var varName in IEnumObj)
{
     Console.WriteLine(varName);
}
ऊपर दिए गए तरीके से जब आप किसी XML document के elements access करते है तो आपको एक साथ सभी elements की list show होती है।

Accessing Single Element 

यदि आप XML document में से किसी single element को access करना चाहते है तो इसके लिए आप Element() method को use करते है। इस method में उस element का नाम pass किया जाता है जिसे आप access करना चाहते है। यदि आप साथ ही में element की value भी प्राप्त करना चाहते है तो इसके लिए आपको Element() method के बाद dot (.) operator लगाकर value property access करनी होगी। 
For each loop द्वारा किसी XML document के single element को इस प्रकार access किया जा सकता है। 
foreach(var varName in IEnumObj)
{
    Console.WriteLine(varName.Element(“element-name”).Value);
}
इसी प्रकार XElement और XDocument classes में available methods का प्रयोग करके आप दूसरे operations भी perform कर सकते है। इस tutorial में सिर्फ basic operations के बारे में ही बताया गया है।

Example of LINQ to XML

C# में LINQ to XML operations का एक simple उदाहरण निचे दिया जा रहा है। 
using System;
using System.Xml.Linq;
using System.Collections.Generic;

class myClass
{
    static void Main(string[] args)
    {
          XElement XEobj = XElement.load(“d:/Documents/XML/Employees.xml”);

          IEnumerable<XElement> IEnumObj = XEobj.Elements();

          foreach(var myVar in IEnumObj)
          {
               Console.WriteLine(myVar);
          }
    }
}

Employees.xml

<Employees>
<Employee>Jacky</Employee>
<Employee>Watson</Employee>
<Employee>Ganesh</Employee>
<Employee>Pankaj</Employee>
</Employees>
ऊपर दिया गया उदाहरण निचे दिया गया output generate करता है।

<Employee>Jacky</Employee>
<Employee>Watson</Employee>
<Employee>Ganesh</Employee>
<Employee>Pankaj</Employee>

C# in Hindi : Anonymous Method

C# Anonymous Methods

  • Introduction to C# anonymous methods in Hindi
  • Syntax of C# anonymous methods in Hindi
  • Example of C# anonymous methods in Hindi

Introduction to C# Anonymous Methods

एक method को किसी दूसरे method में parameter के रूप में pass नहीं किया जा सकता है। यही reason होता है की इसके लिए delegate का प्रयोग किया जाता है। Delegate object एक wrapper object होता है जिसमें आप method को wrap करते है।

Delegate में method को wrap करने के बाद आप उस delegate object को parameter के रूप में किसी दूसरे method या event आदि को आसानी से pass कर सकते है।

लेकिन यह एक बहुत लम्बी process होती है। इसके लिए आपको अलग से एक method create करके उसे delegate object में wrap करना होता है।

  • सबसे पहले आप delegate create करते है और उसका signature return type आदि define करते है। 
  • इसके बाद आप same signature के साथ एक method define करते है जिसे delegate में wrap किया जाएगा। 
  • इसके बाद delegate का object create किया जाएगा और method को उस delegate object में wrap किया जाएगा। 
इस लम्बी process में आपको delegate, method, delegate object आदि के अलग अलग नाम सोचने होते है और उन्हें आपस में link करना होता है। ऐसे में यदि आप कई अलग अलग signature वाले method को प्रयोग कर रहे है तो आपकी समस्या और भी अधिक बढ़ जाती है। 

इस समस्या के solution के रूप में C# 2.0 में anonymous methods को introduce किया गया है। Anonymous methods delegates के जैसे ही होते है लेकिन जब आप anonymous methods का प्रयोग करते है तो आपको delegate से कम code लिखना पड़ता है।

Anonymous methods regular methods की तरह नहीं होते है। Anonymous methods का कोई नाम नहीं होता है सिर्फ body होती है। Anonymous methods का कोई data type और return type भी नहीं होता है।

जब आप anonymous methods को use करते है तो आपको separate method create नहीं करना पड़ता है। क्योंकि आप method को directly (inline) delegate के साथ combine करके एक ही जगह पर define कर देते है।

Anonymous methods को typically events के साथ use करने के लिए design किया गया है। Events को handlers assign करने के लिए यह एक simplified way है। इसके अलावा anonymous methods से delegates create करना भी आसान हो जाता है।

Anonymous methods के बारे में कुछ महत्वपूर्ण बातें आगे बताई जा रही है।

  • आप किसी anonymous method को explicitly अपने code में नहीं call कर सकते है।
  • Anonymous methods किसी outer method में declare किये गए variable को access कर सकते है।
  • Anonymous methods को ऐसे methods में pass किया जा सकता है जो parameter के रूप में delegate को accept करते है।
  • यदि आप anonymous methods में ऐसे jump statements define करते है जिनका target anonymous method से बाहर है तो compiler error generate करता है। यदि outer code में ऐसा jump statement define किया जाता है जिसका target anonymous method है तो भी error generate होती है।
  • Anonymous methods में outer code के ref और out parameters को नहीं define किया जाता है।
जब inline code implementation की बात आती है तो lambda expression को प्राथमिकता दी जाती है। लेकिन lambda expressions में आप parameter define करते है। Anonymous methods को आप चाहे तो parameters के बिना भी define कर सकते है।
Lambda expressions के बारे में विस्तृत जानकारी के लिए C# Lambda Expressions in Hindi tutorial पढ़े। 

Syntax of C# Anonymous Methods

C# में anonymous methods define करने का general syntax निचे दिया जा रहा है।

delegate(parameters-here){method-body-here}

Anonymous methods को delegate keyword द्वारा define किया जाता है। Parameters define करना optional होता है और ये programmer की need पर depend करता है। Anonymous method की body को curly brackets में define किया जाता है।

हालाँकि Anonymous methods का syntax अलग होता है लेकिन असल में ये normal method की तरह ही behave करते है।  

Example of C# Anonymous Methods

C# में anonymous methods का उपयोग निचे उदाहरण द्वारा समझाया जा रहा है।

using System;

public delegate void myDelegate();

class myClass
{
     static void Main(string[] args)
     {
            myDelegate md = delegate(){Console.WriteLine(“This is printed using anonymous method.”);};

          md();
     }
}

ऊपर दिया गया उदाहरण निचे दिया गया output generate करता है।

This is printed using anonymous method.

C# in Hindi : LINQ to Objects

LINQ to Objects 

LINQ के द्वारा जब in memory objects यानि की collections के लिए query perform की जाती है तो ऐसी queries LINQ to Objects queries कहलाती है। LINQ के द्वारा Array, List और Dictionary आदि collections को query किया जा सकता है।

आप ऐसे किसी भी type को LINQ के द्वारा query कर सकते है जो IEnumerable interface को implement करता है।

हालाँकि LINQ का प्रयोग करके traditional way द्वारा भी data operations perform किये जा सकते है लेकिन उसके लिए बहुत अधिक code लिखने की आवश्यकता होती है।

उदाहरण के लिए यदि आप किसी integer array में से उन numbers को access और show करना चाहते है जो 50 से greater है तो इसके लिए आपको बहुत सारा code लिखने की आवश्यकता होगी। लेकिन LINQ द्वारा यह कार्य एक single query से किया जा सकता है।

एक बात आपको ध्यान रखनी चाहिए की LINQ to Objects query IEnumerable<T> type return करती है। इसलिए उस query के result को IEnumerable<T> type के variable में ही store किया जाना चाहिए।

Syntax of LINQ to Objects Queries

LINQ to Objects queries perform करने का general syntax निचे दिया जा रहा है। 
from <range variable> in <collection-name> standard-query-operator

जैसा की आप ऊपर दिए गए syntax में देख सकते है LINQ to Objects query from operator से start होती है। Range variable वह variable होता है जो collection में items को represent करता है। 

Steps to Perform LINQ to Objects Operations

Objects के साथ LINQ queries perform करने के लिए आप निचे दिए जा रहे steps follow कर सकते है। 
  1. System,  System.Linq और System.Collections.Generic namespaces के लिए using statement define कीजिये। 
  2. Class और Main() method define कीजिये। 
  3. वह collection define कीजिये जिसे आप LINQ द्वारा query करना चाहते है। 
  4. Query के result को hold करने के लिए IEnumerable<T> type का variable create कीजिये। इस variable को create करने के लिए program में System.Collections.Generic namespace include किया जाना आवश्यक है। 
  5. Query लिखिए और उसे IEnumerable<T> type के variable को assign कीजिये। 
    1. Query from operator से start कीजिये। 
    2. From operator के बाद range variable define कीजिये। 
    3. In operator define कीजिये। 
    4. Collection का नाम define कीजिये जिसे आप query करना चाहते है। 
    5. इसके बाद standard query operators के प्रयोग से data query कीजिये।
  6. For each loop के प्रयोग से IEnumerable<T> को traverse कीजिये और results show कीजिये। 

Example of LINQ to Objects

LINQ to Objects queries को निचे उदाहरण द्वारा समझाया जा रहा है। 
using System;
using System.Linq;
using System.Collections.Generic;

class myClass
{
     static void Main(string[] args)
     {
           int[] numbers = {1, 23, 3, 5, 67, 87, 4, 6, 78, 9};

           Console.WriteLine(“Array items are : “);
           foreach(var n in numbers)
           {
               Console.WriteLine(n);
           }

           IEnumerable<int> result = from n in numbers where n>=20 select n;

           Console.WriteLine(“Array items greater than 20 are : “);
           foreach(var x in result)
           {
                Console.WriteLine(x);
           }     
     }
}

ऊपर दिया गया उदाहरण निचे दिया गया output generate करता है।

Array items are :
1
23
3
5
67
87
4
6
78
9
Array items greater than 20 are :
23
67
87
78

C# in Hindi : LINQ Query Operators

LINQ Query Operators 

  • Introduction to LINQ query operators in Hindi
  • Different LINQ query operators in Hindi 

Introduction LINQ Query Operators 

LINQ API data sources के साथ अलग अलग operations जैसे की filtering, sorting आदि perform करने के लिए कुछ standard query operators provide करती है। ये query operators असल में System.Linq.Enumerable और System.Linq.Queryable classes में define किये गए extension methods होते है।

LINQ query define करते समय इन्हें operator के रूप में प्रयोग किया जाता है लेकिन compile time में ये extension methods में convert कर दिए जाते है।

इन operators को इनकी functionalities के आधार पर categories में divide किया गया है। LINQ API में available different standard query operators के बारे में आगे बताया जा रहा है।

Filtering Operators 

ऐसे operators जो data को filter करने के लिए प्रयोग किये जाते है filtering operators कहलाते है। LINQ API निचे दिए जा रहे filtering operators provide करती है। 
  1. where – यह operator data को condition के आधार पर filter करने के लिए प्रयोग किया जाता है। 
  2. OfType –  यह operator data को type के आधार पर filter करने के लिए प्रयोग किया जाता है। 

Sorting Operators

ऐसे operators जिनका प्रयोग data को sort (क्रम में व्यवस्थित करना) करने के लिए किया जाता है sorting operators कहलाते है। LINQ API में available sorting operators के बारे में निचे बताया जा रहा है। 
  1. OrderBy – यह operator data को ascending order में sort करने के लिए प्रयोग किया जाता है। 
  2. OrderByDescending – यह operator data को descending order में sort करने के लिए प्रयोग किया जाता है। 
  3. ThenBy – यह operator OrderBy operator के बाद data पर ascending order में secondary sorting perform करने के लिए प्रयोग किया जाता है। 
  4. ThenByDescending – यह operator OrderBy operator के बाद data पर descending order में secondary sorting perform करने के लिए प्रयोग किया जाता है। 
  5. Reverse – यह operator data को reverse order में लाने के लिए प्रयोग किया जाता है। 

Grouping Operators 

ऐसे operators जो data को group करने के लिए प्रयोग किये जाते है grouping operators कहलाते है। LINQ API में available grouping operators के बारे में निचे बताया जा रहा है।

  1. GroupBy – यह operator items को group में organize करने और IGrouping type को IEnumerable collection के रूप में return करने के लिए प्रयोग किया जाता है। 
  2. ToLookUp – यह operator grouping operation perform करने के लिए प्रयोग किया जाता है जो key pairs return करता है। 

Join Operators 

अलग अलग data sources से एक साथ data access करने के लिए join operators का प्रयोग किया जाता है। LINQ API में available join operators के बारे में निचे बताया जा रहा है। 
  1. Join – यह operator दो sources को key के आधार पर join करके result प्राप्त करने के लिए प्रयोग किया जाता है। 
  2. GroupJoin – यह operator दो sources को join करके elements का group create करने के लिए प्रयोग किया जाता है। 

Projection Operators 

ऐसे operators जो condition के आधार पर value select करके project करने के लिए उपयोग किये जाते है projection operators कहलाते है। LINQ API में available projection operators के बारे में निचे बताया जा रहा है। 
  1. Select – यह operator condition के आधार पर data sources में से items select करके project करने के लिए प्रयोग किया जाता है। 
  2. SelectMany – यह operator condition के आधार पर data sources में से items select करके उन्हें एक single sequence के रूप में project करने के लिए प्रयोग किया जाता है। 

Aggregation Operators

Aggregation operators data पर aggregation perform करने के लिए प्रयोग किये जाते है। LINQ API में available aggregation operators के बारे में निचे बताया जा रहा है। 
  1. Aggregate – यह operator किसी collection की values का sum return करने के लिए प्रयोग किया जाता है। 
  2. Average – यह operator किसी collection की values का औसत return करने के लिए प्रयोग किया जाता है। 
  3. Count – यह operator किसी condition के आधार पर elements को count करने के लिए प्रयोग किया जाता है। 
  4. LonCount – यह operator किसी बड़े collection में condition के आधार पर elements को count करने के लिए प्रयोग किया जाता है। 
  5. Max – यह operator collection में से maximum value select करने के लिए प्रयोग किया जाता है। 
  6. Min – यह operator किसी collection में से minimum value select करने के लिए प्रयोग किया जाता है। 
  7. Sum – यह operator किसी collection में values का sum return करने के लिए प्रयोग किया जाता है। 

Quantifier Operators

Quantifier operators boolean (true or false) value return करते है। यदि data source के elements किसी condition को satisfy करते है तो true value return की जाती है नहीं तो false value return होती है। LINQ API में available quantifier operators के बारे में निचे बताया जा रहा है। 
  1. All – यह operator true return करता है यदि सभी elements किसी condition को satisfy करते है। 
  2. Any – यह operator true return करता है यदि कोई भी element किसी condition को satisfy करता है। 
  3. Contains – यह operator true return करता है यदि किसी element में कोई specific sequence available होती है। 

Element Operators 

Element operators position (index) के आधार पर elements को return करते है। LINQ API में available element operators के बारे में निचे बताया जा रहा है। 
  1. ElementAt – यह operator किसी specific index के element को return करने के लिए प्रयोग किया जाता है। 
  2. ElementAtOrDefault – यह operator किसी specific index के element को return करने के लिए प्रयोग किया जाता है। यदि index out of range हो तो यह operator default value return करता है। 
  3. First – यह operator किसी collection में से first element को या किसी condition को fulfil करने वाले first element को return करने के लिए प्रयोग किया जाता है। 
  4. FirstOrDefault – यह operator किसी collection में से first element को या किसी condition को fulfil करने वाले first element को return करने के लिए प्रयोग किया जाता है। यदि first element available नहीं होता है तो यह operator default value return करता है। 
  5. Last – यह operator किसी collection में से last element या किसी condition को fulfil करने वाले last element को return करने के लिए प्रयोग किया जाता है। 
  6. LastOrDefault – यह operator Last operator की तरह ही होता है लेकिन यदि last element नहीं मिलता है तो यह operator एक default value return करता है। 
  7. Single – यह operator collection में से अकेला element return करने के लिए प्रयोग किया जाता है। 
  8. SingleOrDefault – यह operator Single operator की तरह ही होता है लेकिन यदि कोई अकेला element नहीं मिलता है तो यह operator default value return करता है। 

Set Operators 

वे operators जो set operations perform करने के लिए प्रयोग किये जाते है set operators कहलाते है। LINQ API में available set operators निचे दिए जा रहे है। 
  1. Distinct – यह operator collection में से duplicate values को remove करके unique values return करता है। 
  2. Except – यह operator दो collection की values को compare करता है और उन values को return करता है जो दूसरे set में नहीं है। 
  3. Intersect – यह operator दो collection में से identical (समान) values को return करता है। 
  4. Union – यह operator दो collections के elements को combine करके एक नया collection form करता है जिसके सभी elements unique होते है। 

Partitioning Operators 

Input sequence को दो sections में divide करके उनको return करने के लिए partitioning operators का प्रयोग किया जाता है। LINQ API में available partitioning operators के बारे में निचे दिया जा रहा है। 
  1. Skip – यह operator किसी sequence में specified number of elements को छोड़कर बाकि के elements को return करने के लिए प्रयोग किया जाता है। 
  2. SkipWhile –  यह operator Skip operator की तरह होता है लेकिन कितने elements छोड़ने है यह boolean condition द्वारा निर्धारित किया जाता है। 
  3. Take – यह operator specified number of elements को return करता है और बाकि के elements को छोड़ देता है। 
  4. TakeWhile – यह operator Take operator की तरह ही होता है लेकिन कितने number of elements return करने है यह boolean condition द्वारा निर्धारित किया जाता है। 

Concatenation Operators  

दो collections या sequences के बीच concatenation perform करने के लिए concatenation operators का प्रयोग किया जाता है। ये operators duplicate values को remove नहीं करते है। LINQ API में available concatenation operators के बारे में निचे बताया जा रहा है। 
  1. Concat – दो collections या sequences को combine करके एक नया collection या sequence form करने के लिए इस operator का प्रयोग किया जाता है। 

Equality Operators 

दो sequences को compare करके check करने के लिए की वे समान है या नहीं equality operators प्रयोग किये जाते है। LINQ API में available equality operators के बारे में निचे दिया जा रहा है। 
  1. SequenceEqual – यदि दो sequences एक दूसरे के समान होती है तो यह operator true value return करता है। 

Generation Operators 

Values की नयी sequence create करने के लिए generation operator का प्रयोग किया जाता है। LINQ API में available generation operators के बारे में निचे दिया जा रहा है। 
  1. DefaultIfEmpty – जब यह operator किसी empty sequence पर apply किया जाता है तो उस sequence में यह operator default element generate करता है। 
  2. Empty – यह operator values की empty sequence return करता है। 
  3. Range – यह operator एक numbers या integers का collection generate करने के लिए प्रयोग किया जाता है। 
  4. Repeat – यह operator specific length की repeated values वाली sequence generate करने के लिए प्रयोग किया जाता है। 

Conversion Operators 

Objects का type change करने के लिए conversion operators का प्रयोग किया जाता है। LINQ API में available conversion operators के बारे में निचे दिया जा रहा है।

  1. AsEnumerable – यह operator type किये गए input को IEnumerable के रूप में return करता है। 
  2. AsQueryable – यह operator एक IEnumerable को एक IQueryable में convert करने के लिए प्रयोग किया  जाता है। 
  3. Cast – किसी collection के elements को specified type में cast करने के लिए यह operator प्रयोग किया जाता है। 
  4. ToArray – यह operator किसी collection को array में convert करने के लिए प्रयोग किया जाता है। 
  5. ToDictionary –  यह operator किसी collection को Dictionary में convert करने के लिए प्रयोग किया जाता है। 
  6. ToList – यह operator किसी collection को List में convert करने के लिए प्रयोग किया जाता है। 

C# in Hindi : LINQ

C# LINQ (Language Integrated Query)

  • Introduction to C# LINQ in Hindi 
  • Advantages of C# LINQ in Hindi
  • Categories of C# LINQ in Hindi

Introduction to C# LINQ (Language Integrated Query)

LINQ एक Language Integrated Query mechanism है जिसे .NET framework के version 3.5 में introduce किया गया था।

LINQ के द्वारा आप programming language syntax use करते हुए different data sources जैसे की कोई भी collection of objects, SQL server databases, XML Documents और ADO .NET datasets आदि से data के लिए query कर सकते है।

जैसा की आपको पता data अलग अलग sources में पाया जाता है जैसे की databases, XML documents और web services आदि। इस data से interact करने के लिए आपको इन platform से सम्बंधित technology सीखनी पड़ती है।

उदाहरण के लिए यदि आप SQL server database से data access करना चाहते है तो इसके लिए आपको SQL (Structured Query Language) सीखने की आवश्यकता होगी। इसी प्रकार अलग अलग platforms के data से interact करने के लिए programmer को अलग अलग technologies को सीखने की आवश्यकता होती है।

लेकिन C# आपको LINQ (Language Integrated Query) mechanism provide करती है जिसे use करने के लिए आपको किसी प्रकार की नयी technology को सिखने की आवश्यकता नहीं होती है।

क्योंकि LINQ language integrated है यानी की LINQ mechanism C# language keywords के द्वारा कार्य करता है जो programmer द्वारा पहले से ही सीखे जा चुके होते है। LINQ mechanism programming language और different data source platforms के बीच एक bridge का कार्य करता है।

यदि आसान शब्दों में कहा जाए तो LINQ SQL की ही तरह एक query mechanism है लेकिन LINQ different data sources के साथ कार्य कर सकता है और इसके लिए आपको कोई नयी language या technology सिखने की आवश्यकता नहीं होती है। क्योंकि LINQ normal C# keywords और कुछ query operators द्वारा बनी हुई queries से operate करता है।

LINQ को implement करने के लिए C# System.Linq namespace provide करती है। इस namespace में provide की गयी classes और methods द्वारा आप LINQ को अपने program में implement कर सकते है।

एक बात आपको हमेशा ध्यान रखनी चाहिए की LINQ mechanism हमेशा objects के साथ कार्य करता है। कोई भी group of objects जो memory में है जैसे की arrays और different collections आदि उनके साथ आप LINQ को प्रयोग कर सकते है।

ऐसी classes जो IEnumerable और IQueryable interface को implement करती है उनके साथ ही LINQ mechanism कार्य कर सकता है।

Working of LINQ 

जब एक LINQ query execute होती है तो वह data source को भेजी जाती है। Data source उस query को अपने according convert करता है। Convert करने के बाद वह query execute की जाती है। इसके बाद उस query के result को एक object का रूप दिया जाता है। इसके बाद यह object उस code को return किया जाता है जिसके द्वारा query execute की गयी थी। 
उदाहरण के लिए जब आप एक LINQ to SQL query execute करते है तो LINQ query SQL server को भेजी जाती है। SQL server LINQ query को SQL में convert करके execute करता है। इसके बाद SQL server query के result को object के रूप में return करता है। 
यह process in memory objects पर apply नहीं होती है। 

Advantages of LINQ

निचे LINQ (Language Integrated Query) mechanism की कुछ advantages बतायी जा रही है।

  1. Programmers को अलग अलग data sources के लिए अलग से किसी प्रकार की query language या technology को सिखने की आवश्यकता नहीं होती है। 
  2. LINQ के प्रयोग से आप बहुत ही कम code द्वारा data sources पर complex data operations perform कर सकते है। 
  3. जब आप LINQ का प्रयोग करते है तो एक common syntax द्वारा अलग अलग data sources के साथ interact कर पाते है। 
  4. LINQ के प्रयोग से आप एक single query द्वारा multiple data sources से data retrieve कर सकते है। 
  5. LINQ mechanism IntelliSense support provide करता है जिससे queries लिखना और भी आसान और fast हो जाता है। 
  6. जब आप LINQ को use करते है तो errors compile time पर ही detect हो जाती है। 
  7. LINQ mechanism debugging के लिए भी support provide करता है। 

Categories of LINQ Queries 

LINQ को 4 categories में divide किया गया है। ये categories अलग अलग data sources के साथ perform की गयी queries के अनुसार create की गयी है।

  1. LINQ to Objects – जब in memory objects जैसे की array और collections आदि के लिए LINQ query perform की जाती है तो वह LINQ to Objects category में आती है। LINQ to Objects category की queries perform करने के लिए System.Linq namespace को use किया जाता है। 
  2. LINQ to XML – जब XML data sources के लिए LINQ query perform की जाती है तो वह LINQ to XML category में आती है। LINQ to XML category की queries perform करने के लिए System.Xml.Linq namespace को use किया जाता है। 
  3. LINQ to SQL – जब SQL databases के लिए LINQ query perform की जाती है तो वह query LINQ to SQL category में आती है। LINQ to SQL category की queries perform करने के लिए System.Data.Linq namespace को use किया जाता है। 
  4. LINQ to DataSet – ADO .NET Data sets के लिए perform की गयी Queries LINQ to DataSet category में आती है। इस category की queries perform करने के लिए System.Data.Linq namespace use किया जाता है।  

LINQ queries perform करने के लिए कुछ special query operators का प्रयोग किया जाता है। इन operators को IEnumerable और IQueryable classes में define किया गया है।

Previous: C# Anonymous Methods
Next: C# LINQ Query Operators

C# in Hindi : Thread Synchronization

C# Thread Synchronization 

  • Introduction to C# thread synchronization in Hindi
  • C# lock keyword in Hindi
  • Example of C# thread synchronization in Hindi

Introduction to C# Thread Synchronization 

Thread Synchronization एक mechanism है जिसके द्वारा programmers यह सुनिश्चित करते है की किसी resource को एक बार में एक से अधिक threads access ना कर सके।

जब आप multithreading implement करते है तो कई threads एक साथ execute होती है और available resources जैसे की memory, CPU, network connection, files आदि को share करती है। इसे multithreading में resource sharing कहा जाता है।

हालाँकि resource sharing बहुत उपयोगी feature है। लेकिन कई बार एक programmer के रूप में आपके सामने ऐसी situations भी आ जाती है जब आप चाहते है की कोई resource एक बार में सिर्फ एक ही thread द्वारा प्रयोग किया जाए।


उदाहरण के लिए यदि कई threads एक साथ एक file को access और modify करने का प्रयास करती है तो उस situation में उस file का data corrupt होना पूर्णतः संभव है। ऐसी situation में यह आवश्यक है की threads में आपस में coordination हो।

यदि ऐसा नहीं होता है तो कई threads एक समय पर एक ही resource को access करेगी जिससे conflict होने की सम्भावना बढ़ जाती है। इससे data corrupt हो सकता है और application की performance पर भी इसका नकारात्मक असर पड़ सकता है।

ऐसी ही situations को handle करने के लिए C# आपको thread synchronization mechanism provide करती है। Thread synchronization द्वारा आप उस code को lock कर देते है जो resource को access और modify करने के लिए execute किया जाता है। इससे उस code को एक बार में एक ही thread execute कर पाती है।

C# lock Statement 

C# में thread synchronization lock statement द्वारा implement किया जाता है। Lock statement में आप वह code लिखते है जो एक बार में एक ही thread द्वारा execute किया जाना चाहिए।

Lock statement में लिखा गया code दूसरी threads द्वारा interrupt नहीं किया जा सकता है जब तक की current thread का execution complete नहीं हो जाता है। दूसरी threads तब तक के लिए wait करती है।

Lock statement को lock keyword द्वारा define किया जाता है। इसका general syntax निचे दिया जा रहा है।

lock(object-to-synchronize)
{
      //code here…
}

जैसा की आप ऊपर दिए गए syntax में देख सकते है lock statement में argument के रूप में एक object pass किया जाता है। यह वह object होता है जिस पर lock statement द्वारा lock implement किया जाता है। यह उस class का object होता है जो उस code को represent करती है जिसे multiple threads execute करने का प्रयास कर रही है।

lock statement के curly brackets में वह code define किया जाता है जो multiple threads द्वारा execute किया जाएगा।

Example of C# Thread Synchronization

C# में thread synchronization implement करना निचे उदाहरण द्वारा समझाया जा रहा है।

using System;
using System.Threading;

class seriesPrint
{
     public void sPrint()
     {
          lock(this)
          {
                 for(int i=1;i<=10;i++)
                 {
                       Thread.Sleep(100);
                       Console.WriteLine(i);
                 }
          }
     }
}

class ThreadSynDemo
{
      static void Main(string[] args)
      {
             seriesPrint obj = new seriesPrint();
             Thread t1 = new Thread(new ThreadStart(obj.sPrint));
             Thread t2 = new Thread(new ThreadStart(obj.sPrint));

             t1.Start();
             t2.Start();
      }
}

ऊपर दिया गया उदाहरण निचे दिया गया output generate करता है।

1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10

Previous: C# Multithreading
Next: C# Anonymous Methods

C# in Hindi : Multithreading

C# Multithreading

  • Introduction to C# multithreading in Hindi 
  • C# System.Threading.Thread class in Hindi
  • Example of C# multithreading in Hindi

Introduction to C# Multithreading

Multithreading ऐसी programming technique है जिसमें multiple threads का प्रयोग करते हुए कई code blocks को एक साथ execute किया जाता है।

Thread एक execution path होती है जो आपके program को operating system से connect करने के लिए और उसके resources (CPU आदि) का प्रयोग करने के लिए provide की जाती है।

Normally जब आप एक C# program execute करते है तो वह एक thread के द्वारा ही execute होता है। यह thread CLR द्वारा program को run करने से पूर्व create की जाती है। इसे main thread कहा जाता है।

ऐसी applications जो सिर्फ एक ही thread के द्वारा execute होती है वे single threaded applications कहलाती है। Single threaded applications का drawback यह होता है की उनमें एक task के complete होने पर ही दूसरा task execute हो सकता है।

लेकिन कई बार आपको एक से अधिक tasks एक साथ execute करने की आवश्यकता हो सकती है। ऐसे में आप multithreading का प्रयोग कर सकते है। Multithreading technique द्वारा अपने program में एक से अधिक threads create करके आप अलग अलग code blocks को (अलग अलग execution paths के द्वारा) एक साथ execute कर सकते है।

Main thread के अलावा आप जो threads create करते है वे child threads कहलाती है। यदि main thread का execution complete हो जाता है तो वह terminate होने से पहले child threads का execution complete होने तक wait करती है।

Thread Class

C# में multithreading implement करने के लिए Threading namespace provide किया गया है। इस namespace में कई classes, structs, delegates, Enumerators और interfaces provide किये गए है जिनके द्वारा multithreading implement करना आसान होता है।

अपने program में multithreading implement करने के लिए आपको इस namespace को शुरआत में include करना होता है। इसका syntax निचे दिया जा रहा है।

using System.Threading;

Threading namespace में provide की गयी Thread class सबसे महत्वपूर्ण है। इस class का object create करके ही आप threads create करते है। यह class threads को manage करने के लिए कई methods और properties provide करती है।

Thread class में provide किये गए सर्वाधिक प्रयोग होने वाले कुछ methods के बारे में निचे बताया जा रहा है।

  1. Start() – यह method thread को start करने के लिए प्रयोग किया जाता है। इस method को thread class के object के साथ call किया जाता है। 
  2. Sleep() – यह method thread को कुछ समय के लिए pause करने के लिए प्रयोग किया जाता है। इस method में समय miliseconds के रूप में pass किया जाता है। 
  3. Suspend() – इस method का प्रयोग thread को suspend करने के लिए किया जाता है। यदि कोई thread पहले से ही suspended state में है तो इस method का कोई effect नहीं होता है। Suspend की गयी thread को दुबारा resume किया जा सकता है। 
  4. Abort() – इस method का प्रयोग किसी thread को abort करने के लिए किया जाता है। इस method में आप argument के रूप में string message pass करते है जो thread के abort होने के कारण के रूप में show किया जा सकता है। 
  5. Resume() – इस method का प्रयोग किसी suspend की गयी thread को resume करने के लिए किया जाता है। 
  6. Join() – इस method का प्रयोग किसी thread को दूसरी thread के साथ जोड़ने के लिए किया जाता है। ऐसा करने से जब तक वह thread finish नहीं हो जाती दूसरी thread block कर दी जाती है। 
जैसा की मैने पहले बताया Thread class में properties भी provide की गयी है। कुछ useful properties के बारे में निचे बताया जा रहा है।

  1. isAlive – यदि thread alive (running) है तो इस property की value true होती है। 
  2. isBackground – इस property के द्वारा thread को background property के रूप में set किया जा सकता है। इसके अलावा इस property के द्वारा यह भी पता लगाया जाता है की कोई thread background है या नहीं। 
  3. Name – इस property के द्वारा thread का नाम get (access) और set किया जाता है। 
  4. Priority – इस property के द्वारा आप thread की priority get और set कर सकते है।  
  5. ThreadState – यह property thread की current state को describe करती है। एक thread un-started, runnable, running, not runnable और dead में से किसी state में हो सकती है।  

Creating & Managing Threads

C# में thread create करने के लिए Thread class का object create किया जाता है। Thread class का हर object एक separate thread को represent करता है।

C# में thread create करने का general syntax निचे दिया जा रहा है।

Thread thread-obj-name = new Thread(ThreadStart-class-reference);

जैसा की आप ऊपर दिए गए syntax में देख सकते है Thread class का object create करते समय उसमे argument के रूप में ThreadStart class का reference pass किया जाता है। यह reference उस function को point करता है जो उस thread के start होने पर execute किया जाएगा।

ThreadStart class का reference pass करने का general syntax निचे दिया जा रहा है।

new ThreadStart(function-name);

जैसा की आप ऊपर दिए गए syntax में देख सकते है ThreadStart Class का reference directly new keyword के प्रयोग से pass किया जाता है। यह reference pass करने की shorter form होती है। आप चाहे तो ThreadStart class का object create करके उसमे function pass करके उस object को Thread class का object create करते समय pass कर सकते है।

लेकिन ऐसा करने से आपको ThreadStart class के अलग से objects create करने होंगे जिससे code काफी lengthy हो जाएगा। इसलिए आपको हमेशा इस shorter form को ही use करना चाहिए। इसे आसानी से Thread class object create करते समय pass किया जा सकता है।

इस reference में उस function का नाम pass किया जाता है जो thread के start होने पर execute किया जाएगा।

अलग अलग threads को create करते समय आप अलग अलग functions के नाम उनमें pass करते है। इन functions को normal functions की तरह ही create किया जाता है। इन functions में आप वह code लिखते है जो किसी particular thread द्वारा execute किया जाएगा।

इस प्रकार start होने पर अलग अलग threads द्वारा अलग अलग functions call किये जाते है जो अलग अलग tasks perform करते है।

Thread class का object create करने के बाद thread को start करना होता है। Thread को start करने के लिए Thread object से start() method call किया जाता है। इसका syntax निचे दिया जा रहा है।

thread-obj-name.Start();

Thread को start करने के बाद उसके execution को आप Thread class द्वारा provide किये गए methods द्वारा manage कर सकते है।

Steps to Create a Multithreaded Program

एक multithreaded program create करने की step by step process निचे दी जा रही है। 
  1. System और System.Threading namespaces के लिए using statement define कीजिये। 
  2. Class और Main() method define कीजिये। 
  3. Methods define कीजिये जो विभिन्न threads के शुरू होने पर execute होंगे। इन methods में आप main functionality के अलावा threads को control करने के लिए sleep(), Suspend() आदि methods भी प्रयोग कर सकते है। 
  4. आप जितनी threads program में create करना चाहते है उतने Thread class के object create कीजिये। 
  5. Threads को start करने के लिए हर Thread objects के साथ Start() method call कीजिये। 

Example of C# Multithreading 

C# में multithreading के उपयोग को निचे उदाहरण द्वारा समझाया जा रहा है।

using System;
using System.Threading;

class threadDemo
{
     static void Main(string[] args)
     {
       
          Thread t1 = new Thread(new ThreadStart(ThreadFunc));

          Thread t2 = new Thread(new ThreadStart(ThreadFunc));
     
          t1.Start();
          t2.Start();
     }

     public static void ThreadFunc()
     {
          for(int i=1;i<=10;i++)
          {
               Thread.Sleep(100);
               Console.WriteLine(i);
          }
     }

}

ऊपर दिया गया उदाहरण निचे दिया गया output generate करता है।

1
1
2
2
3
3
4
4
5
5
6
6
7
7
8
8
9
9
10
10
Previous: C# Unsafe Code

C# in Hindi : Unsafe Code

C# Unsafe Code

  • Introduction to C# unsafe code in Hindi
  • C# pointers in Hindi
  • Example of C# unsafe code in Hindi

Introduction to C# Unsafe Code 

C# में जो code memory को directly access करता है वह unsafe code कहा जाता है। Unsafe code की वजह से program में memory leaks create होते है। Memory leaks की वजह से आपकी application attacks और threats के प्रति सुरक्षित नहीं रहती है।

Unsafe code सामान्य code से अलग होता है। Normally जब भी आप कोई program लिखते है तो वह CLR द्वारा manage और execute किया जाता है। CLR ही memory management, type verification और garbage collection जैसे tasks के लिए responsible होता है।

लेकिन unsafe code CLR (Common Language Runtime) द्वारा run और manage नहीं किया जाता है। CLR में unsafe code के लिए कोई specification available नहीं होती है इसलिए CLR unsafe code को verify नहीं करता है। यही कारण है की unsafe code को unmanaged code भी कहा जाता है।

यदि आप अपने program में unsafe code का प्रयोग करते है तो उसे manage (memory allocation, casting, memory release आदि) करना आपकी जिम्मेदारी होती है। इसके अलावा unsafe code की वजह से generate होने वाले security issues के लिए भी आप ही (programmers) जिम्मेदार होते है।

Unsafe code का सबसे popular उदाहरण pointers है। Pointers memory को directly access करते है इसलिए pointers को C# में unsafe माना जाता है।

Pointers के alternative के रूप में C# references provide करती है। References की वजह से C# दूसरी programming languages जैसे की C और C++ आदि से अधिक सुरक्षित हो जाती है।

C# में un-initialised variable, pointer आदि code जो memory को असुरक्षित बनाते है, नहीं define किये जा सकते है। इस तरह के codes द्वारा generate होने वाली bugs जो C और C++ जैसी programming languages में आम बात है C# में eliminate कर दी गयी है।

हालाँकि unsafe code आपकी application को असुरक्षित बनाता है लेकिन कई बार programmer के लिए unsafe code create करना अतिआवश्यक हो जाता है। उदाहरण के लिए यदि आप operating system की memory को manage करना चाहते है तो इसके लिए आपको unsafe code लिखना ही होगा।

ऐसी situations के लिए C# में unsafe context introduce किया गया है। जब भी आप कोई ऐसा code लिखते है जो unsafe है तो उसे unsafe context में लिखते है।

Unsafe context से मतलब है की आप compiler को बताते है की code unsafe है।

unsafe Modifier 

Unsafe context में code define करने के लिए unsafe modifier का प्रयोग किया जाता है। इस modifier के प्रयोग से आप methods, types और दूसरे code blocks को unsafe define करते है। 
उदाहरण के लिए आपकी एक class है जिसमे आप unsafe code प्रयोग करते है तो उस class को आप इस modifer द्वारा इस प्रकार define करेंगे।  
unsafe class myClass
{
     //unsafe code here…
}

/unsafe Compiler Option

Unsafe code को सामान्य code की तरह compile नहीं किया जाता है। Unsafe code को compile करने के लिए /unsafe compiler option का प्रयोग किया जाता है। 
उदाहरण के लिए यदि आपके program का नाम myProgram है तो आप उसे इस प्रकार compile करेंगे।

csc /unsafe myProgram.cs

यदि आप application development के लिए Visual Studio Express IDE का प्रयोग कर रहे है तो यह option आपको manually enable करना होगा। By default unsafe code का option disable रहता है।

Unsafe code compilation को enable करने के लिए आप project properties window से build tab select करते है। Build select करने के बाद आप Allow unsafe code को select करके compiler द्वारा unsafe code compilation को enable कर सकते है।

C# Pointers

Pointer variable एक ऐसा variable होता है जो किसी दूसरे variable का memory address store करता है। एक pointer variable किसी memory को directly point करता है। Pointer variable द्वारा किसी memory address पर store की गयी value को access और manipulate किया जा सकता है। 

Declaring Pointers 

C# में pointers declare करने का general syntax निचे दिया जा रहा है। 
data-type * pointer-var-name;

  • data-type – एक pointer variable का data type और उसके द्वारा जिस variable का memory address store किया जाता है दोनों same होने चाहिए। 
  • * (asterisk) – एक pointer variable * (asterisk) द्वारा define किया जाता है। Asterisk (*) को data type के बाद और pointer variable name से पहले define किया जाता है। 
  • pointer-var-name – Pointer variable का नाम किसी भी normal variable की तरह होता है। 

Pointer define करने के लिए ऊपर दिया गया तरीका आपको तब प्रयोग करना चाहिए जब आप class या main method को unsafe modifier द्वारा define करते है।

यदि आपने class या main method को unsafe नहीं declare किया है तो आप pointers define करने के लिए unsafe block define कर सकते है। इसका syntax निचे दिया जा रहा है। 

unsafe
{
     data-type * pointer-var-name;
}
Pointer से related हर statement unsafe block में ही define किया जाना चाहिए।

Initializing Pointers 

एक pointer variable की value किसी दूसरे variable का address होती है। Pointer variable के अंदर दूसरे variable का address store करने के लिए address of (&) operator का प्रयोग किया जाता है। उस variable को पहले declare किया जाता है जिसका address आप pointer variable में store करना चाहते है। 
Pointer variable को initialize करने का general syntax निचे दिया जा रहा है। 
pointer-var-name = & normal-variable-name;

Accessing Pointer Variables

जब आप एक pointer variable की value को directly print करने का प्रयास करते है तो उस variable का memory address print होता है जिससे आपने pointer variable को initialize किया था।

यदि आप pointer variable द्वारा point की गयी memory location पर store की गयी value को access करना चाहते है तो इसके लिए आपको value-at (*) operator को use करना होता है। इस operator को pointer variable से पूर्व value access करने के लिए प्रयोग किया जाता है। 

Example of C# Unsafe Code 

C# में unsafe code का प्रयोग निचे उदाहरण द्वारा समझाया जा रहा है। 
using System;

unsafe class myClass
{
    static void Main(string[] args)
    {
         int Age = 40;

         int *pAge = &Age;

         Console.WriteLine(*pAge);
    }
}

ऊपर दिया गया उदाहरण निचे दिया गया output generate करता है।

40

C# in Hindi : Reflection

C# Reflection

  • Introduction to C# reflection in Hindi
  • Syntax of C# reflection in Hindi
  • Example of C# reflection in Hindi

Introduction to C# Reflection

C# Reflection API आपको runtime के दौरान program elements को inspect और manipulate करने की ability provide करती है।

Reflection के द्वारा आप किसी assembly के बारे में सम्पूर्ण जानकारी प्राप्त कर सकते है। C# में assembly वह file होती है जो आपके project या application को represent करती है। यह file compiler द्वारा successful compilation पर automatically generate की जाती है।

Assembly file में ही आपके program के सभी Modules, namespaces, classes, methods आदि elements होते है। Reflection API आपको किसी assembly के metadata का access provide करती है। Reflection के द्वारा नयी assembly create और compile भी की जा सकती है।

Assembly file में available दूसरे program elements जैसे की class, interface, struct, delegate और methods आदि के बारे में भी Reflection द्वारा जानकारी प्राप्त की जा सकती है।

Reflection उन situations में महत्वपूर्ण है जब आप किसी ऐसी application के बारे में जानकारी प्राप्त करना चाहते हो जो आपने create नहीं की है या जिसके elements के बारे में आपको कोई भी जानकारी नहीं है। उदाहरण के लिए आप किसी दूसरे programmer द्वारा create की गयी किसी application को reflection द्वारा inspect कर सकते है।

System.Reflection

C# में reflection API System.Reflection namespace द्वारा represent की गयी है। इस namespace में ऐसी बहुत सी classes, methods और properties available है जिनके द्वारा आप किसी type के members को enumerate कर सकते है, नए objects instantiate कर सकते है, किसी class पर apply किये गए custom attributes को inspect कर सकते है और किसी object के members को भी execute कर सकते है।

System.Reflection namespace में available कुछ महत्वपूर्ण classes के बारे में निचे detail से बताया जा रहा है।

Assembly 

यह class programmers द्वारा assemblies को load और explore करने के लिए उपयोग की जाती है। इस class का object create करके आप assembly में available program elements को देख सकते है। 
किसी assembly को load करने के लिए इस class में Load() method provide किया गया है। इस method में assembly file का नाम pass किया जाता है। इस class के LoadFile() और LoadFrom() methods के द्वारा भी किसी assembly को load किया जा सकता है। 
Assembly class का getTypes() method किसी assembly में available सभी types (class, struct, enum और delegate) आदि की list return करता है। किसी particular type को search करने के लिए getType() method use किया जा सकता है। 

Module 

एक Module portable executable file होती है। ये file .dll या exe extension के द्वारा defined होती है। एक module में कई namespaces हो सकते है। किसी assembly file में कई modules हो सकते है जिनमे अलग अलग namespaces हो सकते है।

Module class के getTypes(), getMethods() और getFields() आदि methods का प्रयोग करके आप Module में available types, method और fields के बारे में जानकारी extract कर सकते है।

MethodInfo 

यह class किसी type के method को represent करती है। किसी object के methods की जानकारी प्राप्त करने के लिए आप MethodInfo class का object create करके available methods को use कर सकते है। 
Methods के parameters और return type की information के लिए आप GetParameters() method और ReturnParameter, ReturnType आदि properties को उपयोग कर सकते है। 

ConstructorInfo 

यह class किसी constructor के attributes को discover करने या constructors को invoke करने के लिए प्रयोग की जाती है। Class में available constructors की list प्राप्त करने के लिए getConstructors() या getConstructor() method का प्रयोग किया जाता है। 

MemberInfo 

यह class किसी member के attributes और metadata के बारे में जानकारी access करने के लिए उपयोग की जाती है। यह एक abstract class होती है और दूसरी classes द्वारा class के सभी members (constructors, events, fields, methods, properties आदि) के बारे में जानकारी access करने के लिए use की जाती है। 
इस class का object create करके आप सभी members के बारे में information extract कर सकते है। 

ParameterInfo

किसी parameter का data type, default value आदि जानकारी प्राप्त करने के लिए आप ParameterInfo class का object use कर सकते है।

इस class का GetParameters() method किसी method के सभी parameters की list array के रूप में return करता है।

Type

Type class System.Reflection namespace में एक main functionality है। यह class meta data को access करने का primary way है। इस class को आप किसी type के members (constructors, methods, properties आदि) के type declaration के बारे में जानकरी प्राप्त करने के लिए प्रयोग कर सकते है। 
Type एक abstract class है। इसलिए इसमें available methods को use करने के लिए आपको इसे inherit करने की आवश्यकता होती है। यह class निचे दिए जा रहे methods provide करती है।

  • GetConstructors()
  • GetProperties()
  • GetMethods()
  • GetEvents()
  • GetInterfaces()
  • GetMembers()
  • GetEvents() 

FieldInfo

यह class field के attributes और meta data का access provide करती है। इस class का कोई public constructor नहीं होता है। इस class का object प्राप्त करने के लिए Type object पर getFields() या getField() method call किया जाता है। 
Fields class में define किये गए variables होते है। FieldInfo class fields के बारे में metadata provide करने के साथ साथ fields के लिए dynamic set और get functionality provide करती है।

EventInfo

यह class event attributes और event metadata का access provide करती है। इस class को events को inspect करने और event handlers से जोड़ने के लिए use किया जा सकता है। 
EventInfo class विभिन्न properties और methods provide करती है जिनकी मदद से आप events के बारे में सम्पूर्ण जानकारी प्राप्त कर सकते है। लेकिन एक बात आपको ध्यान रखनी चाहिए की इस class द्वारा आप events नहीं raise कर सकते है। 

PropertyInfo

यह class property attributes और properties का metadata access करने के लिए प्रयोग की जाती है। यह एक abstract class है। जब आप इसे inherit करते है तो इसके GetValue(), SetValue(), GetAccessors() आदि methods को override करना आवश्यक होता है।

Example of C# Reflection

C# में reflection को निचे उदाहरण द्वारा समझाया जा रहा है। 
using System;
using System.Reflection;

class myClass
{
    public string FirstName
    {
          get; set;
    } 

    public string LastName
    {
          get; set;
    }

   static void Main(string[] args)
   {
         Type type = typeof(myClass);

         PropertyInfo[] propinfo = type.GetProperties();
       
         foreach(var item in propinfo)
         {
              Console.WriteLine(item);
         }
   }
}

ऊपर दिया गया उदाहरण निचे दिया गया output generate करता है।

System.String FirstName
System.String LastName
Previous: C# Collections