আমি VB.NET এর জন্য মাইক্রোসফ্ট টিউটোরিয়ালে ব্যবহৃত এই দুটি শব্দ শুনে আসছি। ভেরিয়েবলের রেফারেন্সে ব্যবহৃত হলে এই দুটি শব্দের মধ্যে পার্থক্য কী?
আমি VB.NET এর জন্য মাইক্রোসফ্ট টিউটোরিয়ালে ব্যবহৃত এই দুটি শব্দ শুনে আসছি। ভেরিয়েবলের রেফারেন্সে ব্যবহৃত হলে এই দুটি শব্দের মধ্যে পার্থক্য কী?
উত্তর:
সি # তে চলকগুলি 2 টির মধ্যে 1 টিতে রয়েছে। মান প্রকার বা রেফারেন্স প্রকার। প্রকারভেদ পছন্দ int
এবং DateTime
হয় মান ধরনের। বিপরীতে, আপনার তৈরি করা কোনও শ্রেণি একটি রেফারেন্স টাইপ। সি # স্ট্রিংগুলিও একটি রেফারেন্স টাইপ। .NET ফ্রেমওয়ার্কের বেশিরভাগ জিনিসই রেফারেন্সের ধরণ।
এখানে ভেরিয়েবলের নাম এবং এর মান । দুটি অংশ ।
ভেরিয়েবলের নামটি আপনি এটি হিসাবে ঘোষণা করেন। মান কি তুমি ধার্য এটি।
ভেরিয়েবল ঘোষণার সময় সমস্ত ভেরিয়েবলকে সর্বদা প্রাথমিক মান দেওয়া হয় । সুতরাং সমস্ত ভেরিয়েবল সূচনা করা হয় ।
জন্য মান ধরনের, মত int
কম্পাইলার তাদের একটি বৈধ মান যদি আপনি তা স্পষ্টভাবে না দেব। int
এর আরম্ভ ডিফল্টরূপে শুন্যতে, DateTime
এর আরম্ভ করার DateTime.MinValue
ডিফল্টরূপে।
রেফারেন্স প্রকারের ভেরিয়েবলগুলি আপনি যে বস্তুর এটি দিয়েছিলেন তা সূচনা করে। সংকলক কোনও বস্তু (অর্থাত্ একটি বৈধ মান) বরাদ্দ করবে না যদি আপনি না করেন। এক্ষেত্রে মানটি null
- কিছুই নয় nothing সুতরাং আমরা বলতে যে রেফারেন্স সক্রিয়া নাল করতে।
মানুষের জন্ম হয়। বস্তু তাত্ক্ষণিক হয়। একটি শিশু হিউম্যানের উদাহরণ , একটি বস্তু কোনও কোনও শ্রেণীর উদাহরণ ।
কোনও শ্রেণীর উদাহরণ তৈরির কাজটিকে তাত্ক্ষণিকরণ (তা-দা!) বলা হয়
MyClass myClassyReference = new MyClass();
উপরে, এটা বলা ভুল "... একটি একটি দৃষ্টান্ত তৈরি বস্তুর ..."
সম্পাদনা - মন্তব্য আলোচনার মাধ্যমে অনুপ্রাণিত
স্বতন্ত্র পরিভাষা ব্যবহার করে তিনটি স্বতন্ত্র জিনিস চলছে (উপরে) এবং সেই পরিভাষাটি বিনিময়যোগ্য নয়:
MyClass myClassyReference
new MyClass()
=
।তথ্য পুনরায়:
একটি রেফারেন্স-টাইপ ভেরিয়েবলকে কেবল "একটি রেফারেন্স" বলা হয়। একটি "মান-ধরণের ভেরিয়েবল" কোনও রেফারেন্স নয়।
এটি: "অবজেক্টএ কোনও অবজেক্টের উদাহরণ" গভীরভাবে ভুল। যদি অবজেক্টএ "অবজেক্টবি'র উদাহরণ ছিল" তবে অবশ্যই এটি হতে হবে যে অবজেক্টএ জীবন শুরু করবে অবজেক্টবি'র টাইপ - যা কিছু হোক - এবং বর্তমান অবস্থা - যা কিছু হোক না কেন। অবজেক্টবি পরিবর্তন হিসাবে D, E এবং F অবজেক্ট তৈরি করার বিষয়ে কী বলা যায়? না, না! এটি ধারণাগত এবং প্রযুক্তিগত ক্ষেত্রে "অবজেক্টএ একটি শ্রেণীর উদাহরণ"। "ইনস্ট্যান্টেশন" এবং "উদাহরণ" এর সুনির্দিষ্ট অর্থ রয়েছে - কোনও শ্রেণি থেকে কোনও বস্তুর তার ধরণ, সংজ্ঞা এবং মান পাওয়া যায়।
MyClass myClassyReference = null
সাধারণত আমরা বলি না যে "ভেরিয়েবল নালকে বরাদ্দ করা হয়েছে" এবং আমরা কখনই "ভেরিয়েবলটি নালকে রেফারেন্সিং করি" না, এর পরিবর্তে আমরা "ভেরিয়েবলটি নাল" বলে না; বা "ভেরিয়েবল কিছু উল্লেখ করে না", বা "রেফারেন্স নাল"
ব্যবহারিক প্রয়োগ:
আমি আপনার কোডটিতে আমার আঙুলটি চেপে ধরে বলি "এই দৃষ্টান্তটির একটি অবৈধ সম্পত্তি রয়েছে Maybe সম্ভবত সে কারণেই লুপটি ব্যর্থ হয় an আপনি ইনস্ট্যান্টেশনের সময় প্যারামিটারগুলি বৈধ করতে হবে।" (অর্থাত্ নির্মাণকারী যুক্তি)।
আমি আপনার কোড এ এটি দেখতে,
MyClass myClassyReference;
myClassyReference.DoSomething();
"আপনি ভেরিয়েবলটি ঘোষণা করেছেন কিন্তু কখনই বরাদ্দ করেননি it's এটি নাল তাই এটি কোনও বিষয় উল্লেখ করা হচ্ছে না That's এজন্য পদ্ধতি কলটি একটি ব্যতিক্রম ছুঁড়ে।"
শেষ সম্পাদনা
একটি রেফারেন্স ধরণের ভেরিয়েবলের নাম এবং মান স্বাধীনভাবে বিদ্যমান। এবং আমি স্বাধীন বলতে চাই না।
একটি তাত্ক্ষণিক বস্তুর এর সাথে রেফারেন্স থাকতে পারে বা নাও থাকতে পারে।
একটি তাত্ক্ষণিক বস্তুর এর সাথে অনেকগুলি উল্লেখ থাকতে পারে।
একটি ঘোষিত রেফারেন্স কোনও অবজেক্টের দিকে নির্দেশ করতে পারে বা নাও পারে ।
একটি ভেরিয়েবল একটি মান দিয়ে আরম্ভ করা হয়। যখন কোনও বস্তু তাত্ক্ষণিকভাবে মেমরির জন্য বরাদ্দ করা হয় এবং এটির কনস্ট্রাক্টর চালিত হয়।
উদাহরণস্বরূপ এখানে একটি পরিবর্তনশীল:
Dim obj as Object
এই পরিবর্তনশীলটি আরম্ভ করা হয়নি । একবার আমি obj
ভেরিয়েবলের জন্য একটি মান নির্ধারণ করি , ভেরিয়েবলটি আরম্ভ করা হবে। এখানে সূচনা উদাহরণ:
obj = 1
obj = "foo"
ইনস্ট্যান্টেশন একটি খুব আলাদা জিনিস তবে তবুও ইনস্ট্যান্টেশন সাধারণত আরম্ভের পরে অনুসরণ করা সম্পর্কিত:
Dim obj As New Object()
কোডের পূর্ববর্তী লাইন ইন, obj
পরিবর্তনশীল হয় সক্রিয়া নতুন রেফারেন্স সহ Object
ছিল instantiated । আমরা বলি যে Object
নতুনটি তাত্ক্ষণিকভাবে তৈরি হয়েছিল কারণ আমরা এটির একটি নতুন উদাহরণ তৈরি করেছি।
এখন আমি বিশ্বাস করি যে ভিবি.এনইটি এটি সি # এর চেয়ে অনেক বেশি বিভ্রান্তিকর করে তোলে কারণ এটি পরিষ্কার নয় যে উপরের কোডে কোনও অ্যাসাইনমেন্ট চলছে। সি # তে এটি আরও স্পষ্ট যে এখানে একটি উদাহরণের ইনস্ট্যান্টেশন এবং ভেরিয়েবলের সূচনা উভয়ই রয়েছে:
Object obj = new Object();
কিছু শুরু করার জন্য এটির প্রাথমিক মান সেট করা। করতে instantiate কিছু এটি একটি দৃষ্টান্ত তৈরি করা।
প্রায়শই এটি কমবেশি একই জিনিস। এই:
SqlConnection conn = new SqlConnection();
instantiates একটি SqlConnection
বস্তু, এবং সূচনাconn
যে দৃষ্টান্ত থেকে এটি সেটিং দ্বারা পরিবর্তনশীল।
যেহেতু কোনও অবজেক্টের কনস্ট্রাক্টরও বস্তুর বৈশিষ্ট্যগুলিকে তাদের ডিফল্ট মানগুলিতে সেট করে, তাই প্রায়ই এটি সঠিকভাবে বলা যায় যে কোনও বস্তুর তাত্ক্ষণিককরণ এটি আরম্ভ করে। (বিভ্রান্তিকর, যদি বস্তুটি এমন কোনও পদ্ধতি উদ্ভাসিত করে যা আপনাকে তাৎক্ষণিকভাবে ইনস্ট্যান্ট করার পরে এটি সূচনা করার জন্য কল করতে হয়, যেমনটি কখনও কখনও ঘটে থাকে))
ইনস্ট্যান্টিয়েটেড মানে হ'ল অবজেক্টের একটি উদাহরণ তৈরি করা হয়েছে। আরম্ভ করা মানে একই জিনিসটি কিছু কিছু সূচনা করেছে object
আপনি যখন কোনও শ্রেণি বা অবজেক্ট ইনস্ট্যান্ট করেন, আপনি এটির একটি নতুন উদাহরণ তৈরি করছেন, বা একটিটিকে "ধরে রাখতে" মেমরি বরাদ্দ করছেন। এই অবজেক্টটি আরম্ভ করা হ'ল নির্দেশনা যা তাত্ক্ষণিক সময়ে সঞ্চালিত হয়।
ইনস্ট্যান্টেশন হল যখন আপনি কোনও শ্রেণীর উদাহরণ তৈরি করেন। সেই উদাহরণটি তখন কোনও বস্তু এবং আপনি এর বৈশিষ্ট্যগুলি সেট করতে পারেন, বা এটিতে পদ্ধতি কল করতে পারেন (এটি কাজ করতে বলুন)।
আপনি যখন কোনও কিছুর জন্য প্রাথমিক অবস্থার একটি সেট আপ করেন তখন দীক্ষা হয়। এটি কোনও বস্তু হতে পারে, যেখানে আপনি নিজেকে এটি সূচনা করার জন্য বলছেন বা একটি ভেরিয়েবল যার সাথে আপনি কোনও মূল্য নির্ধারণ করেন।
কোনও বস্তু অন্য কিছু জিনিস সূচনা করতে পারে, বা এমনকি অন্য বস্তুকে তার দীক্ষার অংশ হিসাবে ইনস্ট্যান্টিয়েট করতে পারে।
পার্থক্যটি হ'ল ইনস্ট্যান্টেশন হল এমন একটি জিনিস যা সৃষ্টি করতে পারে of দীক্ষা এমন জিনিস যা সম্পন্ন হয়।
জাভা ডক্স দেখুন: https://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html
" পয়েন্ট অরিজিনওন = নতুন পয়েন্ট (23, 94);
Declaration: The code set in bold are all variable declarations that associate a variable name with an object type.
Instantiation: The new keyword is a Java operator that creates the object.
Initialization: The new operator is followed by a call to a constructor, which initializes the new object."
আমরা এটি এইভাবে দেখতে পারি। নীচের কোডের একটি লাইনের জন্য:
var p = new Person();
উপরের লাইনটি নিম্নলিখিত দুটি উপায়ে পড়া যায়:
রেফারেন্স বা প্রসঙ্গ বিষয় বিষয়। ভেরিয়েবলের ক্ষেত্রে কথা বলার সময় আমরা আদ্যক্ষর শব্দটি ব্যবহার করি । ক্লাস / টাইপের ক্ষেত্রে কথা বলার সময় আমরা ইনস্ট্যান্টিয়েট শব্দটি ব্যবহার করি ।
ইনস্ট্যান্টেশন বলতে কোনও শ্রেণীর উদাহরণ তৈরি করতে মেমরির বরাদ্দকে বোঝায় যেখানে সূচনাটি সেই উদাহরণটির পরিবর্তনশীল নাম নির্ধারণ করে সেই উদাহরণটির নামকরণকে বোঝায়।
উদাহরণ: SqlConnection conn = new SqlConnection();
এখানে new
একটি কীওয়ার্ড যা একটি উদাহরণের জন্য মেমরি conn
বরাদ্দ করে এবং সেই উদাহরণটির জন্য নির্ধারিত একটি পরিবর্তনীয় নাম।
অন্যরা পার্থক্যটি ব্যাখ্যা করেছে, তাই আমি বিশদে যাব না। তবে এমন কিছু ঘটনা রয়েছে যেখানে ইনস্ট্যান্টেশন কোনও জিনিসকে সঠিকভাবে আরম্ভ করে না। আপনি যখন কোনও বস্তু তাত্ক্ষণিকভাবে চালু করেন আপনি কিছু ডেটা দিয়ে এটিকে আরম্ভও করেন। শ্রেণি / প্রকারের সূচনাবিদ্যার যুক্তি থাকবে, যেখানে ইনস্ট্যান্টেশন লজিক সাধারণত মূলশব্দ দ্বারা চালিত হয় new
(মূলত মেমরি বরাদ্দ, রেফারেন্স অনুলিপি ইত্যাদি)। তবে তাত্ক্ষণিকভাবে অবজেক্টগুলির জন্য কার্যকর বৈধ অবস্থার প্রয়োজন নেই যা আমরা যখন বলতে পারি যে অবজেক্টটি অবিচ্ছিন্ন করা হয়েছে । এখানে একটি ব্যবহারিক উদাহরণ যেখানে কোনও বস্তু তাত্ক্ষণিকভাবে শুরু করা যেতে পারে তবে আরম্ভ করা যায় না (দুঃখিত, সি # তে)।
class P { string name = "Ralf"; }
WriteLine(new P().name); // "Ralf";
WriteLine((FormatterServices.GetUninitializedObject(typeof(P)) as P).name); // null
GetUninitializedObject
কনস্ট্রাক্টরকে সেখানে অবজেক্টটি ইনস্ট্যান্ট করার জন্য ডাকে না (তবে কিছু অভ্যন্তরীণ যাদু)।
কেউ যুক্তি দিতে পারে যে মান ধরণেরগুলি তাত্ক্ষণিকভাবে নয় তবে কেবল সূচনা করা হয় কারণ এটি করার সময় নতুন বরাদ্দের প্রয়োজন হয় না new..
তবে এটি ইনস্ট্যানটিশনের সংজ্ঞা অনুসারে।