Tuesday, June 24, 2025

FFmpeg Tips for Audio and Video

You can easily divide or cut an MP4 video based on timelines using FFmpeg. FFmpeg is a powerful command-line tool for handling multimedia files.

Here’s how to do both of your cases:

Before You Start:

·         Install FFmpeg: If you don’t have FFmpeg installed, you’ll need to do that first. You can find instructions for your operating system on the official FFmpeg website or by searching online (e.g., “install ffmpeg windows,” “install ffmpeg mac,” “install ffmpeg ubuntu”).

·         Understand Timestamps: FFmpeg uses timestamps in HH:MM:SS or SS (seconds) format. For example, 00:01:30 is 1 minute and 30 seconds, and 90 is also 1 minute and 30 seconds.


Case 1: Divide into two parts at a point of time

Let’s say you want to split a video input.mp4 at 00:05:00 (5 minutes) into two files: part1.mp4 and part2.mp4.

Command for Part 1 (from beginning to the split point):

ffmpeg -i input.mp4 -ss 00:00:00 -to 00:05:00 -c copy part1.mp4

  • ·         -i input.mp4: Specifies your input video file.
  • ·         -ss 00:00:00: Starts the extraction from the beginning of the video. (You can omit this if you want to start from the very beginning, but it’s good for clarity).
  • ·         -to 00:05:00: Specifies the end point of the extraction. The video will be cut up to this timestamp.
  • ·         -c copy: This is crucial! It tells FFmpeg to copy the video and audio streams directly without re-encoding them. This makes the process extremely fast and avoids any quality loss.

Command for Part 2 (from the split point to the end):

ffmpeg -i input.mp4 -ss 00:05:00 -c copy part2.mp4

  • ·         -i input.mp4: Specifies your input video file.
  • ·         -ss 00:05:00: Specifies the start point of the extraction. The video will be cut from this timestamp.
  • ·         -c copy: Again, use copy to avoid re-encoding.

Example for a specific point in time (e.g., 1 minute 30 seconds):

ffmpeg -i your_video.mp4 -ss 00:00:00 -to 00:01:30 -c copy first_part.mp4

ffmpeg -i your_video.mp4 -ss 00:01:30 -c copy second_part.mp4


Case 2: Get a segment of video given two point of times

Let’s say you want to extract a segment of input.mp4 from 00:01:00 (1 minute) to 00:03:30 (3 minutes 30 seconds) into a new file segment.mp4.

Command:

ffmpeg -i input.mp4 -ss 00:01:00 -to 00:03:30 -c copy segment.mp4

  • ·         -i input.mp4: Specifies your input video file.
  • ·         -ss 00:01:00: Specifies the start point of the segment.
  • ·         -to 00:03:30: Specifies the end point of the segment.
  • ·         -c copy: Uses stream copy for speed and quality preservation.

Alternative using -t (duration) instead of -to (end time):

You can also specify the duration of the segment using -t. The duration is calculated from the -ss (start) point.

To get a 2 minute 30 second segment starting at 00:01:00:

ffmpeg -i input.mp4 -ss 00:01:00 -t 00:02:30 -c copy segment_duration.mp4

  • ·         -t 00:02:30: Specifies the duration of the output segment. (3 minutes 30 seconds - 1 minute = 2 minutes 30 seconds).


Important Considerations:

·         Keyframes: When using -c copy, FFmpeg cuts at the nearest keyframe. This means your cuts might not be exactly at the specified timestamp, but usually very close (within a fraction of a second). If you need frame-accurate cuts, you’ll have to re-encode the video, which will be slower and might result in some quality loss. For most practical purposes, -c copy is sufficient and highly recommended.

·         Re-encoding for Frame-Accurate Cuts (Slower & Quality Loss): If you absolutely need frame-accurate cuts and don’t mind re-encoding (e.g., if you’re doing very precise editing), you would omit -c copy and let FFmpeg re-encode. You might also want to specify output quality settings (e.g., -crf for H.264).

·         ffmpeg -i input.mp4 -ss 00:01:00 -to 00:03:30 output_reencoded.mp4

·         Testing: Always test with a small segment or a copy of your video first to ensure the commands work as expected before processing large or important files.

By using these FFmpeg commands, you can efficiently divide and extract segments from your MP4 videos based on timelines.

 

Saturday, June 21, 2025

C#.NET Fundamental Concepts in Hindi

माइक्रोसॉफ्ट कंपनी ने .NET प्लेटफॉर्म और C# प्रोग्रामिंग लैंग्वेज को करीब 2002 में लॉन्च किया था और आज यह आधुनिक सॉफ्टवेयर डेवलपमेंट का एक अहम हिस्सा बन चुका है। .NET प्लेटफॉर्म के तहत अलग-अलग तरह की प्रोग्रामिंग लैंग्वेज को सपोर्ट किया जाता है, जैसे C#, F#, VB.NET वगैरह। सबसे अच्छी बात यह है कि इन सभी भाषाओं का इस्तेमाल करके आप अपनी एप्लीकेशन बना सकते हैं। आसान शब्दों में कहें तो ये सभी प्रोग्रामिंग लैंग्वेज आपस में कम्युनिकेशन कर सकती हैं, बशर्ते वे सभी .NET प्लेटफॉर्म की हों। इस फीचर को हम लैंग्वेज इंटरऑपरेबिलिटी के नाम से जानते हैं।

2016 में माइक्रोसॉफ्ट ने ऑफिशियली .NET Core को लॉन्च किया। .NET की तरह ही .NET Core भी अलग-अलग प्रोग्रामिंग लैंग्वेज को सपोर्ट करता है और उनके बीच की इंटरऑपरेबिलिटी, यानी ये सभी भाषाएं आपस में बात कर सकती हैं, इस फीचर को भी सपोर्ट करता है। .NET Core की सबसे खास बात यह है कि यह नया फ्रेमवर्क सिर्फ़ विंडोज ऑपरेटिंग सिस्टम पर ही नहीं चलता, बल्कि आप इसे लिनक्स, iOS जैसे अलग-अलग ऑपरेटिंग सिस्टम पर भी चला सकते हैं। इसका मतलब है कि .NET Core में बनी एप्लीकेशन को हम अलग-अलग प्लेटफॉर्म पर चला सकते हैं। इसलिए यह क्रॉस-प्लेटफ़ॉर्म फीचर को भी सपोर्ट करता है।

ऐसा नहीं है कि C# प्रोग्रामिंग से पहले बनी हुई एप्लीकेशन दूसरे प्लेटफॉर्म को सपोर्ट नहीं करती थीं। यह मुमकिन था, लेकिन इसके लिए दूसरे तरह के फ्रेमवर्क का इस्तेमाल करना पड़ता था, जैसे मोनो प्रोजेक्ट का उपयोग करके आप C# प्रोग्रामिंग लैंग्वेज का इस्तेमाल करते हुए क्रॉस-प्लेटफॉर्म एप्लीकेशन बना सकते थे।

यहाँ एक बात नोट करने वाली है कि 2016 में माइक्रोसॉफ्ट ने .NET Core को लॉन्च किया, लेकिन अब .NET 5 के बाद 'Core' शब्द को हटा दिया गया है। आने वाले जितने भी .NET के फ्रेमवर्क होंगे, उनको .NET Core न कहकर सिर्फ़ .NET ही कहा जाएगा। उदाहरण के लिए .NET 5, .NET 6 वगैरह।


C# वर्जन और .NET फ्रेमवर्क का तालमेल

माइक्रोसॉफ्ट ने C# वर्जन 10 को नवंबर 2021 में लॉन्च किया। यहाँ यह समझना ज़रूरी है कि C# का वर्जन और .NET का फ्रेमवर्क आपस में एक-दूसरे से जुड़े होते हैं। अब उदाहरण के लिए, C# 10 वर्जन की प्रोग्रामिंग लैंग्वेज का इस्तेमाल सिर्फ़ .NET 6 या उसके ऊपर के वर्जन पर ही किया जा सकता है, अगर आपको इस लैंग्वेज के सारे फीचर इस्तेमाल करने हों। इस तरह आप समझ सकते हैं कि .NET के वर्जन और प्रोग्रामिंग लैंग्वेज के वर्जन में आपस में तालमेल होना चाहिए।

इसका मतलब यह भी निकलता है कि C# प्रोग्रामिंग लैंग्वेज सीखने के लिए आपको .NET फ्रेमवर्क की भी जानकारी होनी चाहिए क्योंकि C# प्रोग्रामिंग लैंग्वेज .NET फ्रेमवर्क के साथ मिलकर काम करती है।

.NET के तहत अलग-अलग तरह के फ्रेमवर्क उपलब्ध हैं, जैसे डेटाबेस एक्सेस करने के लिए ADO.NET और एंटिटी फ्रेमवर्क कोर जैसे पैकेज उपलब्ध हैं। इसी तरह यूजर इंटरफेस को डिजाइन करने के लिए विंडोज प्रेजेंटेशन फाउंडेशन है और वेब एप्लीकेशन बनाने के लिए ASP.NET Core और रेस्टफुल सर्विस बनाने के लिए अलग फ्रेमवर्क है।


.NET से जुड़ी ज़रूरी बातें

.NET से संबंधित कुछ ऐसी कॉन्सेप्ट हैं जिनका ज्ञान डेवलपर को होना चाहिए, जैसे .NET असेंबली, कॉमन इंटरमीडिएट लैंग्वेज, .NET रनटाइम, कॉमन टाइप स्पेसिफिकेशन, कॉमन लैंग्वेज स्पेसिफिकेशन वगैरह।

जैसा कि हमने बताया कि .NET के तहत अलग-अलग तरह के फ्रेमवर्क हैं, लेकिन इनमें से कुछ ऐसे फ्रेमवर्क हैं जिनका इस्तेमाल बहुत ज़्यादा और आधारभूत है। ऐसे फ्रेमवर्क की लाइब्रेरी को बेस क्लास लाइब्रेरी (Base Class Library - BCL) के रूप में जाना जाता है।

अब हम समझेंगे कि .NET प्लेटफॉर्म के क्या-क्या मुख्य फायदे हैं।

देखिए, .NET फ्रेमवर्क एक सॉफ्टवेयर प्लेटफॉर्म है जिसका इस्तेमाल वेब एप्लीकेशन, विंडोज सर्विस और अलग-अलग ऑपरेटिंग सिस्टम के लिए सेवाएं उपलब्ध कराने के लिए किया जाता है।

