সংশোধন বলতে সাধারণত (কম্পিউটার বিজ্ঞানের বাইরে) "কিছু সত্য করে তোলা"।
প্রোগ্রামিংয়ে কিছু সংশোধন করা হয় আমরা যদি এটির বিষয়ে তথ্য অ্যাক্সেস করতে সক্ষম হয়ে তবে হয়।
সি # যা কিছু করেছে এবং যা পুনরায় সংশোধিত হয়নি তার সম্পূর্ণ দুটি অ-জেনেরিক-সম্পর্কিত উদাহরণের জন্য আসুন পদ্ধতি এবং মেমরির অ্যাক্সেস নেওয়া যাক।
ওও ভাষাগুলিতে সাধারণত পদ্ধতি থাকে , (এবং এমন অনেকের ফাংশন নেই যা শ্রেণীর সাথে আবদ্ধ না হলেও সাদৃশ্যপূর্ণ)। আপনি যেমন একটি ভাষায় একটি পদ্ধতি সংজ্ঞায়িত করতে পারেন, এটি কল করুন, সম্ভবত এটি ওভাররাইড, ইত্যাদি। এই জাতীয় সমস্ত ভাষা আপনাকে কোনও প্রোগ্রামের ডেটা হিসাবে পদ্ধতিটি নিজেই মোকাবেলা করতে দেয় না। সি # (এবং সত্যই, সি # এর পরিবর্তে নেট।) আপনাকে MethodInfo
পদ্ধতিগুলি উপস্থাপনকারী অবজেক্টগুলিকে ব্যবহার করতে দেয় না , সুতরাং সি # পদ্ধতিতে পুনরায় সংশোধন করা হয়। সি # তে পদ্ধতিগুলি হ'ল "প্রথম শ্রেণীর অবজেক্ট"।
সমস্ত ব্যবহারিক ভাষার একটি কম্পিউটারের স্মৃতি অ্যাক্সেস করার কিছু উপায় রয়েছে। সি এর মতো নিম্ন স্তরের ভাষায় আমরা কম্পিউটারের মাধ্যমে ব্যবহৃত সংখ্যার ঠিকানাগুলির মধ্যে ম্যাপিংয়ের সাথে সরাসরি ডিল করতে পারি, সুতরাং এর পছন্দগুলি int* ptr = (int*) 0xA000000; *ptr = 42;
যুক্তিসঙ্গত হয় (যতক্ষণ না আমাদের মনে করা যায় যে 0xA000000
এইভাবে মেমরির ঠিকানাটি অ্যাক্সেস পেয়েছে তার পক্ষে যুক্তিসঙ্গত কারণ রয়েছে) ' কিছু উড়িয়ে দেওয়া)। সি # তে এটি যুক্তিসঙ্গত নয় (আমরা কেবল এটি নেটকে জোর করে আনতে পারি, তবে। নেট মেমরি পরিচালনার সাহায্যে জিনিসগুলি কার্যকর করা খুব সম্ভবত সম্ভব নয়)। সি # এর রিফাইড মেমরি ঠিকানা নেই।
সুতরাং, পরিশোধিত অর্থ "তৈরি করা বাস্তব" একটি "রিফাইড টাইপ" হ'ল এক প্রকার যা আমরা প্রশ্নে ভাষায় "সম্পর্কে" কথা বলতে পারি।
জেনেরিক্সে এর অর্থ দুটি জিনিস।
একটি হ'ল List<string>
ঠিক যেমন string
বা তেমন টাইপ int
। আমরা এই ধরণের তুলনা করতে পারি, এর নাম পেতে পারি এবং এটি সম্পর্কে অনুসন্ধান করতে পারি:
Console.WriteLine(typeof(List<string>).FullName); // System.Collections.Generic.List`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
Console.WriteLine(typeof(List<string>) == (42).GetType()); // False
Console.WriteLine(typeof(List<string>) == Enumerable.Range(0, 1).Select(i => i.ToString()).ToList().GetType()); // True
Console.WriteLine(typeof(List<string>).GenericTypeArguments[0] == typeof(string)); // True
এর পরিণতি হ'ল আমরা পদ্ধতিটির মধ্যেই জেনেরিক পদ্ধতির (বা জেনেরিক শ্রেণির পদ্ধতি) পরামিতিগুলির প্রকারগুলি "সম্পর্কে" কথা বলতে পারি:
public static void DescribeType<T>(T element)
{
Console.WriteLine(typeof(T).FullName);
}
public static void Main()
{
DescribeType(42); // System.Int32
DescribeType(42L); // System.Int64
DescribeType(DateTime.UtcNow); // System.DateTime
}
একটি নিয়ম হিসাবে, এটি অত্যধিক করা "গন্ধযুক্ত", তবে এটিতে অনেকগুলি দরকারী কেস রয়েছে। উদাহরণস্বরূপ, দেখুন:
public static TSource Min<TSource>(this IEnumerable<TSource> source)
{
if (source == null) throw Error.ArgumentNull("source");
Comparer<TSource> comparer = Comparer<TSource>.Default;
TSource value = default(TSource);
if (value == null)
{
using (IEnumerator<TSource> e = source.GetEnumerator())
{
do
{
if (!e.MoveNext()) return value;
value = e.Current;
} while (value == null);
while (e.MoveNext())
{
TSource x = e.Current;
if (x != null && comparer.Compare(x, value) < 0) value = x;
}
}
}
else
{
using (IEnumerator<TSource> e = source.GetEnumerator())
{
if (!e.MoveNext()) throw Error.NoElements();
value = e.Current;
while (e.MoveNext())
{
TSource x = e.Current;
if (comparer.Compare(x, value) < 0) value = x;
}
}
}
return value;
}
এটি TSource
বিভিন্ন আচরণের জন্য বিভিন্ন ধরণের এবং বিভিন্ন ধরণের মধ্যে প্রচুর তুলনা করে না (সাধারণত এমন একটি চিহ্ন যা আপনার জেনেরিকটি ব্যবহার করা উচিত ছিল না) তবে এটি কোনও কোড পাথের মধ্যে বিভক্ত হয়ে থাকে যেগুলি হতে পারে null
(যদি ফিরে আসে null
তবে কোনও উপাদান পাওয়া যায় নি, এবং তুলনার তুলনায় অবশ্যই উপাদানগুলির মধ্যে একটির তুলনায় কমপক্ষে তুলনা করতে হবে না null
) এবং যে ধরণের হতে পারে না এমন কোডগুলির পাথ null
(কোনও উপাদান না পাওয়া গেলে নিক্ষেপ করা উচিত এবং null
উপাদানগুলির সম্ভাবনা সম্পর্কে চিন্তিত হওয়ার দরকার নেই) )।
কারণ TSource
পদ্ধতির মধ্যে "আসল", এই তুলনাটি রানটাইম বা জিট করার সময় করা যেতে পারে (সাধারণত জিট করার সময়, অবশ্যই উপরের কেসটি লিখনের সময় এমনটি করবে এবং পথটির জন্য মেশিন কোড তৈরি করবে না) এবং আমাদের একটি রয়েছে প্রতিটি ক্ষেত্রে পৃথক পৃথক "বাস্তব" সংস্করণ। (যদিও একটি অপ্টিমাইজেশন হিসাবে, মেশিন কোডটি বিভিন্ন রেফারেন্স-ধরণের ধরণের পরামিতিগুলির জন্য বিভিন্ন পদ্ধতির জন্য ভাগ করা হয়, কারণ এটি এটিকে প্রভাবিত না করেই হতে পারে, এবং সেইজন্য আমরা মেশিন কোড জিটযুক্ত পরিমাণ হ্রাস করতে পারি)।
(সি # তে জেনেরিক ধরণের পুনর্নির্মাণের বিষয়ে কথা বলা সাধারণ নয়, যদি না আপনি জাভা সম্পর্কেও আলোচনা করেন, কারণ সি # তে আমরা কেবল এই সংশোধনকে মর্যাদাবান হিসাবে গ্রহণ করি না; সমস্ত প্রকারের পুনরায় সংশোধন করা হয়। জাভাতে, জেনেরিক প্রকারভেদগুলি রেফাইড হিসাবে উল্লেখ করা হয় কারণ এটি তাদের এবং জেনেরিক ধরণের মধ্যে পার্থক্য)।