প্রথমে, জোন, মাইকেল এবং জ্যারেডের উত্তরগুলি মূলত সঠিক তবে আমার কাছে আরও কয়েকটি জিনিস যুক্ত করতে চাই।
"অপরিষ্কার" পদ্ধতি বলতে কী বোঝায়?
খাঁটি পদ্ধতিগুলি বৈশিষ্ট্যযুক্ত করা আরও সহজ। একটি "খাঁটি" পদ্ধতিতে নিম্নলিখিত বৈশিষ্ট্য রয়েছে:
- এর আউটপুট সম্পূর্ণভাবে তার ইনপুট দ্বারা নির্ধারিত হয়; দিনের ফলাফল বা আপনার হার্ড ডিস্কের বিটগুলির মতো বাহ্যিকতার উপর এর আউটপুট নির্ভর করে না। এর আউটপুট তার ইতিহাসের উপর নির্ভর করে না; প্রদত্ত যুক্তি দিয়ে দু'বার পদ্ধতিটি কল করা একই ফলাফল দেওয়া উচিত।
- একটি খাঁটি পদ্ধতি তার চারপাশের বিশ্বে কোনও পর্যবেক্ষণযোগ্য মিউটেশন তৈরি করে না। একটি খাঁটি পদ্ধতি দক্ষতার জন্য প্রাইভেট স্টেটকে পরিবর্তিত করতে পারে, তবে একটি খাঁটি পদ্ধতি বলে না, তার যুক্তির ক্ষেত্রটি পরিবর্তন করে।
উদাহরণস্বরূপ, Math.Cos
একটি খাঁটি পদ্ধতি। এর আউটপুট কেবল তার ইনপুট উপর নির্ভর করে, এবং ইনপুট কল দ্বারা পরিবর্তন হয় না।
অপরিষ্কার পদ্ধতি এমন একটি পদ্ধতি যা খাঁটি নয়।
নাপাক পদ্ধতিতে পাঠযোগ্য মাত্রায় পাস করার কিছু বিপদ কী কী?
মনে আছে দুটি আছে। প্রথমটি হ'ল জন, মাইকেল এবং জারেড দ্বারা চিহ্নিত একটি এবং এটিই রিশার্পার আপনাকে সতর্ক করছে। আপনি যখন স্ট্রাক্টে কোনও পদ্ধতিতে কল করেন, আমরা পদ্ধতিটি চলকটি পরিবর্তিত করতে চাইলে প্রেরণকারী হিসাবে চলকটির জন্য একটি রেফারেন্সটি সর্বদা প্রেরণ করি।
তাহলে আপনি যদি ভেরিয়েবলের পরিবর্তে কোনও মানকে এই জাতীয় পদ্ধতিটি কল করেন? সেক্ষেত্রে আমরা একটি অস্থায়ী পরিবর্তনশীল করব, এর মধ্যে মানটি অনুলিপি করব এবং ভেরিয়েবলের একটি রেফারেন্স দিন।
একটি পঠনযোগ্য ভেরিয়েবলকে একটি মান হিসাবে বিবেচনা করা হয়, কারণ এটি কনস্ট্রাক্টরের বাইরে রূপান্তরিত হতে পারে না। সুতরাং আমরা ভেরিয়েবলটিকে অন্য ভেরিয়েবলে অনুলিপি করছি, এবং যখন আপনি ভেরিয়েবলটি পরিবর্তন করতে চান তখন অপরিষ্কার পদ্ধতিটি অনুলিপিটি সম্ভবত অনুলিপি করে চলেছে।
এটি রিসিভার হিসাবে কেবল পাঠ্য কাঠামো পাস করার বিপদ । এমন একটি কাঠামো পেরিয়ে যাওয়ার ঝুঁকিও রয়েছে যার মধ্যে কেবল পাঠযোগ্য ক্ষেত্র রয়েছে। একটি কাঠামো যাতে কেবল পাঠ্য ক্ষেত্র থাকে সেগুলি একটি প্রচলিত অনুশীলন, তবে এটি প্রয়োজনীয়ভাবে একটি চেক লিখতে থাকে যে টাইপ সিস্টেমে নগদ অর্থের তহবিল নেই; নির্দিষ্ট ভেরিয়েবলের "কেবলমাত্র পঠনযোগ্য নেস" স্টোরেজের মালিক দ্বারা নির্ধারিত হয়। রেফারেন্স টাইপের একটি উদাহরণ তার নিজস্ব স্টোরেজ "মালিকানাধীন" করে তবে মান ধরণের উদাহরণটি দেয় না!
struct S
{
private readonly int x;
public S(int x) { this.x = x; }
public void Badness(ref S s)
{
Console.WriteLine(this.x);
s = new S(this.x + 1);
Console.WriteLine(this.x);
}
}
কেউ ভাবেন যে this.x
এটি পরিবর্তন হচ্ছে না কারণ এক্স একটি পাঠ্য ক্ষেত্র এবং Badness
কোনও নির্মাণকারক নয়। তবে ...
S s = new S(1);
s.Badness(ref s);
... এর মিথ্যাচার স্পষ্টভাবে প্রদর্শন করে। this
এবং s
একই ভেরিয়েবলটি উল্লেখ করুন এবং সেই পরিবর্তনশীলটি কেবল পঠনযোগ্য নয়!