इसकी सबसे बड़ी खूबी यह है कि .NET प्लेटफॉर्म अलग-अलग तरह की प्रोग्रामिंग लैंग्वेज को सपोर्ट करता है, जैसे C#, F#, VB.NET वगैरह।

इसकी दूसरी सबसे बड़ी खूबी यह है कि इन अलग-अलग .NET की भाषाओं के लिए एक कॉमन रनटाइम इंजन का इस्तेमाल किया जाता है। आसान शब्दों में, इस कॉमन .NET रनटाइम में एक अच्छी तरह से परिभाषित टाइप्स का समूह है और डेवलपर को बस उस टाइप्स के बारे में समझना है।

इसकी तीसरी विशेषता यह है कि .NET प्लेटफॉर्म क्रॉस-लैंग्वेज इनहेरिटेंस को सपोर्ट करता हैक्रॉस-लैंग्वेज एक्सेप्शन हैंडलिंग को सपोर्ट करता है और क्रॉस-लैंग्वेज कोड की डीबगिंग को भी सपोर्ट करता है। इसका मतलब क्या हुआ? इसका मतलब यह हुआ कि आप अपनी बेस क्लास को C# में बना सकते हैं जबकि उसका एक्सटेंशन क्लास (डेरिव्ड क्लास) विजुअल बेसिक में बना सकते हैं।

.NET लाइब्रेरी को सिस्टम की रजिस्ट्री में रजिस्टर नहीं किया जाता है। .NET प्लेटफॉर्म फ्रेमवर्क के अलग-अलग वर्जन को और उनसे बनी एप्लीकेशन को एक ही मशीन पर एक साथ होने को मुमकिन बनाता है।

और पाँचवी बात.NET कमांड लाइन इंटरफेस (CLI) का इस्तेमाल अलग-अलग प्लेटफॉर्म में किया जा सकता है, जैसे .NET CLI का इस्तेमाल आप विंडोज, लिनक्स और दूसरे ऑपरेटिंग सिस्टम में कर सकते हैं।


.NET सपोर्ट लाइफ साइकिल

हमने .NET की विशेषताओं को देखा, अब हम देखेंगे कि .NET सपोर्ट का लाइफ साइकिल क्या है।

माइक्रोसॉफ्ट .NET को सपोर्ट करने के लिए समय-समय पर अपने फ्रेमवर्क में अपग्रेडेशन करता है, परिवर्तन करता है। इस तरह .NET फ्रेमवर्क को समय-समय पर रिलीज किया जाता है। इन फ्रेमवर्क को रिलीज करने को ही .NET की सपोर्ट लाइफ साइकिल कहते हैं। माइक्रोसॉफ्ट ने .NET सपोर्ट की लाइफ साइकिल के लिए दो उपाय रखे हैं: पहला लॉन्ग टर्म सपोर्ट (LTS), दूसरा शॉर्ट टर्म सपोर्ट (STS)

लॉन्ग टर्म सपोर्ट रिलीज का मतलब है ऐसे मेजर रिलीज जिसको लंबे समय के लिए माइक्रोसॉफ्ट सपोर्ट करती है। इस फ्रेमवर्क से बनी हुई एप्लीकेशन को लंबे समय तक माइक्रोसॉफ्ट सपोर्ट करती है और उसमें किसी भी तरह की त्रुटि होने पर उसको उसके लाइफटाइम में फिक्स किया जाता है।

आमतौर पर लॉन्ग टर्म सपोर्ट के लिए 3 साल की शुरुआती रिलीज पीरियड होती है और 1 साल की मेंटेनेंस सपोर्ट होती है।

दोबारा बता दें कि माइक्रोसॉफ्ट ने नवंबर 2021 में .NET 6 को रिलीज किया था और यह लॉन्ग टर्म सपोर्ट के लिए उपलब्ध है। इसका मतलब यह हुआ कि .NET 6 को नवंबर 2024 तक माइक्रोसॉफ्ट सपोर्ट करेगा।

हर .NET वर्जन की एक सपोर्ट पॉलिसी होती है और उसका लाइफटाइम देखने के लिए माइक्रोसॉफ्ट की वेबसाइट पर जाकर किसी भी .NET फ्रेमवर्क के सपोर्ट लाइफ साइकिल को देखा जा सकता है।


.NET रनटाइम एनवायरमेंट और बेस क्लास लाइब्रेरी

जब हम .NET की बात करते हैं तो हमारे मन में .NET रनटाइम एनवायरमेंट और इसकी विस्तृत बेस क्लास लाइब्रेरी से होता है। .NET रनटाइम का लेयर उन टाइप्स का इम्प्लीमेंटेशन करता है जो किसी प्लेटफॉर्म जैसे विंडोज, लिनक्स या उसकी आर्किटेक्चर के आधार पर किया जाता है, साथ ही साथ .NET का बेस टाइप भी उसमें इस्तेमाल किया जाता है।

संक्षेप में कहा जाए तो .NET का मतलब .NET रनटाइम और बेस क्लास लाइब्रेरी के समुच्चय से है।


कॉमन लैंग्वेज स्पेसिफिकेशन (CLS)

अब हम कॉमन लैंग्वेज स्पेसिफिकेशन (CLS) के बारे में समझेंगे। CLS के तहत किसी लैंग्वेज के जो-जो फीचर स्पेसिफाई किए जाते हैं, ऐसा कोई ज़रूरी नहीं है कि वह सारे फीचर किसी प्रोग्रामिंग लैंग्वेज, उदाहरण के लिए C# में उपलब्ध हों। फिर भी, CLS के आधार पर ही माइक्रोसॉफ्ट का कोई प्रोग्रामिंग लैंग्वेज विकसित हुआ होता है। जो भी लैंग्वेज CLS के आधार पर विकसित की जाती है, उसको .NET प्लेटफॉर्म के तहत इस्तेमाल किया जा सकता है, लेकिन जो लैंग्वेज CLS से बाहर जाकर कोई फीचर जोड़ता है, तो ऐसी लैंग्वेज .NET प्लेटफॉर्म के आधार पर काम नहीं कर सकती। आसान शब्दों में, .NET प्रोग्रामिंग लैंग्वेज को CLS के कंप्लायंस को फॉलो करना पड़ता है।


बेस क्लास लाइब्रेरी (BCL)

अब हम बेस क्लास लाइब्रेरी (BCL) के बारे में बात करेंगे। .NET के तहत कई सारे बेस क्लास लाइब्रेरी का समूह है। ये सारे बेस क्लास लाइब्रेरी .NET के किसी भी प्रोग्रामिंग लैंग्वेज के भीतर समान रूप से उपलब्ध होते हैं। इसके तहत थ्रेडिंग, फाइल इनपुट आउटपुट, ग्राफिकल रेंडरिंग सिस्टम और एक्सटर्नल हार्डवेयर से इंटरेक्शन करने से संबंधित सपोर्ट और रियल वर्ल्ड एप्लीकेशन के साथ सेवा देने से संबंधित सपोर्ट होता है। उदाहरण के लिए इनपुट आउटपुट के लिए System.IO का इस्तेमाल लाइब्रेरी के रूप में किया जाता है।

यहाँ यह बात समझने वाली है कि .NET फ्रेमवर्क के तहत जो बेस क्लास लाइब्रेरी है, उसकी संख्या .NET Core जिसे अब केवल .NET कहते हैं, की तुलना में ज़्यादा है। इसका मतलब यह भी हुआ कि हम .NET फ्रेमवर्क की लाइब्रेरी को .NET Core के तहत इस्तेमाल नहीं कर सकते हैं। इस समस्या से निजात पाने के लिए माइक्रोसॉफ्ट ने .NET Standard की संकल्पना को विकसित किया। .NET Standard एक ऐसा स्पेसिफिकेशन है जो यह निर्धारित करता है कि जितने भी बेस क्लास लाइब्रेरी हैं वह सब .NET API के तहत उपलब्ध होनी चाहिए। दूसरे शब्दों में, .NET Standard के भीतर बेस क्लास लाइब्रेरी के समूह का एकत्रीकरण किया गया जो सारे .NET इम्प्लीमेंटेशन में काम करते हैं। इसका मतलब यह भी होता है कि डेवलपर .NET Standard का इस्तेमाल पोर्टेबल लाइब्रेरी के रूप में कर सकता है।


C# प्रोग्रामिंग लैंग्वेज

अब हम C# के बारे में चर्चा करेंगे। आमतौर पर यह माना जाता है कि C# प्रोग्रामिंग लैंग्वेज जावा प्रोग्रामिंग से मिलता-जुलता सिंटेक्स है, लेकिन C# को जावा का क्लोन कहना गलत होगा। वास्तव में C# और जावा दोनों ही C प्रोग्रामिंग लैंग्वेज के परिवार से आते हैं, इसीलिए इन दोनों के सिंटेक्स एक-दूसरे से मिलते हैं। बहुत सारी बातें C# में विजुअल बेसिक से आई हैं, उदाहरण के लिए विजुअल बेसिक में प्रॉपर्टी का इस्तेमाल किया जाता है, ठीक उसी तरह C# क्लास के भीतर भी प्रॉपर्टी का इस्तेमाल किया जाता है जबकि जावा के भीतर गेटर और सेटर मेथड का इस्तेमाल किया जाता है। C++ की तरह C# ऑपरेटर ओवरलोडिंग, स्ट्रक्चर, एन्यूमरेशन और कॉलबैक फंक्शन जिसे डेलीगेट के रूप में जाना जाता है, को सपोर्ट करता है। इसके अलावा कई प्रकार के अन्य फीचर जैसे लैम्ब्डा एक्सप्रेशन, एनोनिमस टाइप वगैरह को भी C# सपोर्ट करता है। लेकिन आमतौर पर C# का जो ज़्यादातर इन्फ्लुएंस है वह C प्रोग्रामिंग लैंग्वेज पर आधारित है। इस बात से साफ हो जाता है कि C# कई सारी भाषाओं से मिलकर बनाया गया एक लैंग्वेज प्रोडक्ट है जो सिंटेक्स के रूप में बहुत ही साफ सुथरा और पावरफुल है। C# के भीतर आमतौर पर पॉइंटर का इस्तेमाल नहीं किया जाता है जैसा कि C प्रोग्रामिंग लैंग्वेज में इस्तेमाल होता है। इसी तरह C# के भीतर ऑटोमेटिक मेमोरी मैनेजमेंट गार्बेज कलेक्शन की मदद से किया जाता है। C# की एक सबसे बड़ी खूबी इसका एट्रिब्यूट के आधार पर प्रोग्रामिंग करना है। इसके तहत अलग-अलग तरह के एनोटेटेड टाइप को विकसित किया जाता है और उसके मेंबर को और भी गुणों से सुसज्जित किया जाता है। साफ है कि C# एक अत्यंत ही पावरफुल लैंग्वेज है और .NET के साथ मिलकर यह अनेक प्रकार के एप्लीकेशन बनाने की सुविधा प्रदान करता है।


