"যেখানে টি: শ্রেণি, নতুন ()" অর্থ কী?


উত্তর:


329

এটি জেনেরিক পরামিতিগুলির প্রতিবন্ধকতা T। এটি অবশ্যই একটি class(রেফারেন্স টাইপ) হতে হবে এবং অবশ্যই একটি সর্বজনীন পরামিতি-কম ডিফল্ট কনস্ট্রাক্টর থাকতে হবে।

এর মানে হল যে Tএকটি হতে পারে না int, float, double, DateTimeবা অন্য কোন struct(মান টাইপ)।

এটি একটি string, বা অন্য কোনও কাস্টম রেফারেন্স ধরণের হতে পারে , যতক্ষণ না এটির ডিফল্ট বা পরামিতি-কম নির্মাতা থাকে।


5
কেবল স্পষ্ট করে বলার জন্য, যেখানে টি ... এর অংশ হিসাবে আপনার কাছে ক্লাস ক্লজ না থাকলে, তাহলে ইনট, ফ্লোট, ডাবল ইত্যাদি ব্যবহার করা নিরাপদ
ডেড

1
@AboutDev সঠিক, আপনার জেনেরিক ধরণের পরামিতিগুলিতে কোনও সীমাবদ্ধতা লাগাতে হবে না। তবে আপনি যদি এমন একটি জেনেরিক তৈরি করছেন যা কেবলমাত্র রেফারেন্স বা মান ধরণের ক্ষেত্রে কাজ করার প্রত্যাশা করে, তবে আপনাকে অবশ্যই উল্লেখ করা উচিত। কোনও বাধা ছাড়াই আপনি রেফারেন্সের ধরণ (শ্রেণি) বা মান ধরণের (স্ট্র্টস (ইনট, ফ্লোট, ডাবল ...)) আশা করতে পারেন।
NerdFury

1
যেখানে টি: [ইন্টারফেসের নাম], নতুন () কী হবে? আপনার কি এখনও প্যারামিটার-কম কনস্ট্রাক্টর থাকা দরকার?
ভিন্স টিনো

3
জাস্টিনের মন্তব্য স্পষ্ট করার জন্য, একটি খালি কনস্ট্রাক্টরের কোনও বিবৃতি নেই (ডিফল্ট কন্সট্রাক্টরের মতো) যখন প্যারামিটারলেস কনস্ট্রাক্টরের স্টেটমেন্ট থাকতে পারে (একটি তালিকা শুরু করার মতো)।
ধর্মাল্টল

@ ভিনসিন্টিনো: new()স্পষ্টভাবে নির্দিষ্ট করে "অবশ্যই একটি পাবলিক প্যারামিটারলেস কনস্ট্রাক্টর থাকতে হবে"
ফ্ল্যাটার

162

এগুলি জেনেরিক ধরণের সীমাবদ্ধতা। আপনার ক্ষেত্রে তাদের মধ্যে দুটি রয়েছে:

where T : class

মানে টাইপটি Tঅবশ্যই একটি রেফারেন্স টাইপ (মান ধরণের নয়)।

where T : new()

এর অর্থ হল যে ধরণের Tঅবশ্যই প্যারামিটার-কম কনস্ট্রাক্টর থাকতে হবে। এই সীমাবদ্ধতা থাকার ফলে আপনি T field = new T();আপনার কোডে এমন কিছু করতে পারবেন যা আপনি অন্যথায় করতে সক্ষম হবেন না।

এরপরে আপনি দুজনকে কমা ব্যবহার করে একত্রিত করে পেতে:

where T : class, new()

দ্বিতীয় এবং তৃতীয়টির জন্য ভাল পয়েন্ট, কেবল তথ্য যুক্ত করার জন্য, আমি জেনেরিক ধরণের প্রতিবিম্ব করার সময় দ্বিতীয় পয়েন্টটি দরকারী বলে মনে করি। যেমন। টি টি = নতুন টি (); t.GetType ()। getProperty ("ID")। সেটভ্যালু (টি, ইউনিক আইডি, নাল);
জেরি লিয়াং

