সি # তে 'টি: ক্লাস' বলতে কী বোঝায়?


135

সি # এর where T : classঅর্থ কী?

অর্থাৎ।

public IList<T> DoThis<T>() where T : class

উত্তর:


115

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

আরও তথ্যের জন্য এই এমএসডিএন নিবন্ধটি দেখুন ।


4
আপনি একটি কেস মিস করেছেন। টির জন্য টাইপ আর্গুমেন্ট অন্য যে কোনও ধরণের প্যারামিটার হতে পারে যা একটি রেফারেন্স টাইপ হিসাবে সীমাবদ্ধ
এরিক লিপার্ট


35

এটি একটি ধরণের বাধা T, উল্লেখ করে যে এটি অবশ্যই একটি শ্রেণি হতে হবে।

whereদফা অন্য ধরনের সীমাবদ্ধতা, যেমন নির্দিষ্ট করতে ব্যবহার করা যেতে পারে:

where T : struct // T must be a struct
where T : new()  // T must have a default parameterless constructor
where T : IComparable // T must implement the IComparable interface

আরো তথ্যের জন্য, উপর দুটিই MSDN এর পাতা খুঁজে বার করো whereদফা , অথবা জেনেরিক প্যারামিটার সীমাবদ্ধতার


5
এগুলি একত্রিত করা সম্ভব, যেমন:where T : class, IComparable, new()
Izzy

17

পরিমিত যে Tকরতে রেফারেন্স ধরনের । আপনি সেখানে মান ধরণের ( structগুলি এবং আদিম প্রকার বাদে string) রাখতে পারবেন না।


এই উত্তরটি (এবং একই তথ্যের সাথে আরও কয়েকজন) আমার জন্য নির্বাচিতটির চেয়ে বেশি কার্যকর ছিল, কারণ এটি টি কী হতে পারে না তার একটি উদাহরণ দেয় (আমি ভাবছিলাম যে এই প্রতিবন্ধকতাটি গল্পটিতে আসলে কী যুক্ত হয়েছিল)
মিনিট

9

এর অর্থ হ'ল Tজেনেরিক পদ্ধতিটি ব্যবহৃত হওয়ার সময় যে ধরণের ব্যবহৃত হবে তা অবশ্যই একটি শ্রেণি হতে হবে - অর্থাত্ এটি স্ট্রাক্ট বা সংখ্যায় তৈরি করা যাবে না intবাdouble

// Valid:
var myStringList = DoThis<string>();
// Invalid - compile error
var myIntList = DoThis<int>();

8

where T: class আক্ষরিক অর্থ যে T has to be a class। এটি কোনও রেফারেন্স টাইপ হতে পারে। এখন যখনই কোনও কোড আপনার DoThis<T>()পদ্ধতিতে কল করে তবে এটি অবশ্যই টি প্রতিস্থাপনের জন্য একটি শ্রেণি সরবরাহ করবে । উদাহরণস্বরূপ যদি আমি আপনার DoThis<T>()পদ্ধতিটি কল করতে পারি তবে আমাকে নীচের মতো এটি কল করতে হবে:

DoThis<MyClass>();

যদি আপনার মতবাদগুলি নিম্নলিখিতগুলির মতো হয়:

public IList<T> DoThis<T>() where T : class
{
   T variablename = new T();

   // other uses of T as a type

}

তারপরে যেখানে কখনও আপনার পদ্ধতিতে টি উপস্থিত হয় এটি MyClass দ্বারা প্রতিস্থাপিত হবে। সুতরাং সংকলক কল করে এমন চূড়ান্ত পদ্ধতিটি নীচের মতো দেখাবে:

public IList<MyClass> DoThis<MyClass>() 
{
   MyClass variablename= new MyClass();

  //other uses of MyClass as a type

  // all occurences of T will similarly be replace by MyClass
 }

4
-1: new T()দিয়ে সম্ভব নয় where T : classwhere T: new()এটি করার অনুমতি দেওয়ার জন্য আপনাকে নির্দিষ্ট করতে হবে।
প্রবন্ধ

@ এক্সপ্লোরার আমরা একটি একক জেনেরিক পদ্ধতি সংজ্ঞায়িত করতে পারি এবং বিভিন্ন স্থান থেকে বিভিন্ন পরামিতিগুলি পাস করে রেকর্ড সন্নিবেশ করতে একাধিক জায়গা থেকে কল করতে পারি।
যাকের

4

একে টাইপ প্যারামিটার সীমাবদ্ধতা বলা হয়। কার্যকরভাবে এটি টাইপ টি কী হতে পারে তা সীমাবদ্ধ করে।

প্রকারের যুক্তিটি অবশ্যই একটি রেফারেন্স টাইপ হতে হবে; এটি কোনও শ্রেণি, ইন্টারফেস, প্রতিনিধি বা অ্যারে প্রকারের ক্ষেত্রেও প্রযোজ্য।

প্রকারের প্যারামিটারগুলিতে সীমাবদ্ধতা (সি # প্রোগ্রামিং গাইড)


4

টি একটি অবজেক্টের ধরণের প্রতিনিধিত্ব করে, এটি বোঝায় যে আপনি যে কোনও ধরণের দিতে পারেন। IList: if IList s = new IList; এখন s.add ("সর্বদা স্ট্রিং গ্রহণ করুন" ")।



1

'টি' একটি জেনেরিক ধরণের প্রতিনিধিত্ব করে। এর অর্থ এটি যে কোনও ধরণের শ্রেণি গ্রহণ করতে পারে। নিম্নলিখিত নিবন্ধটি সাহায্য করতে পারে:

http://www.15seconds.com/issue/031024.htm
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.