मैनेज्ड कोड और अनमैनेज्ड कोड

अब हम मैनेज्ड कोड और अनमैनेज्ड कोड के बीच के अंतर को समझेंगे।

सबसे पहले आपको यह समझना चाहिए कि C# प्रोग्रामिंग लैंग्वेज का इस्तेमाल करके केवल हम ऐसे सॉफ्टवेयर बना सकते हैं जिनकी होस्टिंग .NET रनटाइम के अंदर की जाती है। आप कोई ऐसा एप्लीकेशन विकसित नहीं कर सकते हैं जो कि नेटिव काम सर्वर पर या अनमैनेज्ड C प्रोग्रामिंग या C++ स्टाइल के एप्लीकेशन होते हैं।

जब आप C# में कोडिंग करते हैं जो किसी .NET फ्रेमवर्क को टारगेट करके लिखा जाता है तो ऐसे कोड को मैनेज्ड कोड कहा जाता है। ऐसे कोड को .NET रनटाइम के तहत होस्टिंग करके रन किया जाता है। इससे हमने दो बातें सीखीं, पहली बात यह है कि मैनेज्ड कोड ऐसा कोड है जो .NET फ्रेमवर्क को ध्यान में रखकर .NET समूह के किसी लैंग्वेज जैसे C# की सहायता से लिखा जाता है और .NET रनटाइम के भीतर रन किया जाता है। इसके उलट ऐसे कोड जिनको .NET रनटाइम के भीतर होस्टिंग नहीं की जा सकती है उनको अनमैनेज्ड कोड कहते हैं। अनमैनेज्ड कोड को आप सीधे .NET रनटाइम के भीतर होस्टिंग नहीं कर सकते हैं, हाँ अप्रत्यक्ष रूप से कर सकते हैं, लेकिन सीधे आप अनमैनेज्ड कोड को .NET रनटाइम के भीतर होस्टिंग नहीं कर सकते हैं, उसको रन नहीं कर सकते हैं।

जैसा कि हमने देखा कि .NET प्लेटफॉर्म को अलग-अलग प्रकार के ऑपरेटिंग सिस्टम पर रन किया जा सकता है, ऐसा संभव है कि आप अपने C# एप्लीकेशन को विंडोज प्लेटफॉर्म पर विकसित करें और उसको किसी दूसरे प्लेटफॉर्म पर .NET रनटाइम के तहत होस्टिंग करके रन करें।

प्रश्न उठता है कि क्या मैनेज्ड कोड अनमैनेज्ड कोड को एक्सेस कर सकता है, उदाहरण के लिए क्या C# प्रोग्रामिंग लैंग्वेज में लिखा गया कोड किसी अनमैनेज्ड कोड जैसे COM टेक्नोलॉजी के कोड को एक्सेस कर सकता है? तो इसका उत्तर यह है कि हाँ कर सकता है।

.NET प्लेटफॉर्म के तहत तीन प्रकार की प्रोग्रामिंग लैंग्वेज को आमतौर पर प्रयोग किया जाता है: C#, F# और विजुअल बेसिक और इन तीनों में सबसे प्रमुख C# है।


.NET असेंबलीज

अब हम .NET असेंबलीज के बारे में एक ओवरव्यू प्रदान करेंगे।

जब आप C# प्रोग्रामिंग लैंग्वेज का इस्तेमाल करके या कोई भी दूसरे .NET लैंग्वेज का इस्तेमाल करके किसी .NET बाइनरी को बनाते हैं, तो उसका फाइल एक्सटेंशन डीएलएल (DLL) होता है। यह .NET बाइनरी किसी प्लेटफॉर्म स्पेसिफिक इंस्ट्रक्शन को अपने भीतर नहीं रखता है। यह प्लेटफॉर्म एग्नोस्टिक इंटरमीडिएट लैंग्वेज (IL) और मेटाडेटा की इंफॉर्मेशन को अपने भीतर समाहित करके रखता है। इंटरमीडिएट लैंग्वेज को माइक्रोसॉफ्ट इंटरमीडिएट लैंग्वेज (MSIL) के रूप में भी जाना जाता है और कई बार इसको कॉमन इंटरमीडिएट लैंग्वेज (CIL) भी कहा जाता है। अतः माइक्रोसॉफ्ट के लिटरेचर में आमतौर पर इसे तीन नाम से जाना जाता है: इंटरमीडिएट लैंग्वेज, कॉमन इंटरमीडिएट लैंग्वेज और माइक्रोसॉफ्ट इंटरमीडिएट लैंग्वेज।

जब भी आप किसी .NET लैंग्वेज का इस्तेमाल करके डीएलएल बनाते हैं, तो इस डीएलएल को बनाने के लिए आपको अपने सोर्स कोड को .NET कंपाइलर की सहायता से कंपाइल करके डीएलएल या असेंबली में बदल देना होता है। असेंबली आमतौर पर दो प्रकार की होती है: एक को डीएलएल बोलते हैं, दूसरे को ईएक्सई (EXE) बोलते हैं। यह असेंबली बिल्ड करने के लिए जो डायरेक्टरी निर्देशित होती है, उसी के भीतर बनती है।

.NET असेंबली के भीतर कई सारे फाइल को पैकेज करके रख दिया जाता है, जिसकी ज़रूरत एप्लीकेशन को रन करने के समय होती है। यहाँ तक कि कई बार .NET रनटाइम को भी उस असेंबली के भीतर पैकेज करके रख दिया जाता है। ऐसा कोई ज़रूरी नहीं है कि .NET रनटाइम को भी पैकेज के भीतर पैकेज करके रख दिया जाए। ऐसी हालत में उस असेंबली को रन करने के लिए उस एनवायरमेंट में .NET रनटाइम को अलग से इंस्टॉल करना पड़ता है। असेंबली को रन करने के लिए .NET रनटाइम की ज़रूरत पड़ती है क्योंकि हमने पहले ही देखा है कि मैनेज्ड कोड .NET रनटाइम के एनवायरमेंट में ही होस्टिंग की जाती है और रन किया जाता है।

दूसरे शब्दों में, आपकी असेंबली एक तरह का मैनेज्ड कंटेनर होता है जिसके भीतर आपके मैनेज्ड कोड पड़े होते हैं और यह कोड अलग-अलग फाइल में होते हैं और असेंबली का काम इन अलग-अलग फाइल को पैकेज करके एक सिंगल फाइल के रूप में दिखाना होता है।

दूसरी बात हमने यह भी देखी कि असेंबली के भीतर जो कोड होते हैं, वह आपके C# प्रोग्रामिंग लैंग्वेज के कोड नहीं होते हैं, उसके भीतर माइक्रोसॉफ्ट इंटरमीडिएट लैंग्वेज का कोड होता है जो प्लेटफॉर्म एग्नोस्टिक होता है।

तीसरी बात हमने यह भी देखी कि असेंबली के भीतर मेटाडेटा होता है जो अलग-अलग टाइप के करैक्टरिस्टिक्स को डिस्क्राइब करने के लिए होता है, उदाहरण के लिए अगर आपकी बाइनरी के भीतर कोई टाइप है तो उस टाइप का डिस्क्रिप्शन आपको मेटाडेटा के द्वारा होता है।

यहाँ तक कि असेंबली का डिस्क्रिप्शन भी मेटाडेटा की सहायता से किया जाता है और इसको ऑफिशियली मेनिफेस्ट (Manifest) के नाम से जाना जाता है। मेनिफेस्ट के भीतर असेंबली का वर्जन, उसकी कल्चर इंफॉर्मेशन और भी कई सारी दूसरी असेंबली से वर्तमान असेंबली का रेफरेंस दिया गया होता है जो बताता है कि असेंबली को रन करने पर और दूसरे कौन-कौन से असेंबली की ज़रूरत पड़ेगी।

असेंबली के भीतर पड़े हुए अलग-अलग टाइप के बारे में जानकारी इकट्ठा करने के लिए हमें अलग-अलग तरह के टूल का इस्तेमाल करना पड़ता है।


कॉमन इंटरमीडिएट लैंग्वेज (CIL) का रोल

अब हम अगला टॉपिक देखेंगे कि कॉमन इंटरमीडिएट लैंग्वेज (CIL) का रोल क्या है। हमने पीछे भी देखा कि कॉमन इंटरमीडिएट लैंग्वेज को माइक्रोसॉफ्ट इंटरमीडिएट लैंग्वेज या संक्षेप में CIL भी कहते हैं। कॉमन इंटरमीडिएट लैंग्वेज के द्वारा ही आप अपनी बाइनरी या .NET असेंबली की भाषा को समझ सकते हैं। दूसरे शब्दों में, इंटरमीडिएट लैंग्वेज वह भाषा है जिसमें आपके .NET बाइनरी के इंस्ट्रक्शंस पड़े होते हैं। C# डेवलपर को कॉमन इंटरमीडिएट लैंग्वेज का ज्ञान होना ज़रूरी नहीं है, लेकिन एक बेसिक समझ उसको .NET बाइनरी को समझने में मदद करती है।

.NET बाइनरी के इंटरमीडिएट लैंग्वेज में लिखे गए कोड को समझने के लिए इंटरमीडिएट लैंग्वेज डिसेम्बलर नामक एप्लीकेशन का इस्तेमाल करना पड़ता है। याद रखिए कि C# कंपाइलर आपके सोर्स कोड को इंटरमीडिएट लैंग्वेज में बदलता है। इसका मतलब क्या हुआ कि C# कंपाइलर या कोई भी दूसरा .NET कंपाइलर .NET लैंग्वेज के कोड को प्लेटफॉर्म के इंस्ट्रक्शन से मुक्त करके इंटरमीडिएट लैंग्वेज में आपके कोड को बदल देता है। इस तरह आपने जो अलग-अलग सोर्स कोड अलग-अलग फाइल में लिखे हैं, वह सारे अलग-अलग कोड अलग-अलग फाइल में इंटरमीडिएट लैंग्वेज में बदलकर एक असेंबली में पैकेज हो जाते हैं।

