সি # তে নতুন () সীমাবদ্ধতা রয়েছে তবে এর মতো অন্য কোনও বাধা নেই?


19

সি # জেনেরিক্সে, আমরা একটি ধরণের প্যারামিটারের Tডিফল্ট কনস্ট্রাক্টর হওয়ার কথা বলে বাধা ঘোষণা করতে পারি where T : new()। তবে এর মতো অন্য কোনও ধরণের সীমাবদ্ধতা বৈধ নয় - new(string)উদাহরণস্বরূপ, ইত্যাদি etc.

একটি ভাষা নকশা এবং / বা প্রয়োগের দৃষ্টিকোণ থেকে, এর কারণ কী?

কনস্ট্রাক্টররা যেভাবে কাজ করেন বা টাইপ সিস্টেমটি প্রয়োগ করা যায় সে পথে এমন কিছু রয়েছে যা এটিকে নিষিদ্ধ করে (বা অন্তত এটি আরও শক্ত করে তোলে)? যদি তাই হয়, এটা কি? কোথাও যে পড়ছে default(T)আসলে করার প্রনয়ন new T()জন্য T : struct। এটি কি এর সাথে সম্পর্কিত, হতে পারে?

অথবা ভাষাটিকে আরও জটিল করে তুলতে কেবল কোনও নকশার সিদ্ধান্ত নেওয়া হয়েছে?


new(string)কোনও ডিফল্ট নির্মাতা বাধা নয়। আপনার প্রশ্নটি "এইরকম সীমাবদ্ধতা কেন নেই যেখানে নির্দিষ্ট নির্মাতার স্বাক্ষর প্রয়োজন?" খুব সম্ভবত কারণ এই জাতীয় সীমাবদ্ধতা বিশেষভাবে কার্যকর হবে না।
রবার্ট হার্ভে

3
@ রবার্টহারভে হ্যাঁ, আমি যা বলছি ঠিক এটিই। আমি মূলত জিজ্ঞাসা করছি যে এমন কিছু আছে যা ডিফল্ট নির্মাতাদের বিশেষ বাস্তবায়ন-ভিত্তিক করে তোলে বা এটি কেবল একটি স্বেচ্ছাসেবী পছন্দ ছিল এটি অন্তর্ভুক্ত করার জন্য এবং অন্যটি নয়।
থিওডোরোস চ্যাটজিগিয়ানানাকিস

ডিফল্ট নির্মাতারা নির্দিষ্ট নির্দিষ্ট এবং গুরুত্বপূর্ণ উপায়ে কার্যকর। উদাহরণস্বরূপ, তারা একটি ধরণের সহজেই সিরিয়ালাইজযোগ্য করে তোলে।
রবার্ট হার্ভে

6
নির্দিষ্ট ctor স্বাক্ষর দরকারী হতে পারে। উদাহরণস্বরূপ, যদি আপনার টাইপ ভেরিয়েবলটি সংগ্রহের জন্য সীমাবদ্ধ করা হয় <টি> টির একটি কর্টর (সংগ্রহ <টি>) এর সাথে, আপনি জানেন যে আপনি অন্য দেওয়া নতুন সংগ্রহগুলি তৈরি করতে পারেন। যদিও সেই দরকারীতা অতিরিক্ত জটিলতার পক্ষে মূল্যবান, তবে এটি একটি প্রশ্ন।
ফোশি

উত্তর:


5

একটি অনুমোদনমূলক উত্তরের জন্য , আমি আপনাকে কয়েক বছর আগে স্ট্যাকওভারফ্লো-তে সেই প্রশ্নের উত্তরটি এরিক লিপার্টের উল্লেখ করব , যার একটি স্নিপেট নীচে সংক্ষেপে উদ্ধৃত করা হয়েছে।

যাইহোক, এই নির্দিষ্ট ক্ষেত্রে আমি অবশ্যই কিছু কারণ দিতে পারি কেন ভাষাটির ভবিষ্যতের সংস্করণটির জন্য এটি কোনও সম্ভাব্য বৈশিষ্ট্য হিসাবে কোনও নকশার বৈঠকে উপস্থিত হলে আমি বৈশিষ্ট্যটির পিছনে পিছনে যাব।

...

আমি বলি যে আমাদের হয় পুরো বৈশিষ্ট্যটি করা উচিত বা এটি মোটেও করা উচিত নয়। যদি নির্দিষ্ট কনস্ট্রাক্টর রাখতে টাইপগুলিকে সীমাবদ্ধ রাখতে সক্ষম হওয়া জরুরী হয় তবে আসুন পুরো বৈশিষ্ট্যটি সম্পাদন করুন এবং কেবল সদস্যগণের ভিত্তিতে এবং কেবলমাত্র নির্মাণকারীকেই নয় টাইপগুলি সীমাবদ্ধ রাখুন।


2
প্রসঙ্গের বাইরে নেওয়া উক্তিটি অত্যন্ত বিভ্রান্তিকর। এটি প্রস্তাব দেয় যে এরিক ভেবেছিলেন যে মাইক্রোসফ্টের "সমস্ত উপায়ে চলে" যাওয়া উচিত ছিল যা মোটেই তার অবস্থান নয়। তিনি প্রকৃতপক্ষে প্রস্তাবিত বৈশিষ্ট্যের বিপরীতে।
রবার্ট হার্ভে

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

@TheodorosChatzigiannakis: কেন আপনি জ্বলা না Telerik এর Decompiler এবং নিজের জন্য জানতে?
রবার্ট হার্ভে

2
@ রবার্টহারভে আমার মনে হয় না যে এটি মোটেও তার পক্ষে অবস্থানের পরামর্শ দেয় তবে আমি তার অবস্থানকে জোর দেওয়ার জন্য একটি অতিরিক্ত উদ্ধৃতি অন্তর্ভুক্ত করেছি।
ক্রিস হ্যানন

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

16

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

static T GenericMake<T>()
    where T : new()
{
    return new T();
}

স্পষ্টতই, সংকলিত হয়ে গেলে এটি হয়ে যায়:

private static T GenericMake<T>()
    where T : new()
{
    T t;
    T t1 = default(T);
    if (t1 == null)
    {
        t = Activator.CreateInstance<T>();
    }
    else
    {
        t1 = default(T);
        t = t1;
    }
    return t;
}
  • যদি Tমান মান হয়, new()হয় default(T)
  • যদি Tকোনও রেফারেন্স টাইপ হয় তবে new()প্রতিবিম্ব ব্যবহার করে কাজ করে। Activator.CreateInstance()অভ্যন্তরীণ কল RuntimeType.CreateInstanceDefaultCtor()

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


4
মজাদার. কেন default(T) মূল্য প্রকারের জন্য সদৃশ কল ?
অব্নার শাহর-কাশতান

2
@ আভেনারশাহার-কাশতান আমি জানি না। এটি tভেরিয়েবলের মতো (যা নেস্টেড returnস্টেটমেন্ট দ্বারা প্রতিস্থাপন করা যেতে পারে ) এর মতো সংকলন / ডিসপোমিলেশন প্রক্রিয়াটির একটি নিদর্শন হতে পারে ।
থিওডোরোস চ্যাটজিগিয়ানানাকিস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.