সংশোধন কী?


163

আমি জানি যে জাভা ক্ষয়ের সাথে প্যারামেট্রিক পলিমারফিজম (জেনারিক্স) প্রয়োগ করে। মুছে ফেলা কি তা আমি বুঝতে পারি।

আমি জানি যে সি # রেফারেন্স সহ প্যারামেট্রিক পলিমারফিজম প্রয়োগ করে। আমি জানি যে আপনি লিখতে পারেন

public void dosomething(List<String> input) {}
public void dosomething(List<Int> input) {}

অথবা আপনি রানটাইম এ জানি যে করতে পারি কিছু parameterised ধরণ পরামিতি, কিন্তু আমি বুঝতে পারছি না এটা কি হয়

  • একটি সংশোধিত ধরনের কি?
  • একটি সংশোধিত মান কি?
  • কোনও প্রকার / মান পুনরায় সংশোধন করা হলে কী ঘটে?

এটি কোনও উত্তর নয়, তবে যে কোনও উপায়ে
হারিঞ্জার

@ হেরঞ্জার যা "মুছে ফেলা কী" এই প্রশ্নের উত্তর মোটামুটি ভাল বলে মনে হয়েছে এবং মূলত "মুছে ফেলা নয়" দিয়ে "কিসের পুনঃসংশোধন" তা উত্তর দেবে বলে মনে হচ্ছে - এখানে পোস্ট করার আগে প্রাথমিকভাবে উত্তর অনুসন্ধান করার সময় আমি একটি সাধারণ থিম পেয়েছি।
মার্টিজন

5
... আর আমার চিন্তা পুনরায় ছিল ification একটি রূপান্তর প্রক্রিয়া switchএকটি থেকে কনস্ট্রাক্ট ফিরে if/ else, যখন এটি পূর্বে একটি থেকে রূপান্তরিত হয়েছে if/ elseএকটি থেকে switch...
ডিজিটাল ট্রমা

8
রেস , reis লাতিন ভাষায় জিনিস তাই হয়, reification আক্ষরিক হয় thingification । সি # এর শব্দটি যতদূর ব্যবহার করা যায় ততটুকু অবদান রাখার মতো আমার কাছে দরকারী কিছু নেই তবে তারা এবং এটি নিজেরাই যে বিষয়টি ব্যবহার করেছে তা আমাকে হাসিয়ে তোলে।
কেআরয়ান

উত্তর:


209

রেফারেশন হল একটি বিমূর্ত জিনিস গ্রহণ এবং একটি কংক্রিট জিনিস তৈরি করার প্রক্রিয়া।

সি # জেনেরিক্সে শব্দটি পুনঃনির্ধারণকরণটি সেই প্রক্রিয়াটিকে নির্দেশ করে যার মাধ্যমে একটি জেনেরিক ধরণের সংজ্ঞা এবং এক বা একাধিক জেনেরিক ধরণের আর্গুমেন্ট (বিমূর্ত জিনিস) একত্রিত হয়ে একটি নতুন জেনেরিক প্রকার (কংক্রিট জিনিস) তৈরি করা হয়।

ফ্রেজ এটা ভিন্নভাবে, এটা সংজ্ঞা গ্রহণ প্রক্রিয়া List<T>এবং intএবং একটি কংক্রিট উত্পাদক List<int>প্রকার।