आपके मन में यह विचार कौंध रहा होगा कि ऐसा क्यों किया जाता है? दूसरे शब्दों में, सोर्स कोड को इंटरमीडिएट लैंग्वेज में कंपाइल किया जाता है ना कि सीधे मशीन के इंस्ट्रक्शन सेट के रूप में। इसका सबसे बड़ा फायदा लैंग्वेज इंटीग्रेशन के रूप में होता है। जब आप किसी .NET कंपाइलर की सहायता से किसी .NET लैंग्वेज के कोड को इंटरमीडिएट लैंग्वेज में बदलते हैं, तो डायरेक्ट लैंग्वेज के किसी भी लैंग्वेज के द्वारा उस इंटरमीडिएट लैंग्वेज के कोड को समझा जा सकता है, इस तरह लैंग्वेज इंटीग्रेशन होता है। इसका दूसरा फायदा यह है कि इंटरमीडिएट लैंग्वेज का कोड प्लेटफॉर्म एग्नोस्टिक होता है, इसके कारण आप किसी भी प्लेटफॉर्म पर उस कोड को रन कर सकते हैं, बस शर्त यह है कि आपका .NET प्लेटफॉर्म से संबंधित .NET रनटाइम उपलब्ध हो जिसके भीतर उस कोड की होस्टिंग करके रन करना होता है।

जैसा कि हमने देखा कि C# का कोड कंपाइल होने के बाद इंटरमीडिएट लैंग्वेज कोड में बदल जाता है, लेकिन इस इंटरमीडिएट लैंग्वेज कोड को अंत में किसी प्लेटफॉर्म विशेष के इंस्ट्रक्शन कोड में बदलना पड़ता है। इसके लिए एक दूसरे प्रकार के कंपाइलर का इस्तेमाल किया जाता है जिसको कि जस्ट-इन-टाइम (JIT) कंपाइलर के नाम से जानते हैं। कई बार इसको संक्षेप में जिटर (Jitter) भी कहा जाता है। अलग-अलग एनवायरमेंट के लिए अलग-अलग जिटर का इस्तेमाल किया जाता है। उदाहरण के लिए मान लीजिए कि आप अपने इंटरमीडिएट लैंग्वेज कोड को एंड्रॉयड एप्लीकेशन के लिए डिप्लॉय करना चाहते हैं, तो आपको उस एंड्रॉयड से संबंधित जिटर की ज़रूरत पड़ेगी।

हम इस बात को दोहराना चाहेंगे कि जो आपका प्रोग्रामिंग लैंग्वेज का टाइप होता है, वह टाइप बदलकर असेंबली के टाइप में बदल जाता है। उदाहरण के लिए अगर आपने C# में कोई क्लास या इंटरफेस टाइप बनाया है, तो जब आपका सोर्स कोड कंपाइल होने के बाद इंटरमीडिएट लैंग्वेज में बदलता है, तो आपका क्लास और इंटरफ़ेस का टाइप भी .NET असेंबली के टाइप में बदल जाता है। यह सारा काम कंपाइलर के द्वारा किया जाता है। .NET टाइप से संबंधित मेटाडेटा असेंबली के भीतर ही पड़ा हुआ होता है।

असेंबली के भीतर रखे हुए मेटाडेटा का इस्तेमाल विजुअल स्टूडियो के इंटेलिसेंस (IntelliSense) के द्वारा किया जाता है।


असेंबली मेनिफेस्ट का रोल

अब हम अगले टॉपिक असेंबली मेनिफेस्ट के रोल के बारे में समझेंगे। जैसा कि हमने कहा कि असेंबली के भीतर असेंबली का मेनिफेस्ट होता है जो असेंबली का डिस्क्रिप्शन करता है। यह न केवल असेंबली का डिस्क्रिप्शन करता है बल्कि उस असेंबली से संबंधित जितने भी दूसरे असेंबली का रेफरेंस होता है, उन सभी का भी डिस्क्रिप्शन प्रदान करता है। उदाहरण के लिए अलग-अलग असेंबली के क्या-क्या वर्जन हैं, उनके कॉपीराइट इंफॉर्मेशन, उनके लेखक की जानकारी वगैरह भी मेटाडेटा या मेनिफेस्ट के भीतर होती है। संक्षेप में कह सकते हैं कि मेनिफेस्ट फाइल सारे अलग-अलग असेंबली के डिस्क्रिप्शन को प्रदान करता है अपने डिस्क्रिप्शन के अलावा।

अब यहाँ दो बातें विचारणीय हैं: एक तो आपकी प्रोग्रामिंग लैंग्वेज का टाइप है और दूसरा .NET का टाइप है। इन दोनों के बीच के संबंध को समझना ज़रूरी है। उदाहरण के लिए आप अपने C# प्रोग्रामिंग लैंग्वेज में इंटीजर के लिए जो डेटा टाइप का इस्तेमाल करते हैं, कोई ज़रूरी नहीं है कि वही टाइप आपका .NET का टाइप होगा। असेंबली का टाइप कॉमन लैंग्वेज स्पेसिफिकेशन से प्राप्त किया जाता है।


कॉमन टाइप स्पेसिफिकेशन (CTS)

अब कॉमन टाइप स्पेसिफिकेशन (CTS) के अंतर्गत कुछ प्रमुख टाइप बताए गए हैं जो आमतौर पर .NET लैंग्वेज के भीतर इस्तेमाल किए जाते हैं, उदाहरण के लिए क्लास टाइप। इस टाइप का इस्तेमाल किसी क्लास को बनाने के लिए किया जाता है। इस क्लास टाइप के अलग-अलग करैक्टरिस्टिक्स भी हैं, इसके बारे में CTS के भीतर वर्णन किया गया है। इसी तरह CTS इंटरफेस टाइप की बात करता है। C# प्रोग्रामिंग लैंग्वेज में इसके लिए interface कीवर्ड का इस्तेमाल किया जाता है। कॉमन टाइप सिस्टम स्ट्रक्चर टाइप की बात करता है जिसके लिए C# प्रोग्रामिंग में struct कीवर्ड का प्रयोग किया जाता है। इसी तरह कॉमन टाइप सिस्टम एन्यूमरेशन टाइप की बात करता है और C# प्रोग्रामिंग लैंग्वेज में इसके लिए enum शब्द का प्रयोग किया जाता है। कॉमन टाइप सिस्टम डेलीगेट टाइप की बात करता है, जो कि C प्रोग्रामिंग लैंग्वेज के फंक्शन पॉइंटर के बराबर है। बेसिक अंतर यह है कि .NET का डेलीगेट एक क्लास ही होता है जो MulticastDelegate को इनहेरिट करके प्राप्त किया जाता है। C# प्रोग्रामिंग लैंग्वेज में डेलीगेट को डिक्लेअर करने के लिए delegate कीवर्ड का इस्तेमाल किया जाता है। डेलीगेट का इस्तेमाल बहुत ही उपयोगी है क्योंकि इसकी सहायता से एक ऑब्जेक्ट का इस्तेमाल दूसरे ऑब्जेक्ट को कॉल करने के लिए किया जा सकता है।

 

कॉमन टाइप स्पेसिफिकेशन के अंतर्गत जितने भी अलग-अलग टाइप हैं, उदाहरण के लिए क्लास, इंटरफेस, एन्यूमरेशन, डेलीगेट वगैरह, इन सब टाइप के भी अलग-अलग मेंबर होते हैं। उदाहरण के लिए कंस्ट्रक्टर, मेथड, ऑपरेटर, इंडेक्सर, फील्ड वगैरह टाइप के मेंबर होते हैं। इन अलग-अलग टाइप के मेंबर की सजावट भी करने के लिए अलग-अलग कीवर्ड उपलब्ध हैं, उदाहरण के लिए publicprivateprotected वगैरह।

 

अब हम समझेंगे कि कॉमन टाइप स्पेसिफिकेशन के अंतर्गत दिए गए टाइप और .NET लैंग्वेज के टाइप में क्या संबंध है। उदाहरण के लिए कॉमन टाइप सिस्टम के अंतर्गत Int64 का इस्तेमाल किया जाता है, जबकि C# और VB में इसके लिए long टाइप का इस्तेमाल किया जाता है। विजुअल बेसिक में टाइप को लिखने के लिए पास्कल केस का इस्तेमाल किया जाता है, जबकि C# में टाइप का नाम हमेशा लोअरकेस में लिखा जाता है। तो इसका मतलब यह हुआ कि जब कंपाइलर C# के टाइप को देखता है, तो कंपाइल करने के बाद उसे कॉमन टाइप स्पेसिफिकेशन के टाइप में बदल देता है।

 

अब हम कॉमन लैंग्वेज स्पेसिफिकेशन से संबंधित एक प्रश्न उठाते हैं। मान लीजिए आपको दो स्ट्रिंग का कॉन्कैटेनेशन करना है, तो विजुअल बेसिक के अंतर्गत इसे करने के लिए एम्परसैंड (&) सिंबल का इस्तेमाल किया जाता है, जब कि C# के अंतर्गत इसे करने के लिए प्लस (+) सिंबल का इस्तेमाल किया जाता है।

 

आपकी .NET लैंग्वेज जैसे C# कॉमन लैंग्वेज स्पेसिफिकेशन के कंप्लाइंट है, यह कैसे कह सकते हैं?


.NET रनटाइम

अब हम अगला टॉपिक .NET रनटाइम को समझना है।

हमने कॉमन टाइप स्पेसिफिकेशन और कॉमन लैंग्वेज स्पेसिफिकेशन को देखा है, अब हम .NET रनटाइम को समझेंगे। प्रोग्रामिंग की भाषा में रनटाइम का मतलब सर्विसेज के समूह से है जिसका इस्तेमाल किसी कोड को रन करने के लिए किया जाता है। उदाहरण के लिए जब कोई जावा प्रोग्रामिंग में डेवलप किए हुए सॉफ्टवेयर को किसी कंप्यूटर पर इंस्टॉल करना होता है, तो उसके लिए सबसे पहले आपको जावा वर्चुअल मशीन की ज़रूरत होती है। आप उस कंप्यूटर पर सबसे पहले जावा वर्चुअल मशीन को इंस्टॉल करते हैं, उसके बाद ही वह सॉफ्टवेयर उस मशीन पर रन हो सकता है। इसका मतलब क्या हुआ? इसका मतलब हुआ कि जावा वर्चुअल मशीन जावा के कोड को रन करने के लिए ज़रूरी सेवा प्रदान करता है। तो हमने समझा कि रनटाइम का मतलब सॉफ्टवेयर के सर्विसेज के समूह से है जिसका इस्तेमाल किसी सॉफ्टवेयर को रन करने के लिए किया जाता है। ठीक यही बात .NET रनटाइम के साथ भी है। किसी भी .NET में डेवलप एप्लीकेशन को किसी भी मशीन पर रन करने के लिए सबसे पहले उस मशीन पर .NET रनटाइम नामक सॉफ्टवेयर को इंस्टॉल करना ज़रूरी होता है। .NET रनटाइम एक ऐसा सॉफ्टवेयर है जिसमें कई सारे सर्विसेज होते हैं जिन सर्विसेज का इस्तेमाल करके किसी .NET एप्लीकेशन के कोड को रन किया जाता है। यहाँ यह भी याद रखने वाली बात है कि .NET में बनी एप्लीकेशन के कोड को मैनेज्ड कोड कहा जाता है क्योंकि यह कोड केवल .NET रनटाइम सॉफ्टवेयर की सहायता से ही रन किया जा सकता है। .NET रनटाइम एक ऐसा एनवायरमेंट प्रदान करता है जिसके भीतर मैनेज्ड कोड रन किया जा सकता है।


