.NET- এ, কোনও মান ধরণের (সি # struct
) কোনও প্যারামিটার ছাড়া কোনও কনস্ট্রাক্টর থাকতে পারে না। এই পোস্ট অনুযায়ী এটি সিএলআই স্পেসিফিকেশন দ্বারা বাধ্যতামূলক হয়। যা ঘটে তা প্রতিটি মান-প্রকারের জন্য একটি ডিফল্ট কনস্ট্রাক্টর তৈরি করা হয় (সংকলক দ্বারা?) যা সমস্ত সদস্যকে শূন্য (বা null
) থেকে আরম্ভ করে ।
কেন এমন ডিফল্ট কনস্ট্রাক্টর সংজ্ঞায়িত করার অনুমতি দেওয়া হয় না?
একটি তুচ্ছ ব্যবহার যুক্তিসঙ্গত সংখ্যার জন্য:
public struct Rational {
private long numerator;
private long denominator;
public Rational(long num, long denom)
{ /* Todo: Find GCD etc. */ }
public Rational(long num)
{
numerator = num;
denominator = 1;
}
public Rational() // This is not allowed
{
numerator = 0;
denominator = 1;
}
}
সি # এর বর্তমান সংস্করণ ব্যবহার করে, একটি ডিফল্ট যুক্তিযুক্ত 0/0
যা এতটা দুর্দান্ত নয়।
PS : ডিফল্ট প্যারামিটারগুলি কি এটি সি # 4.0 এর সমাধান করতে সহায়তা করবে বা সিএলআর-সংজ্ঞায়িত ডিফল্ট কনস্ট্রাক্টর বলা হবে?
জোন স্কিকেট উত্তর দিয়েছে:
আপনার উদাহরণটি ব্যবহার করতে, যখন কেউ এমনটি ঘটে তখন আপনি কী হতে চান:
Rational[] fractions = new Rational[1000];
এটি কি আপনার নির্মাণকারীর মাধ্যমে 1000 বার চালানো উচিত?
অবশ্যই এটি হওয়া উচিত, এজন্য আমি প্রথম স্থানে ডিফল্ট কনস্ট্রাক্টর লিখেছিলাম। যখন কোনও স্পষ্টত ডিফল্ট নির্মাতাকে সংজ্ঞায়িত না করা হয় তখন সিএলআরটিকে ডিফল্ট শূণ্য নির্মাণকারী ব্যবহার করা উচিত ; এইভাবে আপনি কেবল যা ব্যবহার করেন তার জন্য অর্থ প্রদান করুন। তারপরে আমি যদি 1000 নন-ডিফল্ট Rational
গুলি (এবং 1000 নির্মাণগুলি অপ্টিমাইজ করতে চাই) এর ধারক চাই তবে আমি List<Rational>
অ্যারের পরিবর্তে একটি ব্যবহার করব ।
এই কারণে, মনে মনে, কোনও ডিফল্ট নির্মাতার সংজ্ঞা রোধ করতে যথেষ্ট শক্তিশালী নয়।
Rational()
এটি পরামিতি বিহীন কর্টরের চেয়ে ডাকে Rational(long num=0, long denom=1)
।
new Rational()
এটি নির্মাণকারীর কাছে উপস্থিত থাকলে এটি উপস্থিত থাকলে এটি উপস্থিত না থাকলে new Rational()
সমতুল্য হবে default(Rational)
। আপনি default(Rational)
যখন আপনার কাঠামোর "শূন্য মান" চান (যা আপনার প্রস্তাবিত নকশার সাথে একটি "খারাপ" সংখ্যা Rational
) চান তখন যে কোনও ক্ষেত্রে আপনাকে সিনট্যাক্সটি ব্যবহার করতে উত্সাহিত করা হবে । একটি মান টাইপ জন্য ডিফল্ট মান T
সর্বদা default(T)
। সুতরাং new Rational[1000]
স্ট্রাক্ট কনস্ট্রাক্টরদের কখনই ডাকতে হবে না।
denominator - 1
স্ট্রাক্টের ভিতরে সঞ্চয় করতে পারেন , যাতে ডিফল্ট মান 0/1 হয়ে যায়
Then if I want a container of 1000 non-default Rationals (and want to optimize away the 1000 constructions) I will use a List<Rational> rather than an array.
আপনি কেন অ্যারের কাছ থেকে স্ট্রাক্টের জন্য একটি তালিকাতে অন্য নির্মাণকারীকে অনুরোধ করবেন?