1
আমি বিশ্বাস করি যে টি: শ্রেণি, নতুন (), যেহেতু নতুন () ইতিমধ্যে শ্রেণি বোঝায় কারণ এটি স্ট্র্যান্ডের ডিফল্ট কনস্ট্রাক্টর থাকতে পারে না তা বলা বাড়াবাড়ি।
ধর্মতুর্তল

@ ধর্মটর্ল্ট, "স্ট্রাক্টে স্পষ্ট প্যারামিটারলেস কনস্ট্রাক্টর থাকতে পারে না", এর অর্থ এই নয় যে তাদের একটি নেই, এটি বলে যে আপনি কোনওটি সংজ্ঞায়িত করতে পারবেন না। সূত্র: এমএসডিএন.মাইক্রোসফট.টি.আর.ট্রেট
এলিবেরি /aa288208(v=vs.71).aspx

121

যেখানে টি: কাঠামো

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

যেখানে টি: শ্রেণি

প্রকারের যুক্তিটি কোনও শ্রেণি, ইন্টারফেস, প্রতিনিধি বা অ্যারের প্রকার সহ একটি রেফারেন্স টাইপ হতে হবে। (নীচের নোট দেখুন।)

যেখানে টি: নতুন () টাইপ আর্গুমেন্টের একটি সর্বজনীন পরামিতি বিহীন নির্মাণকারী থাকতে হবে। অন্যান্য সীমাবদ্ধতার সাথে একযোগে ব্যবহৃত হলে, নতুন () সীমাবদ্ধতা অবশ্যই শেষ নির্দিষ্ট করতে হবে।

যেখানে টি: [বেস শ্রেণীর নাম]

প্রকারের যুক্তিটি অবশ্যই নির্দিষ্ট বেস শ্রেণীর হতে হবে বা নেওয়া উচিত।

যেখানে টি: [ইন্টারফেসের নাম]

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

যেখানে টি: ইউ

টির জন্য সরবরাহ করা ধরণের আর্গুমেন্টটি অবশ্যই ইউ এর জন্য সরবরাহ করা যুক্তি থেকে বা প্রাপ্ত হওয়া উচিত This এটিকে নগ্ন টাইপের সীমাবদ্ধতা বলা হয়।


23
এটি দরকারী ছিল, তবে উত্সের লিঙ্ক
স্কিয়ান

26

class& new2 হয় জেনেরিক টাইপ প্যারামিটার উপর সীমাবদ্ধতাT
যথাযথভাবে তারা নিশ্চিত করে:

class

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

new

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

তাদের সংমিশ্রণের অর্থ হ'ল টাইপটি Tঅবশ্যই একটি রেফারেন্স টাইপ ( মান ধরণের হতে পারে না ) হতে পারে এবং অবশ্যই প্যারামিটারলেস কনস্ট্রাক্টর থাকতে হবে।

উদাহরণ:

struct MyStruct { } // structs are value types

class MyClass1 { } // no constructors defined, so the class implicitly has a parameterless one

class MyClass2 // parameterless constructor explicitly defined
{
    public MyClass2() { }
}

class MyClass3 // only non-parameterless constructor defined
{
    public MyClass3(object parameter) { }
}

class MyClass4 // both parameterless & non-parameterless constructors defined
{
    public MyClass4() { }
    public MyClass4(object parameter) { }
}

interface INewable<T>
    where T : new()
{
}

interface INewableReference<T>
    where T : class, new()
{
}

class Checks
{
    INewable<int> cn1; // ALLOWED: has parameterless ctor
    INewable<string> n2; // NOT ALLOWED: no parameterless ctor
    INewable<MyStruct> n3; // ALLOWED: has parameterless ctor
    INewable<MyClass1> n4; // ALLOWED: has parameterless ctor
    INewable<MyClass2> n5; // ALLOWED: has parameterless ctor
    INewable<MyClass3> n6; // NOT ALLOWED: no parameterless ctor
    INewable<MyClass4> n7; // ALLOWED: has parameterless ctor