.NET SDK और विजुअल स्टूडियो

जब हम कोई भी .NET एप्लीकेशन विकसित करना चाहते हैं, तो सबसे पहले अपने कंप्यूटर के भीतर सॉफ्टवेयर डेवलपमेंट किट (SDK) को इंस्टॉल करना होता है। जैसा कि हम जानते हैं कि .NET SDK अलग-अलग वर्जन के आते हैं। इन अलग-अलग वर्जन के नामकरण को समझना ज़रूरी है कि किस आधार पर माइक्रोसॉफ्ट अपने SDK का वर्जनिंग करता है?

जब आपके कंप्यूटर में सॉफ्टवेयर डेवलपमेंट किट इंस्टॉल हो जाता है, तब उसके वर्जन की जांच करने के लिए आप कमांड लाइन इंटरफेस (CLI) का इस्तेमाल करके जांच कर सकते हैं। इसके लिए आपको SDK के ऑप्शंस प्रदान किए गए हैं, उदाहरण के लिए versioninfo वगैरह ऑप्शंस का इस्तेमाल करके आप उनकी वर्जनिंग इंफॉर्मेशन को प्राप्त कर सकते हैं।

विजुअल स्टूडियो एडिटर के अलग-अलग लाइसेंसिंग मॉडल क्या हैं?

विजुअल स्टूडियो एडिटर साइड-बाय-साइड इंस्टॉलेशन की सुविधा को प्रदान करता है। इसका मतलब यह है कि आप विजुअल स्टूडियो के अलग-अलग वर्जन का इंस्टॉलेशन अपने लैपटॉप या कंप्यूटर पर कर सकते हैं। उदाहरण के लिए आप एक ही समय अपने कंप्यूटर पर विजुअल स्टूडियो कम्युनिटी एडिशन, प्रोफेशनल एडिशन और एंटरप्राइज एडिशन तीनों को इंस्टॉल कर सकते हैं।

विजुअल स्टूडियो वर्कस्पेस या वर्कलोड के अंतर्गत अलग-अलग कंपोनेंट को इंस्टॉल करने की सुविधा प्रदान की गई है।

विजुअल स्टूडियो प्रॉपर्टीज फाइल के भीतर मुख्य रूप से दो ग्रुप होते हैं: आइटम ग्रुप और प्रॉपर्टी ग्रुप। प्रॉपर्टी ग्रुप के अंतर्गत हम अपने प्रोजेक्ट के अलग-अलग प्रॉपर्टीज को ग्रुप करके रखते हैं, उदाहरण के लिए आपके प्रोजेक्ट का टारगेट फ्रेमवर्क क्या है, आपके प्रोजेक्ट में इंप्लिसिट यूजिंग का प्रयोग इनेबल है या नहीं, आपका प्रोजेक्ट EXE आउटपुट करता है या नहीं, इन सब अलग-अलग सेटिंग्स को करने के लिए हम प्रॉपर्टी ग्रुप का इस्तेमाल करते हैं, जबकि आपके प्रोजेक्ट के भीतर जो अलग-अलग कंपोनेंट होते हैं, उदाहरण के लिए अलग-अलग न्यूगेट पैकेज, इन सबको आइटम ग्रुप के अंदर रखा जाता है। इस ग्रुप के भीतर भी और ग्रुप बनाए जा सकते हैं।

विजुअल स्टूडियो के भीतर सॉल्यूशन एक्सप्लोरर एक ऐसा विंडो है जो आपके एप्लीकेशन के भीतर इस्तेमाल किए जाने वाले अलग-अलग प्रोजेक्ट्स और उनके फाइल्स, फोल्डर वगैरह को व्यवस्थित रूप से दिखाता है। यह एक तार्किक विंडो होता है।


.NET CLI का इस्तेमाल

अब हम .NET CLI के बारे में समझेंगे। .NET CLI एक कमांड लाइन इंटरफेस है जिसका इस्तेमाल आप विजुअल स्टूडियो और विजुअल स्टूडियो कोड दोनों ही एडिटर के भीतर कर सकते हैं और दोनों में एक ही जैसे कमांड का प्रयोग किया जाता है। जब भी कोई कमांड लिखना होता है, तो सबसे पहले आप dotnet लिखते हैं। अब मान लेते हैं कि आपको कोई नया प्रोजेक्ट बनाना है, तो dotnet new करके जब एंटर की प्रेस करते हैं, तो आपको यह अलग-अलग टेंप्लेट, उनके शॉर्ट नाम, किस लैंग्वेज में बनाना है वगैरह की जानकारी उपलब्ध करा देता है। इसका मतलब यह हुआ कि आपको कुछ भी याद करने की ज़रूरत नहीं है। यहाँ तक कि केवल आप dotnet लिखकर एंटर प्रेस करेंगे, तो dotnet के बाद क्या-क्या ऑप्शन उपलब्ध हैं, इसकी जानकारी आपको मिल जाती है, उदाहरण के लिए dotnet help अगर आगे लिखते हैं, तो यह .NET के संबंध में जो भी हेल्प है, वह उपलब्ध कराता है, जबकि अगर आप अपने .NET SDK की इंफॉर्मेशन चाहते हैं, तो info लिखकर एंटर प्रेस करेंगे। कहने का मतलब यह है कि .NET कमांड लाइन इंटरफेस का इस्तेमाल करना आसान है, केवल आपको अभ्यास करना है।

यदि आप dotnet new के बाद list लिखते हैं और एंटर प्रेस करते हैं, तो यह जितने भी टेंप्लेट आपके लैपटॉप में इंस्टॉल हैं, उसकी पूरी लिस्टिंग करके देता है। हर टेंप्लेट का शॉर्ट नाम होता है और उससे संबंधित लैंग्वेज भी हो सकता है, लैंग्वेज होना ज़रूरी नहीं है। उदाहरण के लिए यदि आप ASP.NET कोर एम्प्टी या वेब एपीआई या MVC या एंगुलर, रिएक्ट वगैरह के साथ अपना प्रोजेक्ट बनाना चाहते हैं, तो उससे संबंधित शॉर्टकट लिस्ट में आपको मिल जाएगा। dotnet new list -h करके एंटर प्रेस करने पर आपको कई सारी हेल्पफुल बातें इंफॉर्मेशन प्राप्त होती हैं, उदाहरण के लिए आप अपनी लिस्ट को फिल्टर कर सकते हैं, इसके लिए आपको कौन से ऑप्शंस का प्रयोग करना है, यह बताता है।

उदाहरण के लिए आप निम्नलिखित dotnet new web -h को लिखकर एंटर प्रेस कीजिए। यह आपको जानकारी देता है कि ASP.NET कोर ब्लैंक टेंप्लेट का इस्तेमाल करके आप क्या-क्या कर सकते हैं।

आप अपनी आउटपुट डायरेक्टरी का नाम क्या देना चाहते हैं और किस लोकेशन पर रखना चाहते हैं, किस लैंग्वेज में प्रोजेक्ट को विकसित करना चाहते हैं, उसका फ्रेमवर्क किस वर्जन में होगा, क्या आप अपनी एप्लीकेशन के भीतर लॉन्च सेटिंग्स फाइल को रखना चाहते हैं, क्या आपकी एप्लीकेशन के भीतर HTTPS को इनेबल किया जाएगा अथवा नहीं वगैरह तमाम बातों का उल्लेख आप कमांड लाइन में ही कर सकते हैं। अगर आप कुछ भूल जाते हैं, तो आप अपनी हेल्प का प्रयोग करें।

इसी तरीके से अगर आप कोई सॉल्यूशन फाइल बना रहे हैं, तो आपका कमांड इस प्रकार होगा:

dotnet new sln -h

ध्यान दीजिए कि सॉल्यूशन फाइल का कोई वर्जन नहीं होता है क्योंकि इसका संबंध किसी फ्रेमवर्क से नहीं है, केवल आप इसका डायरेक्टरी का नाम और लोकेशन को बता सकते हैं, दूसरे शब्दों में आपके सॉल्यूशन का आउटपुट डायरेक्टरी कहाँ होगा और उसका नाम क्या होगा, आप ऑप्शंस में उल्लेख कर सकते हैं।

हर स्विच के पहले डैश (-) का इस्तेमाल किया जाता है और उस स्विच की वैल्यू उसके बाद थोड़ा स्पेस देकर लिखी जाती है।

यदि आपका सॉल्यूशन बना हुआ है और उसके बाद आप किसी प्रोजेक्ट को जोड़ना चाहते हैं उस सॉल्यूशन के साथ, तो इसके लिए अगर आपको हेल्प चाहिए, तो इस तरह टाइप करें:

dotnet sln -h

इस हेल्प के द्वारा आपको पता चलेगा कि आप अपने सॉल्यूशन के साथ किसी प्रोजेक्ट को जोड़ सकते हैं या रिमूव कर सकते हैं या अपने सॉल्यूशन में उपलब्ध सारे प्रोजेक्ट की लिस्टिंग भी प्राप्त कर सकते हैं। जब आप अपने सॉल्यूशन के भीतर किसी प्रोजेक्ट को जोड़ना चाहते हैं, तो उसके लिए आपको अपने प्रोजेक्ट के पूरे पाथ को add कमांड के बाद लिखना पड़ता है।