এটি আরও বুঝতে, নিম্নলিখিত পদ্ধতির তুলনা করুন:

  • জাভা জেনেরিক্সে, জেনেরিক প্রকারের সংজ্ঞাটি সমস্ত মঞ্জুরিযুক্ত ধরণের আর্গুমেন্ট সংমিশ্রণে ভাগ করে নেওয়া মূলত একটি কংক্রিট জেনেরিক ধরণের রূপান্তরিত হয়। সুতরাং, একাধিক (উত্স কোড স্তর) প্রকারগুলি এক (বাইনারি স্তর) প্রকারে ম্যাপ করা হয় - তবে ফলস্বরূপ, কোনও উদাহরণের ধরণের আর্গুমেন্ট সম্পর্কিত তথ্য সেই পরিস্থিতিতে (টাইপ ক্ষয়) বাতিল করা হয়

    1. এই বাস্তবায়ন কৌশলটির পার্শ্ব প্রতিক্রিয়া হিসাবে, কেবলমাত্র জেনেরিক ধরণের আর্গুমেন্টগুলি যা দেশীয়ভাবে অনুমোদিত হয় সেগুলি হ'ল সেই ধরণের যা তাদের কংক্রিটের ধরণের বাইনারি কোড ভাগ করতে পারে; যার অর্থ সেই ধরণের যাদের স্টোরেজ লোকেশনগুলির মধ্যে বিনিময়যোগ্য উপস্থাপনা রয়েছে; যার অর্থ রেফারেন্স প্রকারগুলি। জেনেরিক ধরণের আর্গুমেন্ট হিসাবে মান ধরণের ব্যবহারের জন্য তাদের বক্সিং করা প্রয়োজন (এগুলি একটি সাধারণ রেফারেন্স টাইপের মোড়কে রেখে দেওয়া)।
    2. জেনারিকগুলি এভাবে প্রয়োগ করতে কোনও কোড নকল করা হয় না।
    3. টাইপ তথ্য যা রানটাইম এ উপলব্ধ হতে পারে (প্রতিবিম্ব ব্যবহার করে) হারিয়ে গেছে। এর পরিবর্তে এর অর্থ হ'ল জেনেরিক ধরণের বিশেষায়িতকরণ (যে কোনও জেনেরিক যুক্তির সংমিশ্রণের জন্য বিশেষ উত্স কোড ব্যবহারের ক্ষমতা ) খুব সীমাবদ্ধ।
    4. এই প্রক্রিয়াটি রানটাইম পরিবেশের সহায়তা প্রয়োজন হয় না।
    5. কোনও জাভা প্রোগ্রাম বা একটি জেভিএম-ভিত্তিক ভাষা ব্যবহার করতে পারে এমন ধরণের তথ্য ধরে রাখতে কয়েকটি কার্যকার্য রয়েছে
  • সি # জেনেরিকসে, জেনেরিক টাইপ সংজ্ঞাটি রানটাইমের সময় স্মৃতিতে বজায় থাকে। যখনই কোনও নতুন কংক্রিটের ধরণের প্রয়োজন হয়, রানটাইম পরিবেশটি জেনেরিক ধরণের সংজ্ঞা এবং প্রকারের আর্গুমেন্টগুলিকে একত্রিত করে নতুন প্রকার (পুনর্বিবেচনা) তৈরি করে। সুতরাং আমরা রানটাইমে টাইপ আর্গুমেন্টের প্রতিটি সংমিশ্রণের জন্য একটি নতুন টাইপ পাই ।

    1. এই বাস্তবায়ন কৌশলটি যে কোনও ধরণের যুক্তি সংমিশ্রণটিকে তাত্ক্ষণিকভাবে মঞ্জুরি দেয়। জেনেরিক ধরণের আর্গুমেন্ট হিসাবে মানের ধরণগুলি ব্যবহারের ফলে বক্সিং হয় না, কারণ এই ধরণেরগুলি তাদের নিজস্ব বাস্তবায়ন পায়। ( বক্সিং এখনও সি # তে রয়েছে , অবশ্যই - তবে এটি অন্যান্য দৃশ্যে ঘটে, এটি নয়।)
    2. কোড অনুলিপি একটি বিষয় হতে পারে - কিন্তু বাস্তবে তা নয় কারণ পর্যাপ্ত স্মার্ট বাস্তবায়ন ( এই মাইক্রোসফট .NET অন্তর্ভুক্ত এবং মনো ) কিছু instantiations কোড শেয়ার করতে পারেন।
    3. প্রকারের তথ্য রক্ষণাবেক্ষণ করা হয়, যা প্রতিচ্ছবি ব্যবহার করে টাইপ আর্গুমেন্টগুলি পরীক্ষা করে কিছুটা বিশেষীকরণের অনুমতি দেয়। যাইহোক, বিশেষায়নের ডিগ্রি সীমাবদ্ধ, ফলস্বরূপ যে কোনও জেনেরিক ধরণের সংজ্ঞা সংশোধন হওয়ার আগে সংকলিত হয় ( এটি টাইপ পরামিতিগুলির সীমাবদ্ধতার বিরুদ্ধে সংজ্ঞা সংকলন করে করা হয় - সুতরাং, সংকলককে সক্ষম হতে হবে নির্দিষ্ট ধরণের আর্গুমেন্টের অভাবে এমনকি সংজ্ঞাটি "বুঝতে" )।
    4. এই বাস্তবায়ন কৌশলটি রানটাইম সমর্থন এবং জেআইটি-সংকলনের উপর খুব বেশি নির্ভর করে (এজন্য আপনি প্রায়শই শুনতে পান যে আইওএসের মতো প্ল্যাটফর্মগুলিতে সি # জেনেরিকগুলির কিছু সীমাবদ্ধতা রয়েছে , যেখানে ডায়নামিক কোড উত্পন্নকরণ সীমাবদ্ধ রয়েছে)।
    5. সি # জেনেরিকের প্রসঙ্গে, রানটাইম পরিবেশ দ্বারা আপনার জন্য পুনর্বিবেচনা সম্পন্ন করা হয়। তবে, আপনি যদি জেনেরিক ধরণের সংজ্ঞা এবং একটি কংক্রিট জেনেরিক ধরণের মধ্যে পার্থক্যটি আরও স্বজ্ঞাতভাবে বুঝতে চান তবে ক্লাসটি ব্যবহার করে আপনি সর্বদা নিজেরাই একটি সংস্কার করতে পারেনSystem.Type (এমনকি সাধারণ জেনেরিক ধরণের যুক্তির সংমিশ্রণটি আপনি ইনস্ট্যান্ট করছেন না কেন ' টি সরাসরি আপনার উত্স কোড প্রদর্শিত হবে)।
  • সি ++ টেম্পলেটগুলিতে, টেমপ্লেট সংজ্ঞাটি সংকলনের সময় স্মৃতিতে বজায় থাকে। উত্স কোডে যখনই কোনও টেম্পলেট ধরণের নতুন ইনস্ট্যান্টেশন প্রয়োজন হয়, সংকলক টেম্পলেট সংজ্ঞা এবং টেম্পলেট যুক্তিগুলির সংমিশ্রণ করে এবং নতুন প্রকারটি তৈরি করে। সুতরাং আমরা সংকলন সময়ে টেমপ্লেট আর্গুমেন্টগুলির প্রতিটি সংমিশ্রণের জন্য একটি অনন্য ধরণের পাই ।

    1. এই বাস্তবায়ন কৌশলটি যে কোনও ধরণের যুক্তি সংমিশ্রণটিকে তাত্ক্ষণিকভাবে মঞ্জুরি দেয়।
    2. এটি বাইনারি কোড সদৃশ হিসাবে পরিচিত তবে পর্যাপ্ত স্মার্ট সরঞ্জাম-চেইন এটি সনাক্ত করতে পারে এবং কিছু ইনস্ট্যানটিশনের জন্য কোডটি ভাগ করে নিতে পারে।
    3. টেমপ্লেট সংজ্ঞা নিজেই "সংকলিত" নয় - কেবলমাত্র এর কংক্রিট ইনস্ট্যান্টেশনগুলি আসলে সংকলিত । এটি সংকলকটিতে কম সীমাবদ্ধতা রাখে এবং আরও বৃহত্তর ডিগ্রিকে অনুমতি দেয় টেম্পলেট বিশেষায়নের
    4. যেহেতু সংকলন সময়ে টেমপ্লেট ইনস্ট্যান্টেশনগুলি সঞ্চালিত হয়, তাই এখানে কোনও রানটাইম সমর্থন প্রয়োজন হয় না।
    5. এই প্রক্রিয়াটি ইদানীং মনোমরফাইজেশন হিসাবে উল্লেখ করা হয় , বিশেষত মরিচা সম্প্রদায়ের মধ্যে। শব্দটি প্যারামেট্রিক পলিমারফিজমের বিপরীতে ব্যবহৃত হয় , যা জেনেরিকগুলি থেকে আসা ধারণার নাম।

7
সি ++ টেম্পলেটগুলির সাথে দুর্দান্ত তুলনা ... তারা সি # এর এবং জাভা জেনেরিকের মধ্যে কোথাও কোথাও পড়বে বলে মনে হচ্ছে। সি # এর মতো বিভিন্ন নির্দিষ্ট জেনেরিক প্রকারগুলি পরিচালনা করার জন্য আপনার আলাদা কোড এবং কাঠামো রয়েছে তবে এটি সব জাভা এর মতো সংকলন-সময়ে সম্পন্ন হয়েছে।
লুয়ান

3
এছাড়াও, সি ++ এ এটি টেমপ্লেট বিশেষায়িতকরণ প্রবর্তন করতে সক্ষম করে, যেখানে প্রতিটি (বা কিছু কিছু) কংক্রিটের ধরণের বিভিন্ন বাস্তবায়ন থাকতে পারে। স্পষ্টতই জাভাতে সম্ভব নয়, তবে সি # তেও নয়।
কোয়েটজলকোটল

@ কোয়েটজলক্যাটল যদিও এটি ব্যবহারের এক কারণ পয়েন্টার ধরণের সাথে উত্পাদিত কোডের পরিমাণ হ্রাস করা এবং সি # পর্দার অন্তর্ভুক্ত রেফারেন্স ধরণের সাথে তুলনীয় কিছু করে। তবুও, এটি ব্যবহারের একমাত্র কারণ, এবং স্পষ্টতই এমন কিছু সময় আসে যখন টেমপ্লেট বিশেষায়িতকরণটি দুর্দান্ত।
জন হানা

জাভার জন্য, আপনি যুক্ত করতে পারেন যে টাইপ তথ্য মুছে ফেলা হওয়ার সময়, সংকলক দ্বারা ক্যাসেটগুলি যুক্ত করা হয়, বাই-কোডকে প্রাক-জেনেরিক বাইটকোড থেকে পৃথক করা যায়।
মরিচা কোর

27

সংশোধন বলতে সাধারণত (কম্পিউটার বিজ্ঞানের বাইরে) "কিছু সত্য করে তোলা"।

প্রোগ্রামিংয়ে কিছু সংশোধন করা হয় আমরা যদি এটির বিষয়ে তথ্য অ্যাক্সেস করতে সক্ষম হয়ে তবে হয়।

সি # যা কিছু করেছে এবং যা পুনরায় সংশোধিত হয়নি তার সম্পূর্ণ দুটি অ-জেনেরিক-সম্পর্কিত উদাহরণের জন্য আসুন পদ্ধতি এবং মেমরির অ্যাক্সেস নেওয়া যাক।

ওও ভাষাগুলিতে সাধারণত পদ্ধতি থাকে , (এবং এমন অনেকের ফাংশন নেই যা শ্রেণীর সাথে আবদ্ধ না হলেও সাদৃশ্যপূর্ণ)। আপনি যেমন একটি ভাষায় একটি পদ্ধতি সংজ্ঞায়িত করতে পারেন, এটি কল করুন, সম্ভবত এটি ওভাররাইড, ইত্যাদি। এই জাতীয় সমস্ত ভাষা আপনাকে কোনও প্রোগ্রামের ডেটা হিসাবে পদ্ধতিটি নিজেই মোকাবেলা করতে দেয় না। সি # (এবং সত্যই, সি # এর পরিবর্তে নেট।) আপনাকে 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পদ্ধতির মধ্যে "আসল", এই তুলনাটি রানটাইম বা জিট করার সময় করা যেতে পারে (সাধারণত জিট করার সময়, অবশ্যই উপরের কেসটি লিখনের সময় এমনটি করবে এবং পথটির জন্য মেশিন কোড তৈরি করবে না) এবং আমাদের একটি রয়েছে প্রতিটি ক্ষেত্রে পৃথক পৃথক "বাস্তব" সংস্করণ। (যদিও একটি অপ্টিমাইজেশন হিসাবে, মেশিন কোডটি বিভিন্ন রেফারেন্স-ধরণের ধরণের পরামিতিগুলির জন্য বিভিন্ন পদ্ধতির জন্য ভাগ করা হয়, কারণ এটি এটিকে প্রভাবিত না করেই হতে পারে, এবং সেইজন্য আমরা মেশিন কোড জিটযুক্ত পরিমাণ হ্রাস করতে পারি)।

(সি # তে জেনেরিক ধরণের পুনর্নির্মাণের বিষয়ে কথা বলা সাধারণ নয়, যদি না আপনি জাভা সম্পর্কেও আলোচনা করেন, কারণ সি # তে আমরা কেবল এই সংশোধনকে মর্যাদাবান হিসাবে গ্রহণ করি না; সমস্ত প্রকারের পুনরায় সংশোধন করা হয়। জাভাতে, জেনেরিক প্রকারভেদগুলি রেফাইড হিসাবে উল্লেখ করা হয় কারণ এটি তাদের এবং জেনেরিক ধরণের মধ্যে পার্থক্য)।


আপনি কি মনে Minকরেন না যে উপরেরটি দরকারী কি করতে সক্ষম হবেন ? অন্যথায় এর নথিভুক্ত আচরণটি সম্পাদন করা খুব কঠিন।
জন হানা

আমি বাগটিকে (আন) ডকুমেন্টেড আচরণ হিসাবে বিবেচনা করি এবং সেই আচরণটি কার্যকর বলে বোঝায় (একদিকে যেমন, Enumerable.Min<TSource>খালি সংগ্রহের ক্ষেত্রে অ-রেফারেন্সের ধরণের জন্য ব্যবহার করা হয় না তবে এর আচরণ আলাদা হয় তবে ডিফল্ট ফিরে আসে) (টিসোর্স), এবং কেবলমাত্র "জেনেরিক সিকোয়েনে সর্বনিম্ন মান ফেরত দেয়" হিসাবে নথিভুক্ত করা হয় I আমি উভয়কেই খালি সংগ্রহ করা উচিত, বা একটি "শূন্য" উপাদানটি বেসলাইন হিসাবে পাস করা উচিত এবং তুলনা / তুলনা ফাংশন সর্বদা পাস করা উচিত)
মারটিজন

1
এটি বর্তমান মিনের তুলনায় অনেক কম দরকারী হবে, যা নন-অযোগ্য প্রকারভেদে অসম্ভবকে চেষ্টা না করেই nlalable ধরণের সাধারণ ডিবি ব্যবহারের সাথে মেলে। (বেসলাইন ধারণাটি অসম্ভব নয়, তবে এমন কোনও মূল্য নেই যদি না আপনি জানতে পারেন এমন উত্স কখনও না থাকে)
জন হানা

1
থিংফিকেশন এটির জন্য আরও ভাল নাম হত। :)
tchrist

@ ক্রিশ্চ একটি জিনিস অবাস্তব হতে পারে।
জন হান্না

15

হিসাবে duffymo ইতিমধ্যে লক্ষনীয় , "reification" নয় কী পার্থক্য আছে।

জাভাতে জেনেরিক্স মূলত কমপাইল-সময় সমর্থন উন্নত করতে পারে - এটি আপনাকে আপনার কোডে দৃ strongly়ভাবে টাইপ করা উদাহরণস্বরূপ সংগ্রহগুলি ব্যবহার করতে দেয় এবং আপনার জন্য টাইপ সুরক্ষার ব্যবস্থা করে। তবে এটি কেবল সংকলন-সময়ে উপস্থিত রয়েছে - সংকলিত বাইটকোডের আর জেনেরিকের কোনও ধারণা নেই; সমস্ত জেনেরিক প্রকারগুলি "কংক্রিট" প্রকারে রূপান্তরিত হয় ( objectজেনেরিক প্রকারটি আনবাউন্ড করা না থাকলে ব্যবহার করে ), প্রকারের রূপান্তর এবং টাইপ চেকগুলি প্রয়োজনীয় হিসাবে যুক্ত করে।

। নেট, জেনেরিকস সিএলআর এর একটি অবিচ্ছেদ্য বৈশিষ্ট্য। আপনি যখন জেনেরিক প্রকারটি সংকলন করেন, তখন উত্পন্ন আইএলটিতে এটি জেনেরিক থাকে। এটি কেবল জাভা হিসাবে নন-জেনেরিক কোডে রূপান্তরিত হয়নি।

জেনারিকরা বাস্তবে কীভাবে কাজ করে তার উপর এর বেশ কয়েকটি প্রভাব রয়েছে। উদাহরণ স্বরূপ:

  • জাভা SomeType<?>আপনাকে প্রদত্ত জেনেরিক ধরণের যে কোনও কংক্রিট বাস্তবায়ন পাস করতে দেয়। সি # এটি করতে পারে না - প্রতিটি নির্দিষ্ট ( পুনর্বিবেষ্টিত ) জেনেরিক টাইপটি তার নিজস্ব ধরণের।
  • জাভাতে আনবাউন্ডেড জেনেরিক ধরণের অর্থ হ'ল তাদের মানটি একটি হিসাবে সঞ্চিত object। এই জাতীয় জেনারিকগুলিতে মান ধরণের ব্যবহার করার সময় এটির কার্যকারিতা প্রভাব ফেলতে পারে। সি # তে, আপনি যখন জেনেরিক টাইপে কোনও মান টাইপ ব্যবহার করেন, তখন এটি মান ধরণের থাকে।

একটি নমুনা দেওয়ার জন্য, ধরুন আপনার একটি Listজেনেরিক যুক্তি সহ জেনেরিক টাইপ রয়েছে। জাভাতে, List<String>এবং List<Int>রানটাইমের সময় ঠিক একই ধরণের হয়ে যাবে - জেনেরিক প্রকারগুলি কেবল সংকলন-সময় কোডের জন্যই বিদ্যমান। যেমন সমস্ত কল কল এবং যথাক্রমে GetValueরূপান্তরিত হবে ।(String)GetValue(Int)GetValue

সি # তে, List<string>এবং List<int>দুটি ভিন্ন ধরণের। এগুলি বিনিময়যোগ্য নয় এবং রানটাইমের সময়ও তাদের ধরণের-সুরক্ষা প্রয়োগ করা হয়। কোন ব্যাপার আপনি কি করবেন, new List<int>().Add("SomeString")হবে না কাজ - মূলগত স্টোরেজ List<int>হয় সত্যিই কিছু পূর্ণসংখ্যা অ্যারের, যখন জাভা, এটা অগত্যা একটি হল objectঅ্যারে। সি # তে কোনও কাস্তে জড়িত নেই, বক্সিংও নেই ইত্যাদি

এটাও এটা সুস্পষ্ট কেন উইথ সি শার্প জাভা একই জিনিস ব্যবহার করতে পারবেন না করা উচিত SomeType<?>। জাভাতে, সমস্ত জেনেরিক ধরণের "থেকে প্রাপ্ত" SomeType<?>হুবহু একই ধরণের হয়। সি # তে, সমস্ত বিভিন্ন নির্দিষ্ট SomeType<T>তাদের নিজস্ব পৃথক ধরণের। সংকলন-সময় চেকগুলি সরানো, এর SomeType<Int>পরিবর্তে পাস করা সম্ভব SomeType<String>(এবং প্রকৃতপক্ষে, এর SomeType<?>অর্থ "প্রদত্ত জেনেরিক টাইপের জন্য কম্পাইল-সময় চেক উপেক্ষা করুন")। সি # তে এটি সম্ভব নয়, এমনকি উত্পন্ন প্রকারের জন্যও নয় (এটি হ'ল উত্পন্ন List<object> list = (List<object>)new List<string>();হলেও আপনি এটি করতে পারবেন না )।stringobject

উভয় বাস্তবায়নের তাদের পক্ষে মতামত রয়েছে। কয়েকবার এমন সময় এসেছে যখন আমি SomeType<?>সি # তে একটি যুক্তি হিসাবে কেবল অনুমতি দিতে সক্ষম হতে পছন্দ করতাম - তবে এটি সি # জেনেরিকগুলি যেভাবে কাজ করে তা বোঝা যায় না।


2
হ্যাঁ, আপনি ধরনের ব্যবহার করতে পারেন List<>, Dictionary<,>এবং তাই C # তে, কিন্তু যে এবং একটি প্রদত্ত কংক্রিট তালিকা বা অভিধান মধ্যে ফাঁক সেতু বেশ প্রতিফলন একটি বিট লাগে। ইন্টারফেসের বৈকল্পিকতা এমন কয়েকটি ক্ষেত্রে সহায়তা করে যেখানে আমরা সম্ভবত একবারে এই ফাঁকটি সহজেই কাটাতে চেয়েছি, তবে সবকটিই নয়।
জন হান্না

2
@ জোহনহনা আপনি List<>একটি নতুন নির্দিষ্ট জেনেরিক ধরণের ইনস্ট্যান্ট করতে ব্যবহার করতে পারেন - তবে এর অর্থ আপনি যে নির্দিষ্ট ধরণের চান তা তৈরি করতে পারেন। তবে আপনি List<>উদাহরণ হিসাবে উদাহরণ হিসাবে ব্যবহার করতে পারবেন না । তবে হ্যাঁ, কমপক্ষে এটি আপনাকে প্রতিবিম্ব ব্যবহার করে ব্যবধানটি পূরণ করতে দেয়।
লুয়ান

.NET ফ্রেমওয়ার্কটিতে তিনটি হার্ড-কোডড জেনেরিক সীমাবদ্ধতা রয়েছে যা স্টোরেজ-অবস্থানের ধরণের নয়; অন্যান্য সমস্ত সীমাবদ্ধতা অবশ্যই স্টোরেজ-অবস্থানের ধরণের হওয়া উচিত। তদুপরি, জেনেরিক টাইপটি কেবল একই ধরণের এবং যখন একই ধরণের থাকে তখন Tকোনও স্টোরেজ-অবস্থান-ধরণের সীমাবদ্ধতা পূরণ করতে পারে বা এমন একটি প্রকার যা কোনও উদাহরণের রেফারেন্স ধরে রাখতে পারে । অর্থপূর্ণভাবে ধরণের স্টোরেজ অবস্থান রাখা সম্ভব হবে না তবে তাত্ত্বিকভাবে সেই ধরণের জেনেরিক সীমাবদ্ধতা থাকতে পারে। UTUUTSomeType<?>
সুপারক্যাট

1
এটি ঠিক নয় যে সংকলিত জাভা বাইটকোডে জেনেরিকের কোনও ধারণা নেই। এটা ঠিক যে শ্রেণীর উদাহরণগুলির মধ্যে জেনেরিকের কোনও ধারণা নেই। এটি একটি গুরুত্বপূর্ণ পার্থক্য; আপনার আগ্রহী হলে আমি আগে এই সম্পর্কে প্রোগ্রামারস.স্ট্যাকেক্সচেঞ্জ / প্রশ্নগুলি / ২৮০১69 / / এ লিখেছি ।
রুখ

2

রেফারেশন একটি অবজেক্ট ওরিয়েন্টেড মডেলিং ধারণা।

রেফাইটি এমন একটি ক্রিয়া যার অর্থ "কিছু বিমূর্তকে বাস্তব করে তোলা"

আপনি যখন অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং করেন তখন বাস্তব বিশ্বের বস্তুগুলিকে সফ্টওয়্যার উপাদান হিসাবে মডেল করা সাধারণ (যেমন উইন্ডো, বোতাম, ব্যক্তি, ব্যাংক, যানবাহন ইত্যাদি) common

বিমূর্ত ধারণাগুলিকে উপাদানগুলিতেও সংশোধন করা সাধারণ (যেমন উইন্ডোলিস্টনার, ব্রোকার ইত্যাদি)


2
রেফারেন্সটি "সত্যিকারের কিছু তৈরি করার" একটি সাধারণ ধারণা যা এটি যেমন আপনি যেমন বলছেন ঠিক তেমনি লক্ষ্যভিত্তিক মডেলিংয়ের ক্ষেত্রেও প্রযোজ্য, জেনেরিকের প্রয়োগের প্রসঙ্গেও এর কোনও অর্থ রয়েছে।
জন হানা

2
সুতরাং আমি এই উত্তরগুলি পড়ে শিক্ষিত হয়েছি। আমি আমার উত্তর সংশোধন করব।
duffymo

2
জেনেরিক্স এবং প্যারাম্যাট্রিক পলিমারফিজমে ওপির আগ্রহের দিকে নজর দেওয়ার জন্য এই উত্তর কিছুই দেয় না।
এরিক জি Hagstrom

এই মন্তব্য কারও আগ্রহের দিকে নজর দেওয়ার বা আপনার প্রতিনিধি বৃদ্ধির জন্য কিছুই করে না। আমি আপনাকে যা কিছু দেওয়া হয়নি তা দেখতে পাচ্ছি। আমার প্রথম উত্তর ছিল এবং এটি বিস্তৃত কিছু হিসাবে সংশোধনকে সংজ্ঞায়িত করেছিল।
duffymo

1
আপনার উত্তরটি প্রথম হতে পারে, তবে আপনি একটি আলাদা প্রশ্নের উত্তর দিয়েছেন, ওপি কর্তৃক জিজ্ঞাসা করা প্রশ্নটি নয়, যা প্রশ্নের বিষয়বস্তু এবং এর ট্যাগগুলি থেকে পরিষ্কার হত। আপনার উত্তর লেখার আগে আপনি এই প্রশ্নটি পুরোপুরি পড়েননি, বা সম্ভবত আপনি জানেন না যে জেনেরিকের প্রসঙ্গে "রিফাইজেশন" শব্দটির একটি প্রতিষ্ঠিত অর্থ রয়েছে। যেভাবেই হোক, আপনার উত্তরটি কার্যকর নয়। Downvote।
জ্যাকসাহ্নওয়াল্ড্ট মনিকা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.