অন্যান্য উত্তরগুলি কেন alচ্ছিক পরামিতিগুলি গতিশীল অভিব্যক্তি হতে পারে না সে সম্পর্কে দুর্দান্ত ব্যাখ্যা দিয়েছে। তবে, গণনা করতে, ডিফল্ট প্যারামিটারগুলি সংকলনের সময় ধ্রুবকের মতো আচরণ করে। এর অর্থ সংকলককে সেগুলি মূল্যায়ন করতে এবং উত্তর নিয়ে আসতে হবে। কিছু লোক আছেন যারা ধ্রুবক ঘোষণার মুখোমুখি হওয়ার সময় গতিশীল অভিব্যক্তিগুলির মূল্যায়নের সংকলকটির জন্য সি # সমর্থন যোগাতে চান — এই ধরণের বৈশিষ্ট্যটি "খাঁটি" চিহ্নিতকরণের সাথে সম্পর্কিত হবে, তবে এটি এখনই বাস্তবতা নয় এবং সম্ভবত কখনও তা হতে পারে না।
এই জাতীয় পদ্ধতির জন্য সি # ডিফল্ট প্যারামিটার ব্যবহার করার একটি বিকল্প হ'ল উদাহরণ দিয়ে দেওয়া প্যাটার্নটি ব্যবহার করা XmlReaderSettings
। এই প্যাটার্নে, প্যারামিটারলেস কনস্ট্রাক্টর এবং সর্বজনীনভাবে লিখনযোগ্য বৈশিষ্ট্য সহ কোনও শ্রেণি নির্ধারণ করুন। তারপরে এই ধরণের কোনও অবজেক্টের সাথে আপনার পদ্ধতিতে ডিফল্ট সমস্ত বিকল্পকে প্রতিস্থাপন করুন। এমনকি null
এটির জন্য একটি ডিফল্ট নির্দিষ্ট করে এই বস্তুকে alচ্ছিক করুন । উদাহরণ স্বরূপ:
public class FooSettings
{
public TimeSpan Span { get; set; } = TimeSpan.FromSeconds(2);
// I imagine that if you had a heavyweight default
// thing you’d want to avoid instantiating it right away
// because the caller might override that parameter. So, be
// lazy! (Or just directly store a factory lambda with Func<IThing>).
Lazy<IThing> thing = new Lazy<IThing>(() => new FatThing());
public IThing Thing
{
get { return thing.Value; }
set { thing = new Lazy<IThing>(() => value); }
}
// Another cool thing about this pattern is that you can
// add additional optional parameters in the future without
// even breaking ABI.
//bool FutureThing { get; set; } = true;
// You can even run very complicated code to populate properties
// if you cannot use a property initialization expression.
//public FooSettings() { }
}
public class Bar
{
public void Foo(FooSettings settings = null)
{
// Allow the caller to use *all* the defaults easily.
settings = settings ?? new FooSettings();
Console.WriteLine(settings.Span);
}
}
কল করার জন্য, সমস্ত একই অভিব্যক্তিতে বৈশিষ্ট্যগুলি ইনস্ট্যান্ট করতে এবং নির্ধারণের জন্য একটি অদ্ভুত বাক্য গঠন ব্যবহার করুন:
bar.Foo(); // 00:00:02
bar.Foo(new FooSettings { Span = TimeSpan.FromDays(1), }); // 1.00:00:00
bar.Foo(new FooSettings { Thing = new MyCustomThing(), }); // 00:00:02
downsides
এই সমস্যাটি সমাধান করার জন্য এটি সত্যই একটি ভারী ওজনের উপায়। আপনি একটি দ্রুত এবং ময়লা অভ্যন্তরীণ ইন্টারফেস লেখা এবং হয় উপার্জন TimeSpan
আপনার পছন্দসই ডিফল্ট মান মত nullable এবং চিকিত্সা নাল উত্তম কাজ করবে, যে পরিবর্তে না।
এছাড়াও, যদি আপনার কাছে প্রচুর পরিমাণে প্যারামিটার থাকে বা কোনও শক্ত লুপে পদ্ধতিটি কল করা হয় তবে এটির ক্লাস ইনস্ট্যান্টেশনের ওভারহেড থাকবে। অবশ্যই, যদি কোনও টাইট লুপে এই জাতীয় পদ্ধতিটি কল করা হয় তবে এটি স্বাভাবিক এবং এমনকি খুব সহজেই কোনও FooSettings
অবজেক্টের উদাহরণ পুনরায় ব্যবহার করতে পারে ।
উপকারিতা
যেমন আমি মন্তব্যে উদাহরণে উল্লেখ করেছি, আমি মনে করি পাবলিক এপিআইয়ের জন্য এই ধরণটি দুর্দান্ত। ক্লাসে নতুন বৈশিষ্ট্য যুক্ত করা একটি অবিচ্ছিন্ন এবিআই পরিবর্তন, সুতরাং আপনি এই প্যাটার্নটি ব্যবহার করে আপনার পদ্ধতির স্বাক্ষর পরিবর্তন না করে নতুন alচ্ছিক পরামিতিগুলি যুক্ত করতে পারেন no অতিরিক্ত কাজ না করে পুরানো সংকলিত কোডটিকে সমর্থন অব্যাহত রেখে আরও সম্প্রতি সংকলিত কোডকে আরও বিকল্প প্রদান করা you ।
এছাড়াও, ডিফল্ট পদ্ধতি পরামিতিগুলিতে তৈরি সি # এর সংকলন ধ্রুবক হিসাবে গণ্য করা হয় এবং কলসাইটে বেকড করা হয়, এটি পুনরায় সংযুক্ত হওয়ার পরে ডিফল্ট পরামিতি কেবল কোড দ্বারা ব্যবহৃত হবে। একটি সেটিংস অবজেক্ট ইনস্ট্যান্ট করে, কলকারী আপনার পদ্ধতিটি কল করার সময় গতিশীলভাবে ডিফল্ট মানগুলি লোড করে। এর অর্থ আপনি নিজের সেটিংসের ক্লাসটি পরিবর্তন করে ডিফল্ট আপডেট করতে পারবেন। সুতরাং, এই প্যাটার্নটি আপনাকে পছন্দসই হলে নতুন মানগুলি দেখতে কলকারীদের পুনরায় সংকলন না করে ডিফল্ট মান পরিবর্তন করতে দেয়।
new TimeSpan(2000)
2000 মিলিসেকেন্ডের অর্থ নয়, এর অর্থ 2000 "টিক্স" যা 0.2 মিলিসেকেন্ড, বা দুই সেকেন্ডের 10,000,000 তম।