.NET कमांड की सहायता से आप अपने प्रोजेक्ट के भीतर जितने भी पैकेज हैं, उन सभी पैकेज को रिस्टोर (Restore) कर सकते हैं। पैकेज को रिस्टोर करने पर उस पैकेज के वर्जन के अनुसार प्रोजेक्ट के भीतर पैकेज इंस्टॉल हो जाते हैं। प्रोजेक्ट को बिल्ड (Build) करने पर जितने भी सोर्स फाइल हैं उनका कंप्लीशन होकर असेंबली में कन्वर्जन हो जाता है, जबकि रिस्टोर करने पर पैकेज फिर से स्थापित होते हैं। आमतौर पर dotnet run कमांड को रन करके पैकेज रिस्टोर और बिल्ड का काम दोनों एक साथ हो जाता है।

Main मेथड: क्यों, क्या और कैसे?

जब भी किसी एप्लीकेशन को शुरू किया जाता है, तो उसके भीतर एक Main मेथड होता है जो सबसे पहले चलता है। यह एक स्टैटिक मेथड होता है क्योंकि जब एप्लीकेशन स्टार्ट होता है, तो ऐसा मुमकिन नहीं है कि किसी क्लास का ऑब्जेक्ट बनाया जाए और फिर उसके किसी मेथड को चलाया जाए। ऑब्जेक्ट बनाने से पहले एक मेथड का होना ज़रूरी है, इसलिए एप्लीकेशन के शुरू होने पर कोई नॉन-स्टैटिक मेथड नहीं चल सकता, क्योंकि नॉन-स्टैटिक मेथड को चलाने के लिए एक ऑब्जेक्ट का पहले से बना होना ज़रूरी है। एप्लीकेशन के स्टार्ट होने पर पहले से कोई ऑब्जेक्ट बना हुआ होना संभव नहीं है, इसलिए एप्लीकेशन के शुरू होने पर सबसे पहले एक स्टैटिक मेथड स्टार्ट या रन होता है और इसे Main मेथड के नाम से जाना जाता है, क्योंकि यही सबसे पहले चलता है।

हमने समझ लिया कि Main मेथड स्टैटिक क्यों होता है। अब हम देखते हैं कि इस मेथड का रिटर्न टाइप क्या हो सकता है और इसमें क्या आर्गुमेंट दिए जा सकते हैं।

यदि आपसे पूछा जाए कि आपके एप्लीकेशन में कितने Main मेथड हो सकते हैं, तो आपका क्या जवाब होगा? जिस क्लास के द्वारा Main मेथड डिफाइन किया जाता है, उस क्लास के ऑब्जेक्ट को एप्लीकेशन ऑब्जेक्ट कहते हैं।

आपके पूरे एप्लीकेशन के भीतर एक ही एप्लीकेशन ऑब्जेक्ट होता है, लेकिन कई बार आपके एप्लीकेशन के भीतर एक से ज़्यादा भी एप्लीकेशन ऑब्जेक्ट हो सकते हैं। उदाहरण के लिए, जब आप यूनिट टेस्ट करते हैं, उस स्थिति में आपको एक अलग एप्लीकेशन ऑब्जेक्ट की ज़रूरत होती है। इसके लिए आपको अपने विजुअल स्टूडियो के भीतर सेटिंग करनी होती है। विजुअल स्टूडियो के प्रोजेक्ट फाइल के भीतर आप StartupObject नामक एक टैग का उपयोग करके यह सेटिंग कर सकते हैं।

अब हम देखेंगे कि अपनी एप्लीकेशन के भीतर Main मेथड को कितने अलग-अलग तरीके से लिखा जा सकता है। आप अपने एप्लीकेशन में Main मेथड को बिना आर्गुमेंट के भी लिख सकते हैं और आर्गुमेंट के साथ भी लिख सकते हैं। इसी तरह, आपके Main मेथड का रिटर्न टाइप एक int भी हो सकता है या void हो सकता है।

यह आपको तय करना है कि क्या आपका Main मेथड कोई आर्गुमेंट लेता है या नहीं, क्या आपकी एप्लीकेशन को किसी यूजर इनपुट की ज़रूरत है या नहीं, जब एप्लीकेशन स्टार्ट होता है। इसी तरह, आपको सोचना है कि क्या आपका एप्लीकेशन कुछ रिटर्न करता है।


C# 9 के बाद Main मेथड और टॉप-लेवल स्टेटमेंट

C# 9 के बाद से एप्लीकेशन के भीतर Main मेथड को लिखना ज़रूरी नहीं रह गया है। इसे आजकल हम टॉप-लेवल स्टेटमेंट के रूप में व्यक्त करते हैं। अब जब भी आप कोई एप्लीकेशन बनाते हैं, तो यह मानकर चला जाता है कि Program क्लास के भीतर Main मेथड है।

आमतौर पर जब एप्लीकेशन स्टार्ट होता है, तो Main मेथड चलता है, लेकिन एप्लीकेशन क्या रिटर्न करता है? एप्लीकेशन जो कुछ भी रिटर्न करता है, वह सिस्टम को मिलता है। सिस्टम को यदि वैल्यू शून्य (0) मिलती है, इसका मतलब है कि एप्लीकेशन सफलतापूर्वक चला है, लेकिन अगर नकारात्मक (-) वैल्यू मिलती है, तो इसका मतलब होता है कि एप्लीकेशन में किसी प्रकार की त्रुटि (Error) आ गई है। इसके अलावा, एप्लीकेशन का रिटर्न टाइप void भी हो सकता है। सिस्टम को यह वैल्यू ErrorLevel नामक वेरिएबल में प्राप्त होता है। सिस्टम को रिटर्न किए गए इस वैल्यू को बैच प्रोग्रामिंग के द्वारा जांचा जा सकता है।

अभी हमने सीखा कि कैसे Main मेथड के रिटर्न वैल्यू को बैच प्रोग्रामिंग के द्वारा प्राप्त किया जा सकता है, लेकिन इसका इस्तेमाल क्या है? तो आइए समझते हैं इसका क्या इस्तेमाल है। मान लीजिए, एक एप्लीकेशन को स्टार्ट करने के बाद वह एप्लीकेशन किसी दूसरे एप्लीकेशन को स्टार्ट करता है। इस प्रक्रिया में ऐसा हो सकता है कि दूसरा एप्लीकेशन कोई एरर उत्पन्न करे जिसके कारण उसके Main मेथड की रिटर्न वैल्यू एक नेगेटिव वैल्यू हो, जो कि एरर के कारण उत्पन्न हुई है। अगर इस वैल्यू को आप प्राप्त करना चाहते हैं, तो जो प्रोसेस (Process) लॉन्च हुई है, उस लॉन्च प्रोसेस के ExitCode प्रॉपर्टी के द्वारा इसके वैल्यू को प्राप्त किया जा सकता है।

मान लीजिए कि आपने एक .NET एप्लीकेशन बनाया। जब यह एप्लीकेशन टर्मिनेट होता है, तो यह अपनी रिटर्न वैल्यू सिस्टम को वापस करता है, लेकिन इसका पता आप नहीं लगा सकते हैं क्योंकि वैल्यू सिस्टम को रिटर्न की जा रही है। इसके उलट, जब यह एप्लीकेशन किसी दूसरे एप्लीकेशन को रन करता है, तो दूसरा एप्लीकेशन रन होने पर अपनी रिटर्न वैल्यू पहले एप्लीकेशन को देता है, जिसका वैल्यू आप ExitCode प्रॉपर्टी से प्राप्त कर सकते हैं।

ठीक यही काम आप बैच फाइल बनाकर भी करते हैं। जब आप बैच फाइल के द्वारा अपने .NET एप्लीकेशन को रन करते हैं और यदि .NET एप्लीकेशन के द्वारा कोई नेगेटिव वैल्यू रिटर्न की जाती है, तो वह वैल्यू बैच फाइल के एप्लीकेशन को प्राप्त हो जाता है और बैच फाइल उस रिटर्न वैल्यू को ErrorLevel नामक वेरिएबल में स्टोर कर लेता है और कंसोल पर दिखा देता है।


Main मेथड को आर्गुमेंट्स देना

हमने समझ लिया कि .NET एप्लीकेशन के Main मेथड के द्वारा रिटर्न वैल्यू को किस प्रकार दिखाया जा सकता है। अब हम सोचेंगे कि Main मेथड को यदि आर्गुमेंट पास किया जाए तो उसका क्या किया जा सकता है। देखिए, आप Main मेथड को एक या एक से ज़्यादा आर्गुमेंट पास कर सकते हैं, क्योंकि यह एक एरे (Array) प्रकार का डेटा टाइप होता है। उदाहरण के लिए, आप एक से ज़्यादा स्ट्रिंग वैल्यू को आर्गुमेंट्स के रूप में पास कर सकते हैं। इस वैल्यू को देखने का सबसे आसान तरीका है कि आप for लूप का इस्तेमाल करके उसके वैल्यू को कंसोल पर देख लें।

अब प्रश्न उठता है कि मेथड को आर्गुमेंट्स किस तरीके से पास किया जा सकता है? इस पर विचार करते हैं। देखिए, सबसे पहला तरीका तो यह है कि जब आप अपने एप्लीकेशन को कमांड लाइन इंटरफेस (CLI) की मदद से dotnet run लिखकर उसके बगल में आर्गुमेंट्स की वैल्यू देते हैं, तो यह वैल्यू एप्लीकेशन के द्वारा एक्सेप्ट कर लिया जाता है और यह Main मेथड को दे दिया जाता है। तो यह हुआ पहला तरीका जिस तरीके से आप Main मेथड को आर्गुमेंट्स पास कर सकते हैं।

आप एनवायरमेंट वेरिएबल के रूप में आर्गुमेंट्स को पास करके भी Main मेथड को आर्गुमेंट दे सकते हैं। आप अपने एप्लीकेशन के भीतर Environment क्लास के GetCommandLineArgs मेथड की सहायता से पास किए गए आर्गुमेंट्स को एक एरे के भीतर स्टोर कर सकते हैं। जब आप Environment क्लास के द्वारा आर्गुमेंट को एक्सेप्ट करते हैं, तो यह कोई ज़रूरी नहीं है कि यह Main मेथड से प्राप्त आर्गुमेंट ही हो।