    INewableReference<int> nr1; // NOT ALLOWED: not a reference type
    INewableReference<string> nr2; // NOT ALLOWED: no parameterless ctor
    INewableReference<MyStruct> nr3; // NOT ALLOWED: not a reference type
    INewableReference<MyClass1> nr4; // ALLOWED: has parameterless ctor
    INewableReference<MyClass2> nr5; // ALLOWED: has parameterless ctor
    INewableReference<MyClass3> nr6; // NOT ALLOWED: no parameterless ctor
    INewableReference<MyClass4> nr7; // ALLOWED: has parameterless ctor
}

1
শুভ বিক্ষোভ। ধন্যবাদ।
সুবহান আলী

15

নতুন (): নতুন () সীমাবদ্ধতা নির্দিষ্ট করার অর্থ টাইপ টি অবশ্যই প্যারামিটারলেস কনস্ট্রাক্টর ব্যবহার করতে হবে, সুতরাং কোনও বস্তু এটি থেকে ইনস্ট্যান্ট করা যেতে পারে - ডিফল্ট কনস্ট্রাক্টরগুলি দেখুন

শ্রেণি: মানে টি অবশ্যই একটি রেফারেন্স টাইপ হতে হবে সুতরাং এটি কোনও ইনট, ফ্লোট, ডাবল, ডেটটাইম বা অন্যান্য কাঠামো (মানের ধরণ) হতে পারে না।

public void MakeCars()
{
    //This won't compile as researchEngine doesn't have a public constructor and so can't be instantiated.
    CarFactory<ResearchEngine> researchLine = new CarFactory<ResearchEngine>();
    var researchEngine = researchLine.MakeEngine();

    //Can instantiate new object of class with default public constructor
    CarFactory<ProductionEngine> productionLine = new CarFactory<ProductionEngine>();
    var productionEngine = productionLine.MakeEngine();
}

public class ProductionEngine { }
public class ResearchEngine
{
    private ResearchEngine() { }
}

public class CarFactory<TEngine> where TEngine : class, new()
{
    public TEngine MakeEngine()
    {
        return new TEngine();
    }
}

6

তার অর্থ এই ধরণের Tঅবশ্যই একটি শ্রেণি হতে হবে এবং এমন একটি নির্মাণকারী থাকতে হবে যা কোনও যুক্তি গ্রহণ করে না।

উদাহরণস্বরূপ, আপনার অবশ্যই এটি করতে সক্ষম হবেন:

T t = new T();

1
শুধুমাত্র একটি নির্মাণকারী নয়, তবে এমন একটি নির্মাণকারীর যাতে কোনও যুক্তি নেই।
NerdFury

@ নার্ডফুরি: ধন্যবাদ এটি একটি গুরুত্বপূর্ণ বিট। সংশোধন।
ইভান মুলাউস্কি

5

কোথায় (সি # রেফারেন্স)

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

সুতরাং এটি হওয়া উচিত, Tঅবশ্যই একটি শ্রেণি হতে হবে এবং একটি অ্যাক্সেসযোগ্য প্যারামিটারলেস - বা ডিফল্ট কনস্ট্রাক্টর থাকতে হবে।


4

"যেখানে" এর পরে যা আসে তা হ'ল জেনেরিক ধরণের টি আপনি ঘোষণা করেছিলেন, তাই:

  • শ্রেণীর অর্থ হল টি টি একটি শ্রেণি হওয়া উচিত এবং মান মান বা স্ট্রাক্ট নয়।

  • নতুন () নির্দেশ করে যে টি শ্রেণিতে একটি সর্বজনীন পরামিতি-মুক্ত ডিফল্ট কনস্ট্রাক্টর সংজ্ঞায়িত করা উচিত।


1

জেনেরিক প্যারামিটার টিতে একে 'সীমাবদ্ধতা' বলা হয় It এর অর্থ হল টি অবশ্যই একটি রেফারেন্স টাইপ (একটি শ্রেণি) হতে হবে এবং এর অবশ্যই একটি সর্বজনীন ডিফল্ট কনস্ট্রাক্টর থাকতে হবে।


1

এটি জেনেরিক্স মেকানিজমের অংশ, যেখানে টাইপ প্যারামিটার হিসাবে কীওয়ার্ড প্রয়োগ করতে হবে কোন প্রকারের প্রয়োগ করতে হবে তাতে সীমাবদ্ধতা রয়েছে।


0

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

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