C#-এ একটি প্রপার্টি হলো একটি ক্লাসের এমন একটি মেম্বার, যা ওই ক্লাসের ভেতরের ডেটায় অ্যাক্সেস দেয়। কলাররা ডেটাটি সেট করতে বা রিট্রিভ (get) করতে পারে। প্রপার্টি হয় অটো-ইমপ্লিমেন্টেড হতে পারে, নয়তো এতে একটি ব্যাকিং ফিল্ড থাকে। এতে একটি set অ্যাক্সেসর এবং/অথবা একটি get অ্যাক্সেসর থাকে। কিছু অন্যান্য ভাষায় একটি "mutator" মোটামুটি একটি set অ্যাক্সেসরের সমান এবং একটি "accessor" মোটামুটি একটি get অ্যাক্সেসরের সমান, যদিও সিনট্যাক্সের গঠন সম্পূর্ণ আলাদা।
কোনো প্রপার্টি সেট করার সময় ইনপুট মানটি ভ্যালিডেট করা, ফরম্যাট করা বা অন্যভাবে ম্যানিপুলেট করা যায়, এবং আসলে ক্লাসের কোড থেকে অ্যাক্সেসযোগ্য যেকোনো প্রোগ্রাম্যাটিক অপারেশন চালানো যায়।
একইভাবে, কোনো প্রপার্টি রিট্রিভ করার সময় ডেটা গণনা করা বা ফরম্যাট করা যায়, এবং আবারও ক্লাসের কাছে থাকা যেকোনো প্রোগ্রাম্যাটিক অপারেশন চালানো যায়।
অন্য ক্লাস মেম্বারদের মতোই প্রপার্টিরও অ্যাক্সেস মডিফায়ার (public, private ইত্যাদি) থাকে, তবে set অ্যাক্সেসরের অ্যাক্সেস লেভেল রিট্রিভ (get) অ্যাক্সেসর থেকে স্বাধীন হতে পারে, আবার উল্টোটাও। একটি প্রপার্টির দুটি অ্যাক্সেসর থাকতেই হবে না, এতে একটি থাকলেও চলে (get অথবা set)।
প্রপার্টি প্রকাশ করার মূল সিনট্যাক্স দুটি রূপ নিতে পারে:
private int myField;
public int MyProperty
{
get { return myField; }
set { myField = value; }
}
public int MyProperty { get; private set; } = 42;
ইনিশিয়ালাইজেশন ঐচ্ছিক।
এই অনুশীলনীতে আপনি একটি ওজন মাপার যন্ত্র মডেল করবেন, যেখানে একক হিসেবে থাকবে কিলোগ্রাম।
আপনার জন্য ৬টি কাজ আছে, যার প্রতিটিতে এক বা একাধিক প্রপার্টি ইমপ্লিমেন্ট করতে হবে:
ভিন্ন ভিন্ন চাহিদা মেটাতে আমরা প্রতিটি ওজন মাপার যন্ত্রকে একটি প্রিসিশন দিয়ে কাস্টমাইজ করার সুযোগ দিই (দশমিক বিভাজকের পরে কতটি অঙ্ক থাকবে তার সংখ্যা)।
কনস্ট্রাক্টরের precision আর্গুমেন্ট দিয়ে সেট করা একটি গেট-অনলি Precision প্রপার্টি রাখতে WeighingMachine ক্লাসটি ইমপ্লিমেন্ট করুন:
var wm = new WeighingMachine(precision: 3);
// => wm.Precision == 3
ওজন get এবং set করার সুযোগ দিতে WeighingMachine.Weight প্রপার্টিটি ইমপ্লিমেন্ট করুন:
var wm = new WeighingMachine(precision: 3);
wm.Weight = 60.5;
// => wm.Weight == 60.5
স্পষ্টতই, কারও ওজন ঋণাত্মক হতে পারে না।
ঋণাত্মক ওজন সেট করার চেষ্টা করলে একটি ArgumentOutOfRangeException থ্রো করতে WeighingMachine.Weight প্রপার্টিতে ভ্যালিডেশন যোগ করুন:
var wm = new WeighingMachine(precision: 3);
wm.Weight = -10; // Throws an ArgumentOutOfRangeException
টেয়ার অ্যাডজাস্টমেন্ট যেকোনো মান হতে পারে (এমনকি ঋণাত্মক, বা এমন মান যা ডিসপ্লের ওজনকে ঋণাত্মক করে দেয়)
টেয়ার অ্যাডজাস্টমেন্ট সেট করার সুযোগ দিতে WeighingMachine.TareAdjustment প্রপার্টিটি ইমপ্লিমেন্ট করুন:
var wm = new WeighingMachine(precision: 3);
wm.TareAdjustment = -10.6;
// => wm.TareAdjustment == -10.6
বেশ কিছু পুঙ্খানুপুঙ্খ পরীক্ষার পর দেখা গেল, একটি উৎপাদন ত্রুটির কারণে সব ওজন মাপার যন্ত্রেরই ওজন 5 বেশি দেখানোর দিকে একটা ঝোঁক রয়েছে।
WeighingMachine.TareAdjustment প্রপার্টিটির ডিফল্ট মান হিসেবে 5 নির্ধারণ করুন।
var wm = new WeighingMachine(precision: 3);
// => wm.TareAdjustment == 5.0
WeighingMachine.DisplayWeight প্রপার্টিটি ইমপ্লিমেন্ট করুন, যা টেয়ার অ্যাডজাস্টমেন্ট প্রয়োগের পরের ওজন, সঠিক প্রিসিশনসহ এবং একক যোগ করা অবস্থায়, একটি স্ট্রিং হিসেবে রিটার্ন করবে।
লক্ষ্য করুন:
display-weight = input-weight - tare-adjustment
var wm = new WeighingMachine(precision: 3);
wm.Weight = 60.567;
wm.TareAdjustment = 10;
// => wm.DisplayWeight == "50.567 kg"
Exercism-এ সাইন আপ করুন, C# ট্র্যাকের 62টি কনসেপ্ট178টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।