C# के भीतर पहले Program क्लास के भीतर Main मेथड का होना ज़रूरी होता था, लेकिन C# 9 के बाद ऐसा होना ज़रूरी नहीं है। अब एप्लीकेशन के भीतर टॉप-लेवल स्टेटमेंट का कॉन्सेप्ट लाया गया है। टॉप-लेवल स्टेटमेंट का क्या मतलब है, इसको समझने के बाद हम समझ जाएंगे कि अब Main मेथड को स्पष्ट रूप से (explicitly) क्यों नहीं लिखा जाता है। C# 9 के बाद टॉप-लेवल स्टेटमेंट एप्लीकेशन के एक और केवल एक मात्र फाइल में प्रयोग किया जा सकता है, और आमतौर पर यह Program क्लास फाइल होता है। जब किसी फाइल को टॉप-लेवल स्टेटमेंट के लिए चुन लिया जाता है, तो उसके भीतर हम एंट्री मेथड या एंट्री पॉइंट को नहीं लिख सकते हैं। इस फाइल के भीतर जितने भी स्टेटमेंट लिखे जाते हैं, उनको टॉप-लेवल स्टेटमेंट कहते हैं, और इस फाइल के भीतर यदि किसी मेथड का इस्तेमाल किया जाता है, तो उसे लोकल मेथड के रूप में समझा जाता है।

क्या आप टॉप-लेवल स्टेटमेंट वाले क्लास फाइल के क्लास को पार्शियल क्लास (Partial Class) के रूप में लिख सकते हैं ताकि एक से ज़्यादा फाइल के भीतर आप अपने टॉप-लेवल स्टेटमेंट का प्रयोग कर सकें? स्वयं विचार कीजिए।

जब आप टॉप-लेवल स्टेटमेंट का प्रयोग अपने फाइल में करते हैं, तो उस फाइल में Main मेथड का प्रयोग नहीं कर सकते हैं।

Main मेथड में प्रयोग किए जाने वाले आर्गुमेंट को कमांड लाइन आर्गुमेंट भी कहते हैं, क्योंकि इस मेथड को दिए जाने वाले आर्गुमेंट कमांड लाइन की मदद से ही दिए जाते हैं। इसके अलावा, आप विजुअल स्टूडियो के एडिटर के भीतर भी आर्गुमेंट को दे सकते हैं या कंप्यूटर के एनवायरमेंट वेरिएबल सेट करने वाले डायलॉग बॉक्स की मदद से भी आर्गुमेंट को दे सकते हैं।

इन सभी अलग-अलग तरीके से आर्गुमेंट देने के बावजूद, यह याद रखना चाहिए कि आर्गुमेंट देना एप्लीकेशन के एनवायरनमेंट पर निर्भर करता है। इसके लिए .NET के अंतर्गत Environment क्लास का इस्तेमाल किया जाता है। इस क्लास के अलग-अलग मेथड और प्रॉपर्टीज की सहायता से एनवायरमेंट वेरिएबल को सेट या गेट किया जा सकता है।


Environment क्लास का उपयोग

अब हम देखते हैं कि Environment क्लास का क्या उपयोग है?

.NET के अंतर्गत Environment क्लास एक महत्वपूर्ण क्लास है जो आपके सिस्टम के एनवायरनमेंट से संबंधित अलग-अलग तरह की इंफॉर्मेशन प्रदान करता है, साथ ही साथ आप सिस्टम के एनवायरनमेंट से संबंधित वेरिएबल को सेट भी कर सकते हैं। सिस्टम के मशीन के नाम, यूजर के नाम और प्रक्रिया की आईडी (ID) वगैरह को हम Environment क्लास के प्रॉपर्टी से प्राप्त कर सकते हैं। हम यह जान सकते हैं कि मशीन का ऑपरेटिंग सिस्टम 64 बिट का है या 32 बिट का है। आप अपने एप्लीकेशन के .NET प्लेटफॉर्म के वर्जन को भी इसकी सहायता से प्राप्त कर सकते हैं। इस प्रकार हम देखते हैं कि Environment क्लास का अलग-अलग प्रॉपर्टी कितना सहायक है।

Environment क्लास के कई सारे स्टैटिक मेथड भी हैं जिनकी सहायता से आप मशीन के स्पेशल फोल्डर के पाथ को प्राप्त कर सकते हैं। इसके अलावा, अलग-अलग एनवायरमेंट वेरिएबल के वैल्यू को देख सकते हैं, किसी एनवायरमेंट वेरिएबल के वैल्यू को देख सकते हैं, सारे एनवायरमेंट वेरिएबल के वैल्यूज की लिस्टिंग कर सकते हैं और किसी एनवायरमेंट वेरिएबल को गेट या सेट कर सकते हैं। सबसे बड़ी बात, आप कमांड लाइन से आने वाले आर्गुमेंट को प्राप्त कर सकते हैं और एप्लीकेशन को एरर होने पर एग्जिट भी कर सकते हैं।


नंबर को फॉर्मेट करना

किसी भी प्रोग्रामिंग लैंग्वेज में नंबर को फॉर्मेट करना एक ज़रूरत होती है। उदाहरण के लिए, आप नंबर को करेंसी के रूप में, फिक्स्ड डिजिटल, डेसिमल पॉइंट, एक्स्पोनेंशियल फॉर्म वगैरह में फॉर्मेट कर सकते हैं। इसको करने के लिए .NET के भीतर बहुत ही सरल तरीका है। अलग-अलग फॉर्मेटिंग के लिए अलग-अलग सिंटैक्स या सिंबल का प्रयोग किया जाता है। उदाहरण के लिए, अंग्रेजी के C, D, E, F और G के द्वारा करेंसी फॉर्मेट, डेसिमल नंबर फॉर्मेट, एक्स्पोनेंशियल फॉर्मेट, फिक्स्ड पॉइंट फॉर्मेट और जनरल फॉर्मेट किया जाता है। इनका प्रयोग प्लेसहोल्डर के भीतर किया जाता है। प्लेसहोल्डर को दिखाने के लिए {} का प्रयोग किया जाता है।

इन अलग-अलग सिंबल को फॉर्मेट स्पेसिफायर (Format Specifier) के नाम से जाना जाता है और इनका प्रयोग करने के लिए इन संकेतों के पहले कोलन (:) का प्रयोग किया जाता है। उदाहरण के लिएConsole.Write("{0:C}", 231); ध्यान दीजिए कि फॉर्मेट स्पेसिफायर को हमेशा स्ट्रिंग के भीतर लिखा जाता है और फॉर्मेट स्पेसिफायर प्लेसहोल्डर के भीतर रखा जाता है।


ओवरफ्लो हैंडलिंग

अब हम .NET से जुड़े हुए एक अलग ही कॉन्सेप्ट की चर्चा करेंगे। यह कॉन्सेप्ट ओवरफ्लो (Overflow) से जुड़ा हुआ है। जैसा कि हम जानते हैं कि अगर दो बाइट वैल्यू को जोड़ते हैं, तो ऐसा हो सकता है कि अगर दोनों बाइट वैल्यू अपने मैक्सिमम वैल्यू को रिप्रेजेंट करती हों, तो उनको जोड़ने पर जो वैल्यू मिलेगा वह मैक्सिमम से ज़्यादा होगा, अतः यह एक ओवरफ्लो का केस है। इसी प्रकार, दो इंटीजर जो अपने मैक्सिमम वैल्यू को रिप्रेजेंट करते हैं, अगर उनको जोड़ते हैं, तो यह भी एक ओवरफ्लो का केस है। इस तरह के केस में रिजल्ट अनएक्सपेक्टेड होता है। इससे बचने के लिए हम उस एक्सप्रेशन को checked के भीतर रख सकते हैं। यह भी संभव है कि कोड के ब्लॉक को आप checked के अंदर रख दें। इसका मतलब यह होता है कि उस ब्लॉक के भीतर जितने भी स्टेटमेंट हैं, अगर उनमें से कोई भी स्टेटमेंट ओवरफ्लो करता है, तो यह एक तरह का एक्सेप्शन (Exception) है और checked वहाँ पर आपको एक मैसेज प्रदान कर देता है। इस तरह, जब हम checked का प्रयोग करते हैं, तो यह एक कोड क्षेत्र के भीतर इस्तेमाल किया जाता है, लेकिन अगर आप चाहते हैं कि पूरी प्रोजेक्ट के भीतर यह प्रभावित हो, तो इसके लिए आप अपने विजुअल स्टूडियो के प्रोजेक्ट फाइल के भीतर प्रॉपर्टी ग्रुप (PropertyGroup) के अंदर CheckForOverflowUnderflow एलिमेंट का इस्तेमाल कर सकते हैं। इसकी वैल्यू True या False होती है, इस तरह आप अपने एप्लीकेशन के भीतर checked को इनेबल या डिसेबल कर सकते हैं।


एप्लीकेशन बिल्ड कॉन्फ़िगरेशन

अब हम एक नया टॉपिक, एप्लीकेशन के बिल्ड कॉन्फ़िगरेशन (Build Configuration) के संबंध में बात करेंगे। जब आप अपने एप्लीकेशन को बिल्ड करते हैं, तो इसके लिए दो तरीके हैं: या तो आप अपने एप्लीकेशन को डिबग मोड (Debug Mode) में बिल्ड करते हैं या फिर रिलीज़ मोड (Release Mode) में बिल्ड करते हैं। इन दोनों तरीकों में अंतर है। रिलीज़ मोड में जब हम अपने एप्लीकेशन को बिल्ड करते हैं, तो यह पूरी तरह ऑप्टिमाइज्ड (Optimized) होता है। यह प्रोडक्शन में डिप्लॉयमेंट करने के लिए किया गया ऑप्टिमाइज्ड बिल्ड होता है, जबकि डिबग बिल्ड का प्रयोग तब करना चाहिए जब हम अपने एप्लीकेशन को अभी डेवलप कर रहे हैं और उसमें किसी प्रकार की त्रुटि को दूर करने के लिए डिबग करना पड़ रहा है।


इंप्लिसिट टाइप वेरिएबल (var)

किसी वेरिएबल को इंप्लिसिट टाइप (Implicit Type) की मदद से डिक्लेअर किया जा सकता है। इसके लिए var कीवर्ड का प्रयोग किया जाता है, लेकिन इसके कुछ लिमिटेशन हैं। उदाहरण के लिए, इसका उपयोग किसी फील्ड के लिए नहीं किया जा सकता है और न ही इसका उपयोग किसी मेथड के रिटर्न टाइप को बताने के लिए किया जा सकता है। जब वेरिएबल को इंप्लिसिट तरीके से डिक्लेअर किया जाता है, तो उसको इनिशियलाइज (Initialize) करना ज़रूरी है। दूसरी बात, आप इस वेरिएबल के डेटा टाइप को आगे जाकर बदल नहीं सकते हैं। दूसरे शब्दों में, इंप्लिसिट टाइप वेरिएबल भी स्ट्रॉन्गली टाइप्ड वेरिएबल (Strongly Typed Variable) ही होते हैं। इंप्लिसिट टाइप तरीके से वेरिएबल के डेटा टाइप को डिक्लेअर करना बहुत आम है और इसका बहुत ज़्यादा प्रयोग LINQ में होता है।


टाइप पैटर्न मैचिंग

अब हम इसके भीतर टाइप पैटर्न मैचिंग (Type Pattern Matching) को देखेंगे। हर if स्टेटमेंट एक बुलियन कंडीशन की मांग करता है। हम यहाँ पर is ऑपरेटर का इस्तेमाल करके हर वेरिएबल के डेटा टाइप की चेकिंग कर सकते हैं और उसके आधार पर उस वेरिएबल की वैल्यू को किसी दूसरे लोकल वेरिएबल को पास कर सकते हैं।

is ऑपरेटर एक बाइनरी ऑपरेटर है। यह अपने लेफ्ट ऑपरेंड के रूप में एक वेरिएबल या वैल्यू को लेता है और राइट ऑपरेंड के रूप में एक डेटा टाइप को लेता है। अगर ये दोनों एक ही डेटा टाइप के होते हैं, तो यह true रिटर्न करता है, वरना यह false रिटर्न करता है। इसके अलावा, इसके बाद आप एक नया लोकल वेरिएबल लिख सकते हैं जो डेटा टाइप के बाद लिखा जाता है। इसका मतलब यह होता है कि यदि रिजल्ट true होता है, तो पहले वाले वेरिएबल को नए वेरिएबल को असाइन कर दिया जाता है। यह सारी प्रक्रिया टाइप पैटर्न मैचिंग के अंतर्गत आती है। टाइप पैटर्न मैचिंग के अंतर्गत उद्देश्य यह होता है कि वेरिएबल के डेटा टाइप के पैटर्न के आधार पर किसी वेरिएबल या एक्सप्रेशन का चयन किया जाता है। पैटर्न मैचिंग के और भी अन्य अलग-अलग तरीके हैं जो अलग-अलग आधार पर विकसित किए गए हैं, जिसे हम आगे देखेंगे।

अभी हमने देखा कि टाइप पैटर्न के अंतर्गत हम is ऑपरेटर के बाद एक डेटा टाइप ऑपरेंड के रूप में प्रयोग करते हैं, लेकिन इसके अलावा is ऑपरेटर के बाद अन्य भी तरह के पैटर्न का इस्तेमाल किया जा सकता है। उदाहरण के लिए, आप is ऑपरेटर के बाद किसी रिलेशनल एक्सप्रेशन (Relational Expression) का इस्तेमाल कर सकते हैं। यदि एक्सप्रेशन कॉम्प्लेक्स है, तो आप उसको पैरेंथेसिस (Parentheses) के भीतर लिख सकते हैं। यहाँ तक कि टाइप पैटर्न को नेगेटिव करने के लिए is के बाद not का भी इस्तेमाल कर सकते हैं।


स्विच स्टेटमेंट

if स्टेटमेंट से मिलता-जुलता switch स्टेटमेंट है, लेकिन इसका उपयोग तब करना चाहिए जब कई सारे else if स्टेटमेंट का प्रयोग if स्टेटमेंट के साथ करना पड़ रहा हो। ऐसी स्थिति में switch स्टेटमेंट का प्रयोग करना ज़्यादा बेहतर होता है।

switch स्टेटमेंट को समझने के लिए सबसे पहले इसके सिंटैक्स को देखते हैं। switch कीवर्ड के बाद आप पैरेंथेसिस में एक एक्सप्रेशन का इस्तेमाल करते हैं और इसके बाद कर्ली ब्रेसेस {} के भीतर आप अपना स्विच ब्लॉक बनाते हैं। एक स्विच ब्लॉक के भीतर कई सारे स्टेटमेंट हो सकते हैं। ये सारे स्टेटमेंट्स ग्रुप किए जाते हैं। ग्रुपिंग करने के लिए case क्लॉज का उपयोग किया जाता है। एक case क्लॉज के भीतर आप कई सारे स्टेटमेंट लिख सकते हैं और case क्लॉज को बंद करने के लिए break स्टेटमेंट का उपयोग किया जाता है। case क्लॉज की पहचान यह है कि case क्लॉज में case कीवर्ड के बाद एक लिटरल वैल्यू होता है, जो एक नंबर या स्ट्रिंग लिटरल हो सकता है। इन case लिटरल को हम एक तरह का लेबल मान सकते हैं, क्योंकि इनके बाद कोलन (:) का प्रयोग किया जाता है। जब भी कोई स्विच एक्सप्रेशन इस case लिटरल से मैच कर जाता है, तो उस case लिटरल के बाद आने वाले जितने भी स्टेटमेंट हैं, उनको एग्जीक्यूट किया जाता है और break स्टेटमेंट के आने पर उसके आगे आने वाले स्टेटमेंट को रन नहीं किया जाता है। यदि break स्टेटमेंट नहीं दिया जाए, तो उसके बाद के वे सारे स्टेटमेंट रन हो जाते हैं जब तक कि break स्टेटमेंट न मिले। इसलिए आमतौर पर यह प्रैक्टिस है कि हर case क्लॉज से संबंधित स्टेटमेंट का अंतिम स्टेटमेंट break स्टेटमेंट होना चाहिए। यदि case क्लॉज के किसी भी case लिटरल के साथ स्विच एक्सप्रेशन की मैचिंग नहीं हो पाती है, तब क्या होगा? इस स्थिति से निपटने के लिए जो सबसे अंतिम case स्टेटमेंट होता है, उसके बाद हम default कीवर्ड को लेबल के रूप में प्रयोग करते हैं और इस default से संबंधित जितने भी स्टेटमेंट होते हैं, इस default लेबल के बाद लिखते हैं। ध्यान दीजिए कि default लेबल के पहले case कीवर्ड का प्रयोग नहीं किया जाता है और यह सबसे अंतिम लेबल होता है। default लेबल से पहले आप अपने बाकी सारे case क्लॉज और उसके case लेबल रखते हैं।

स्विच एक्सप्रेशन, जैसा कि मैंने बताया कि पैरेंथेसिस में लिखा जाता है, यह एक्सप्रेशन किसी भी प्रकार का हो सकता है। उदाहरण के लिए, इसके भीतर एक मेथड कॉल भी किया जा सकता है जो कोई वैल्यू रिटर्न करता हो। दूसरी बातcase क्लॉज के भीतर लिखे गए स्टेटमेंट के भीतर goto case स्टेटमेंट भी हो सकता है, जिसकी मदद से आप किसी दूसरे case क्लॉज के ऊपर जंप कर सकते हैं।


स्विच पैटर्न मैचिंग

अब हम स्विच के संदर्भ में अलग-अलग तरह के पैटर्न मैचिंग को देखेंगे। सबसे आसान पैटर्न मैचिंग कॉन्स्टेंट पैटर्न मैचिंग (Constant Pattern Matching) है, जिसके अंतर्गत हर case क्लॉज का case लेबल एक कांस्टेंट वैल्यू होता है। यदि आप टाइप पैटर्न मैचिंग करना चाहते हैं, तो आपको हर case कीवर्ड के बाद डेटा टाइप और उससे संबंधित कोई लोकल वेरिएबल का प्रयोग करना होता है। यदि स्विच एक्सप्रेशन का डेटा टाइप और case क्लॉज का डेटा टाइप दोनों मैच कर जाता है, तो उससे संबंधित लोकल वेरिएबल को एक्सप्रेशन के द्वारा इनिशियलाइज कर दिया जाता है। जब आप case क्लॉज की मदद से टाइप पैटर्न मैच करते हैं तो यहां पर यह ध्यान देने वाली बात है कि case क्लॉज में डेटा टाइप का ऑर्डर मायने रखता है। ज़्यादा जनरलाइज्ड टाइप को बाद में लिखना चाहिए और कम जनरलाइज्ड टाइप के केस को पहले चेक करना चाहिए।


स्विच स्टेटमेंट बनाम स्विच एक्सप्रेशन

अब हम स्विच स्टेटमेंट और स्विच एक्सप्रेशन के बीच के अंतर को समझेंगे। स्विच स्टेटमेंट के अंतर्गत हम स्विच ब्लॉक के भीतर स्टेटमेंट को एग्जीक्यूट कर कोई वैल्यू रिटर्न नहीं करते हैं जबकि स्विच एक्सप्रेशन के केस में हम स्विच ब्लॉक के भीतर के स्टेटमेंट को रन करने के बाद उसकी वैल्यू को रिटर्न करते हैं। जिस मेथड के भीतर स्विच एक्सप्रेशन का उपयोग किया जाता है वह मेथड उस रिटर्न वैल्यू को आखिर में (finally) रिटर्न करता है। इसे हम ऐसे भी कह सकते हैं कि स्विच स्टेटमेंट जिस मेथड के भीतर प्रयोग किया जाता है उस मेथड का रिटर्न टाइप void होता है जबकि जिस मेथड के भीतर स्विच एक्सप्रेशन का उपयोग किया जाता है उस मेथड का रिटर्न टाइप कोई ऐसा डेटा टाइप होता है जो स्विच एक्सप्रेशन के रिटर्न वैल्यू से मैच करता है।

स्विच स्टेटमेंट और स्विच एक्सप्रेशन के बीच यही मुख्य अंतर है कि स्विच एक्सप्रेशन एक वैल्यू इवैल्यूएट करता है और उसे रिटर्न करता है, जबकि स्विच स्टेटमेंट मुख्य रूप से कंट्रोल फ्लो को मैनेज करने के लिए होता है और कोई वैल्यू सीधे रिटर्न नहीं करता है।

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

स्विच एक्सप्रेशन: यह एक ऐसा फीचर है जो स्विच स्टेटमेंट के समान काम करता है, लेकिन यह एक मान इवैल्यूएट करता है और उसे रिटर्न करता है। इसलिए, जिस मेथड में स्विच एक्सप्रेशन का उपयोग किया जाता है, उसका रिटर्न टाइप उस मान के प्रकार से मेल खाना चाहिए जो स्विच एक्सप्रेशन रिटर्न करता है।

संक्षेप में, स्विच स्टेटमेंट मुख्य रूप से साइड इफेक्ट्स (जैसे वेरिएबल को बदलना या आउटपुट प्रिंट करना) के लिए उपयोग किया जाता है, जबकि स्विच एक्सप्रेशन का उपयोग वैल्यू कंप्यूट करने और उसे रिटर्न करने के लिए किया जाता है।

Hot Topics