সি # তে, কোন ক্ষেত্রটি কোনও সম্পত্তির থেকে আলাদা করে তোলে, এবং কখন কোনও ক্ষেত্রের পরিবর্তে ক্ষেত্রটি ব্যবহার করা উচিত?
সি # তে, কোন ক্ষেত্রটি কোনও সম্পত্তির থেকে আলাদা করে তোলে, এবং কখন কোনও ক্ষেত্রের পরিবর্তে ক্ষেত্রটি ব্যবহার করা উচিত?
উত্তর:
সম্পত্তি ক্ষেত্রগুলি উন্মোচিত করে। ক্ষেত্রগুলি (প্রায় সর্বদা) একটি শ্রেণিতে ব্যক্তিগত রাখা উচিত এবং প্রাপ্ত ও সেট বৈশিষ্ট্যগুলির মাধ্যমে অ্যাক্সেস করা উচিত। বৈশিষ্ট্যগুলি আপনার স্তরের ব্যবহারযোগ্য জিনিসগুলির দ্বারা অ্যাক্সেস করা বাহ্যিক উপায়ে প্রভাবিত না করে আপনাকে ক্ষেত্রগুলি পরিবর্তন করতে দেয় এমন বিমূর্ততার স্তর সরবরাহ করে।
public class MyClass
{
// this is a field. It is private to your class and stores the actual data.
private string _myField;
// this is a property. When accessed it uses the underlying field,
// but only exposes the contract, which will not be affected by the underlying field
public string MyProperty
{
get
{
return _myField;
}
set
{
_myField = value;
}
}
// This is an AutoProperty (C# 3.0 and higher) - which is a shorthand syntax
// used to generate a private field for you
public int AnotherProperty{get;set;}
}
@ কেন্ট উল্লেখ করেছে যে সম্পত্তিগুলি ক্ষেত্রগুলি আবশ্যক করার প্রয়োজন হয় না, তারা অন্যান্য ক্ষেত্রগুলিতে একটি গণনা করতে পারে বা অন্য উদ্দেশ্যে পরিবেশন করতে পারে।
@ জিএসএস উল্লেখ করেছে যে আপনি অন্য যুক্তি যেমন বৈধকরণও করতে পারেন, যখন কোনও সম্পত্তি অ্যাক্সেস করা হয়, অন্য একটি দরকারী বৈশিষ্ট্য।
string
, তবে আমার চুক্তিটি হ'ল: b 2 বিল অবধি কোনও অক্ষর নির্ধারণ করুন। যদি কোনও সম্পত্তি হয় তবে DateTime
আমার চুক্তিটি হ'ল: ডেটটাইমের সীমাতে যে কোনও সংখ্যা নির্ধারণ করুন, যা আমি সন্ধান করতে পারি। যদি নির্মাতা সেটটারগুলিতে বাধা যুক্ত করে তবে এই সীমাবদ্ধতাগুলি যোগাযোগ করা হয় না। কিন্তু যদি, পরিবর্তে, স্রষ্টা ধরণ থেকে পরিবর্তন string
করতে Surname
, তারপর তাদের নতুন উপাধি বর্গ সীমাবদ্ধতার যোগাযোগ, এবং সম্পত্তি public Surname LastName
সেটার বৈধতা নেই। এছাড়াও, Surname
পুনরায় ব্যবহারযোগ্য।
Surname
, আমার উদাহরণে, পুনঃব্যবহারযোগ্য, তাই সম্পত্তি সম্পর্কিত সেটারে এই বৈধতাগুলিকে কোডের অন্য জায়গাগুলিতে অনুলিপি / পেস্ট করার বিষয়ে আপনাকে পরে চিন্তা করার দরকার নেই। এবং আপনি যদি কখনও અટর ব্যবহারের ব্যবসায়ের নিয়মগুলিতে পরিবর্তন করে থাকেন তবে কোনও અટারের বৈধতা একাধিক স্থানে রয়েছে কিনা তা ভাবছেন না। মান অবজেক্টস সম্পর্কে আমি পোস্ট করা লিঙ্কটি দেখুন
অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং নীতিগুলি বলে যে, কোনও শ্রেণির অভ্যন্তরীণ কাজগুলি বাইরের বিশ্ব থেকে লুকানো উচিত। আপনি যদি কোনও ক্ষেত্র উন্মোচন করেন তবে আপনি ক্লাসের অভ্যন্তরীণ বাস্তবায়নটি প্রকাশ করছেন। অতএব আমরা আমাদের উপর নির্ভর করে কোড ভঙ্গ না করে বাস্তবায়ন পরিবর্তন করার ক্ষমতা দিতে প্রপার্টি (বা জাভা ক্ষেত্রে পদ্ধতি) দিয়ে ক্ষেত্রগুলি আবদ্ধ করি। আমরা সম্পত্তিতে যুক্তি রাখতে পারি তা দেখতে আমাদের যদি প্রয়োজন হয় তবে বৈধতা যুক্তি ইত্যাদি সম্পাদনের অনুমতি দেয়। সি # 3 এর অটোপ্রোপার্টিগুলির সম্ভবত বিভ্রান্তিকর ধারণা রয়েছে। এটি আমাদের কেবল সম্পত্তি সংজ্ঞা দিতে দেয় এবং সি # 3 সংকলকটি আমাদের জন্য ব্যক্তিগত ক্ষেত্র উত্পন্ন করবে।
public class Person
{
private string _name;
public string Name
{
get
{
return _name;
}
set
{
_name = value;
}
}
public int Age{get;set;} //AutoProperty generates private field for us
}
public int myVar { get; set; }
সত্যিকার অর্থে কি বোঝা যায় তা এখনও বুঝতে অসুবিধা হতে পারে (এবং আমি ধারণা করি যে এটির কারণ) হিট কমপক্ষে 50% জন্য এই প্রশ্নটি পায়)।
virtual
নিজেই অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ের অংশ।
virtual
যদিও আমি প্রতি সেফ ওওপি কল করব না । এটি এমন একটি সরঞ্জাম যা পলিমারফিজম সক্ষম করে, এটি অন্যতম মূল সরঞ্জাম যা ওওপি সক্ষম করে। এটি যদিও ও নিজেই ওওপি নয় এবং কোনও পাবলিক অটোপ্রোপার্টি সম্পর্কে সহজাতভাবে ওওপি-তে কিছুই নেই। রিফ্লেকশন বা ডেটাবাইন্ডিং ওওপি সম্পর্কিত কোনও জিনিস আমি গণনা করব না। সাধারণত আমি এটি সম্পর্কে তেমন পেডেন্টিক নই, তবে উত্তরে কোডের উদাহরণের পিছনে চালক শক্তি হিসাবে ওও নীতিগুলি নির্দিষ্টভাবে উল্লেখ করা হয়েছে এবং আমি এর সাথে একমত নই।
একটি গুরুত্বপূর্ণ পার্থক্য হ'ল ইন্টারফেসের বৈশিষ্ট্য থাকতে পারে তবে ক্ষেত্রগুলি নয়। এটি আমার কাছে, এই বিষয়টিকে নিম্নরেখাঙ্কিত করে যে বৈশিষ্ট্যগুলি একটি শ্রেণীর পাবলিক ইন্টারফেস সংজ্ঞায়িত করতে ব্যবহার করা উচিত যখন ক্ষেত্রগুলি শ্রেণীর ব্যক্তিগত, অভ্যন্তরীণ কাজের ক্ষেত্রে ব্যবহৃত হয়। একটি নিয়ম হিসাবে আমি খুব কমই পাবলিক ফিল্ড তৈরি করি এবং তেমনিভাবে আমি খুব কমই জনসাধারণের সম্পত্তি তৈরি করি।
আমি আপনাকে এমন কয়েকটি বৈশিষ্ট্য ব্যবহারের উদাহরণ দেব যা গিয়ারগুলি ঘুরিয়ে আনতে পারে:
প্রোপার্টি ব্যবহার করে, আপনি কোনও ইভেন্ট উত্থাপন করতে পারেন, যখন সম্পত্তির মান পরিবর্তন হয় (যেমন। প্রপার্টি চেঞ্জডভেন্ট) বা বাতিলকরণের সমর্থনে মান পরিবর্তন করার আগে।
(সরাসরি অ্যাক্সেস) ক্ষেত্রে এটি সম্ভব নয়।
public class Person {
private string _name;
public event EventHandler NameChanging;
public event EventHandler NameChanged;
public string Name{
get
{
return _name;
}
set
{
OnNameChanging();
_name = value;
OnNameChanged();
}
}
private void OnNameChanging(){
NameChanging?.Invoke(this,EventArgs.Empty);
}
private void OnNameChanged(){
NameChanged?.Invoke(this,EventArgs.Empty);
}
}
যেহেতু তাদের মধ্যে বেশিরভাগ প্রযুক্তিগত উপকারিতা এবং এর সাথে ব্যাখ্যা করেছেন Properties
এবং Field
তাই আসল সময়ের উদাহরণগুলির মধ্যে আসার সময়।
1. বৈশিষ্ট্যগুলি আপনাকে কেবল পঠনযোগ্য অ্যাক্সেসের স্তর সেট করতে দেয়
ক্ষেত্রে বিবেচনা করুন dataTable.Rows.Count
এবং dataTable.Columns[i].Caption
। তারা ক্লাস থেকে আসে DataTable
এবং উভয়ই আমাদের কাছে সর্বজনীন। তাদের কাছে অ্যাক্সেস-স্তরের পার্থক্য হ'ল আমরা মান সেট করতে পারি না dataTable.Rows.Count
তবে আমরা পড়তে এবং লিখতে পারি dataTable.Columns[i].Caption
। এর মাধ্যমে কি সম্ভব Field
? কোন !!! এটি Properties
শুধুমাত্র দিয়েই করা যায় ।
public class DataTable
{
public class Rows
{
private string _count;
// This Count will be accessable to us but have used only "get" ie, readonly
public int Count
{
get
{
return _count;
}
}
}
public class Columns
{
private string _caption;
// Used both "get" and "set" ie, readable and writable
public string Caption
{
get
{
return _caption;
}
set
{
_caption = value;
}
}
}
}
2. সম্পত্তিগ্রিডে সম্পত্তি
আপনি Button
ভিজ্যুয়াল স্টুডিওতে কাজ করতে পারেন । তার সম্পত্তি দেখানো হয় PropertyGrid
মত Text
, Name
ইত্যাদি যখন আমরা ড্র্যাগ এবং একটি বাটন ড্রপ, এবং যখন আমরা বৈশিষ্ট্য ক্লিক করুন, এটি স্বয়ংক্রিয়ভাবে বর্গ পাবেন Button
এবং ফিল্টার Properties
শো যে PropertyGrid
(যেখানে PropertyGrid
দেখানো হবে না Field
যদিও তারা সর্বজনীন)।
public class Button
{
private string _text;
private string _name;
private string _someProperty;
public string Text
{
get
{
return _text;
}
set
{
_text = value;
}
}
public string Name
{
get
{
return _name;
}
set
{
_name = value;
}
}
[Browsable(false)]
public string SomeProperty
{
get
{
return _someProperty;
}
set
{
_someProperty= value;
}
}
ইন PropertyGrid
, বৈশিষ্ট্য Name
এবং Text
প্রদর্শিত হবে, কিন্তু না SomeProperty
। কেন ??? কারণ সম্পত্তিগুলি অ্যাট্রিবিউট গ্রহণ করতে পারে । এটি কোথায় [Browsable(false)]
মিথ্যা আছে তা প্রদর্শন করে না ।
৩. সম্পত্তিগুলির ভিতরে বিবৃতি কার্যকর করতে পারে
public class Rows
{
private string _count;
public int Count
{
get
{
return CalculateNoOfRows();
}
}
public int CalculateNoOfRows()
{
// Calculation here and finally set the value to _count
return _count;
}
}
৪. শুধুমাত্র বাঁধাই উত্সগুলিতে সম্পত্তি ব্যবহার করা যেতে পারে
বাইন্ডিং সোর্স আমাদের কোডের লাইনের সংখ্যা হ্রাস করতে সহায়তা করে। Fields
দ্বারা গৃহীত হয় না BindingSource
। আমাদের এটি ব্যবহার করা উচিত Properties
।
5. ডিবাগিং মোড
বিবেচনা করুন আমরা Field
কোনও মান ধরে রাখতে ব্যবহার করছি। এক পর্যায়ে আমাদের ডিবাগ করে পরীক্ষা করতে হবে যেখানে ক্ষেত্রটির জন্য মানটি নালাগ্রস্থ হচ্ছে। যেখানে কোড লাইনের সংখ্যা 1000. চেয়ে বেশি এ ধরনের পরিস্থিতি আমরা ব্যবহার করতে পারেন না কঠিন হবে Property
এবং ডিবাগ মোড ভিতরে সেট করতে পারেন Property
।
public string Name
{
// Can set debug mode inside get or set
get
{
return _name;
}
set
{
_name = value;
}
}
একটি ক্ষেত্র একটি পরিবর্তনশীল যা সরাসরি শ্রেণি বা কাঠামোয় ঘোষিত হয়। কোনও শ্রেণি বা কাঠামোর উদাহরণ ক্ষেত্র বা স্থির ক্ষেত্র বা উভয়ই থাকতে পারে। সাধারণত, আপনার ব্যক্তিগত বা সুরক্ষিত অ্যাক্সেসযোগ্যতাযুক্ত ভেরিয়েবলগুলির জন্য আপনার ক্ষেত্রগুলি ব্যবহার করা উচিত । আপনার ক্লাসেন্ট ক্লায়েন্ট কোডে প্রকাশ করে এমন ডেটা পদ্ধতি, বৈশিষ্ট্য এবং সূচকগুলির মাধ্যমে সরবরাহ করা উচিত । অভ্যন্তরীণ ক্ষেত্রগুলিতে অপ্রত্যক্ষ অ্যাক্সেসের জন্য এই নির্মাণগুলি ব্যবহার করে আপনি অবৈধ ইনপুট মানগুলির বিরুদ্ধে রক্ষা করতে পারেন।
একটি সম্পত্তি সদস্য যে পড়তে, লিখতে, অথবা একটি বেসরকারী ক্ষেত্রের মান গনা একটি নমনীয় প্রক্রিয়া প্রদান করে। বৈশিষ্ট্যগুলি জনসাধারণের ডেটা সদস্য হিসাবে ব্যবহার করা যেতে পারে তবে এগুলি আসলে অ্যাকসেসর নামক বিশেষ পদ্ধতি । এটি ডেটা সহজে অ্যাক্সেস করতে সক্ষম করে এবং তবুও পদ্ধতিগুলির সুরক্ষা এবং নমনীয়তা প্রচার করতে সহায়তা করে । বৈশিষ্ট্য বাস্তবায়ন বা যাচাইকরণ কোডটি গোপন করার সময় মানগুলি পাওয়ার এবং সেট করার জনসাধারণের উপায় প্রকাশ করতে কোনও শ্রেণিকে সক্ষম করে। একটি সম্পত্তি সম্পত্তি অ্যাক্সেসর সম্পত্তি মান ফেরত ব্যবহার করা হয়, এবং একটি সেট অ্যাক্সেসর একটি নতুন মান বরাদ্দ করতে ব্যবহৃত হয়।
সম্পত্তির জনসাধারণের ইন্টারফেসটি না ভেঙে কোনও বস্তুর ডেটা অ্যাক্সেসের উপায় পরিবর্তন করার অনুমতি দেওয়ার প্রাথমিক সুবিধা রয়েছে। উদাহরণস্বরূপ, যদি আপনাকে অতিরিক্ত বৈধতা যুক্ত করতে হয়, বা কোনও সঞ্চিত ক্ষেত্রকে গণনাতে পরিবর্তন করতে হয় তবে আপনি যদি প্রাথমিকভাবে ক্ষেত্রটি সম্পত্তি হিসাবে উদ্ভাসিত করেন তবে আপনি এত সহজেই করতে পারেন। আপনি যদি কেবল কোনও ক্ষেত্র সরাসরি উন্মুক্ত করেন, তবে নতুন কার্যকারিতা যুক্ত করতে আপনাকে আপনার শ্রেণীর পাবলিক ইন্টারফেসটি পরিবর্তন করতে হবে। এই পরিবর্তনটি বিদ্যমান ক্লায়েন্টদের ভেঙে দেবে, আপনার কোডের নতুন সংস্করণটি ব্যবহার করার আগে তাদের পুনরায় সংযুক্ত করা দরকার।
যদি আপনি প্রশস্ত ব্যবহারের জন্য ডিজাইন করা কোনও ক্লাস লাইব্রেরি লিখেন (যেমন। নেট ফ্রেমওয়ার্ক, যা লক্ষ লক্ষ লোক ব্যবহার করে) তবে সমস্যা হতে পারে। তবে, যদি আপনি একটি ছোট কোড বেসের অভ্যন্তরীণভাবে ব্যবহৃত ক্লাস লিখছেন (বলুন <= 50 কে লাইন) তবে এটি সত্যিই খুব বড় বিষয় নয়, কারণ আপনার পরিবর্তনের ফলে কেউ বিরূপ প্রভাবিত হবে না। সেক্ষেত্রে এটি কেবল ব্যক্তিগত পছন্দকে নেমে আসে।
প্রোপার্টি অসমমিতিক অ্যাক্সেস সমর্থন করে, অর্থাত্ আপনি একজন গিটার এবং একটি সেটার বা দুটির মধ্যে একটি হতে পারেন। একইভাবে বৈশিষ্ট্যগুলি গেটর / সেটারের জন্য পৃথক অ্যাক্সেসিবিলিটি সমর্থন করে। ক্ষেত্রগুলি সর্বদা প্রতিসম হয়, আপনি সর্বদা মান উভয়ই পেতে এবং সেট করতে পারেন। এর ব্যতিক্রমটি কেবল পঠনযোগ্য ক্ষেত্র যা স্পষ্টতই আরম্ভের পরে সেট করা যায় না।
বৈশিষ্ট্যগুলি খুব দীর্ঘ সময় ধরে চলতে পারে, এর পার্শ্ব প্রতিক্রিয়া হতে পারে এবং ব্যতিক্রমও ছুঁড়ে দিতে পারে। ক্ষেত্রগুলি দ্রুত, কোনও পার্শ্ব প্রতিক্রিয়া ছাড়াই, এবং কখনও ব্যতিক্রম ছুঁড়ে ফেলবে না। পার্শ্ব প্রতিক্রিয়াগুলির কারণে কোনও সম্পত্তি প্রতিটি কলের জন্য পৃথক মান ফেরত দিতে পারে (যেমনটি ডেটটাইম.নো, যেমন ডেটটাইম for এখন সবসময় ডেটটাইম.নো এর সমান হয় না)। ক্ষেত্রগুলি সর্বদা একই মান প্রদান করে।
ক্ষেত্রগুলি আউট / রেফ প্যারামিটারের জন্য ব্যবহৃত হতে পারে, বৈশিষ্ট্যগুলি নাও পারে। বৈশিষ্ট্যগুলি অতিরিক্ত যুক্তি সমর্থন করে - এটি অন্যান্য জিনিসের মধ্যে অলস লোডিং প্রয়োগ করতে ব্যবহার করা যেতে পারে।
বৈশিষ্ট্যগুলি মান পেতে / সেট করতে যা বোঝায় তার অর্থ এনপ্যাপুলেশন করে বিমূর্তির একটি স্তরকে সমর্থন করে।
বেশিরভাগ / সমস্ত ক্ষেত্রে বৈশিষ্ট্যগুলি ব্যবহার করুন তবে পার্শ্ব প্রতিক্রিয়া এড়াতে চেষ্টা করুন।
পটভূমিতে একটি সম্পত্তি পদ্ধতিতে সংকলিত হয়। সুতরাং একটি Name
সম্পত্তি get_Name()
এবং মধ্যে সংকলিত হয় set_Name(string value)
। আপনি সংকলিত কোড অধ্যয়ন করলে আপনি এটি দেখতে পারেন। সুতরাং তাদের ব্যবহার করার সময় একটি (খুব) ছোট পারফরম্যান্স রয়েছে। সাধারণত আপনি যদি বাইরে কোনও ক্ষেত্র প্রকাশ করেন তবে আপনি সর্বদা সম্পত্তি ব্যবহার করবেন এবং যদি আপনাকে মানটির বৈধতা দেওয়ার প্রয়োজন হয় তবে আপনি প্রায়শই অভ্যন্তরীণভাবে এটি ব্যবহার করবেন।
যখন আপনি চান যে আপনার ব্যক্তিগত ভেরিয়েবল (ক্ষেত্র) অন্য শ্রেণীর থেকে আপনার শ্রেণীর অবজেক্টে অ্যাক্সেসযোগ্য হবে তখন আপনাকে সেই ভেরিয়েবলগুলির জন্য সম্পত্তি তৈরি করতে হবে।
উদাহরণস্বরূপ, যদি আমার কাছে "আইডি" এবং "নাম" নামে ব্যক্তিগতকৃত ভেরিয়েবল থাকে যা ব্যক্তিগত তবে তবে এমন পরিস্থিতি থাকতে পারে যেখানে শ্রেণীর বাইরে এই লেখকটি পড়তে / লেখার জন্য প্রয়োজন হয়। এই পরিস্থিতিতে, সম্পত্তি আমাকে সম্পত্তির জন্য সংজ্ঞায়িত get / সেট এর উপর নির্ভর করে সেই পরিবর্তনশীলটি পড়তে / লিখতে সহায়তা করতে পারে। একটি সম্পত্তি কেবল পঠনযোগ্য / লেখার জন্য / পাঠ্য লেখার উভয়ই হতে পারে।
এখানে ডেমো
class Employee
{
// Private Fields for Employee
private int id;
private string name;
//Property for id variable/field
public int EmployeeId
{
get
{
return id;
}
set
{
id = value;
}
}
//Property for name variable/field
public string EmployeeName
{
get
{
return name;
}
set
{
name = value;
}
}
}
class MyMain
{
public static void Main(string [] args)
{
Employee aEmployee = new Employee();
aEmployee.EmployeeId = 101;
aEmployee.EmployeeName = "Sundaran S";
}
}
এখানে দ্বিতীয় প্রশ্ন, "সম্পত্তির পরিবর্তে ক্ষেত্রটি কখন ব্যবহার করা উচিত?", কেবলমাত্র এই অন্যান্য উত্তরটিতে খুব সংক্ষেপে স্পর্শ করা হয় এবং এটিকেও কিন্ডা করা হয় , তবে আসলে খুব বেশি বিস্তারিত বলা যায় না।
সাধারণভাবে, অন্য সমস্ত উত্তরগুলি ভাল ডিজাইন সম্পর্কে স্পট-অন: এক্সপোজিং ফিল্ডগুলির চেয়ে এক্সপোজিং প্রোপার্টি পছন্দ করে। আপনি সম্ভবত করবে না নিয়মিতভাবে নিজেকে বলছে এটি "বাহ, কল্পনা কত খারাপ জিনিষ হবে যদি আমি একটি সম্পত্তির পরিবর্তে এই একটি ক্ষেত্র তৈরি করেছে" এটা আছে, এত , একটি অবস্থা যেখানে আপনি বলতে "ঘেউ হবে মনে আরো বিরল Godশ্বরের ধন্যবাদ আমি এখানে সম্পত্তির পরিবর্তে একটি ক্ষেত্র ব্যবহার করেছি। "
তবে ক্ষেত্রগুলির আরও বেশি বৈশিষ্ট্য রয়েছে এমন একটি সুবিধা রয়েছে এবং এটি "রেফ" / "আউট" পরামিতি হিসাবে তাদের ব্যবহারের দক্ষতা। মনে করুন নীচের স্বাক্ষর সহ আপনার কোনও পদ্ধতি রয়েছে:
public void TransformPoint(ref double x, ref double y);
এবং ধরুন যে আপনি এই পদ্ধতিটি এইভাবে তৈরি অ্যারে রূপান্তর করতে ব্যবহার করতে চান:
System.Windows.Point[] points = new Point[1000000];
Initialize(points);
এক্স এবং ওয়াইয়ের বৈশিষ্ট্য হওয়ায় এটি করার দ্রুততম উপায়টি এখানে আমি মনে করি :
for (int i = 0; i < points.Length; i++)
{
double x = points[i].X;
double y = points[i].Y;
TransformPoint(ref x, ref y);
points[i].X = x;
points[i].Y = y;
}
এবং এটি বেশ ভাল হতে চলেছে! অন্যথায় প্রমাণিত আপনার পরিমাপ না থাকলে দুর্গন্ধ ছোঁড়ার কোনও কারণ নেই। তবে আমি বিশ্বাস করি এটি প্রযুক্তিগতভাবে এর চেয়ে দ্রুত হওয়ার গ্যারান্টিযুক্ত নয়:
internal struct MyPoint
{
internal double X;
internal double Y;
}
// ...
MyPoint[] points = new MyPoint[1000000];
Initialize(points);
// ...
for (int i = 0; i < points.Length; i++)
{
TransformPoint(ref points[i].X, ref points[i].Y);
}
কিছু পরিমাপ নিজেই করাতে, ক্ষেত্রগুলির সাথে সংস্করণ বৈশিষ্ট্যগুলির সাথে সংস্করণ হিসাবে .১% সময় নেয় (নেট নেট 4.6, উইন্ডোজ 7, x64, রিলিজ মোড, কোনও ডিবাগার সংযুক্ত নেই) attached TransformPoint
পদ্ধতিটি যত ব্যয়বহুল হবে ততই তাত্পর্যপূর্ণ হয়ে উঠবে। এটি নিজেই পুনরাবৃত্তি করতে, প্রথম লাইনে কমেন্ট-আউট চালনা করুন এবং এটির সাথে মন্তব্য করা হয়নি।
এমনকি উপরের জন্য কোনও কার্যকারিতা সুবিধা না থাকলেও, এমন অন্যান্য জায়গাগুলি রয়েছে যেখানে রেফ এবং আউট প্যারামিটারগুলি ব্যবহার করতে সক্ষম হওয়া উপকারী হতে পারে, যেমন ইন্টারলকড বা অস্থির পরিবারকে পদ্ধতির কল করার সময়। দ্রষ্টব্য: এটি যদি আপনার কাছে নতুন হয় তবে ভোলাটাইল মূলত volatile
কীওয়ার্ডের সরবরাহ করা একই আচরণের উপায় । যেমন, এর মতো volatile
, এটি এর যাদুকরীভাবে সমস্ত থ্রেড-সুরক্ষা সমস্যাগুলি সমাধান করে না যেমন এর নাম থেকেই বোঝায় যে এটি হতে পারে।
আমি স্পষ্টতই দেখতে চাই না যে আমি আপনার পরামর্শ দিচ্ছি যে "ওহ, আমার সম্পত্তিগুলির পরিবর্তে ক্ষেত্রগুলি প্রকাশ করা উচিত।" মুল বক্তব্যটি হ'ল যদি আপনার এই সদস্যদের নিয়মিত "রেফ" বা "আউট" পরামিতিগুলি কল করা প্রয়োজন হয়, বিশেষত এমন একটি সাধারণ মানের ধরণের যা সম্ভবত বৈশিষ্ট্যের কোনও মান-যুক্ত উপাদানগুলির প্রয়োজন না হয়, একটি যুক্তি তৈরি করা যেতে পারে।
ক্ষেত্র এবং বৈশিষ্ট্য একে অপরের সাথে সমান বলে মনে হলেও এগুলি 2 সম্পূর্ণ ভিন্ন ভাষার উপাদান।
ক্ষেত্রগুলি হ'ল শ্রেণি স্তরে ডেটা সংরক্ষণ করার একমাত্র প্রক্রিয়া। ক্ষেত্রগুলি ক্লাস স্কোপে ধারণামূলকভাবে পরিবর্তনশীল। আপনি যদি আপনার ক্লাসগুলির উদাহরণগুলিতে কিছু তথ্য সঞ্চয় করতে চান (অবজেক্টস) আপনার ক্ষেত্রগুলি ব্যবহার করা দরকার। অন্য কোন উপায় নেই। বৈশিষ্ট্যগুলি কোনও ডেটা সংরক্ষণ করতে পারে না যদিও এটি দেখতে সক্ষম হতে পারে so নীচে দেখুন.
অন্যদিকে সম্পত্তি কখনও ডেটা সঞ্চয় করে না। এগুলি কেবল পদ্ধতির জোড়া (প্রাপ্ত এবং সেট) যা সিন্ট্যাক্টিক্যালি ফিল্ড হিসাবে একইভাবে বলা যেতে পারে এবং বেশিরভাগ ক্ষেত্রে তারা ক্ষেত্রগুলিতে অ্যাক্সেস (পড়তে বা লেখার জন্য) যা কিছু বিভ্রান্তির উত্স। তবে সম্পত্তি সংক্রান্ত পদ্ধতিগুলি (নির্দিষ্ট প্রোটোটাইপের মতো কিছু সীমাবদ্ধতার সাথে) নিয়মিত সি # পদ্ধতিতে নিয়মিত পদ্ধতি যা কিছু করতে পারে তা তারা করতে পারে। এর অর্থ তাদের কোডের 1000 টি লাইন থাকতে পারে, তারা ব্যতিক্রম ছুঁড়ে দিতে পারে, অন্য কোনও পদ্ধতিতে কল করতে পারে, এমনকি ভার্চুয়াল, বিমূর্ত বা ওভাররাইডও হতে পারে। বৈশিষ্ট্যগুলি কী বিশেষ করে তোলে, এটি হ'ল সি # সংকলক কিছু অতিরিক্ত মেটাডেটা অ্যাসেমব্লিতে সঞ্চয় করে যা নির্দিষ্ট বৈশিষ্ট্যগুলি অনুসন্ধান করতে ব্যবহৃত হতে পারে - বহুল ব্যবহৃত বৈশিষ্ট্য।
সম্পত্তি অর্জনের পদ্ধতিগুলি পান এবং সেট করার জন্য নিম্নলিখিত প্রোটোটাইপ থাকে।
PROPERTY_TYPE get();
void set(PROPERTY_TYPE value);
সুতরাং এর অর্থ হল কোনও ক্ষেত্র এবং 2 টি সম্পর্কিত পদ্ধতি নির্ধারণ করে বৈশিষ্ট্যগুলি 'অনুকরণ' করা যায়।
class PropertyEmulation
{
private string MSomeValue;
public string GetSomeValue()
{
return(MSomeValue);
}
public void SetSomeValue(string value)
{
MSomeValue=value;
}
}
এই জাতীয় সম্পত্তি এমুলেশন প্রোগ্রামিং ভাষাগুলির জন্য আদর্শ যা বৈশিষ্ট্যগুলি সমর্থন করে না - যেমন স্ট্যান্ডার্ড সি ++। সি # তে আপনার ক্ষেত্রগুলিতে অ্যাক্সেস করার উপায় হিসাবে আপনার সর্বদা বৈশিষ্ট্যগুলিকে পছন্দ করা উচিত।
যেহেতু কেবলমাত্র ক্ষেত্রগুলি কোনও ডেটা সঞ্চয় করতে পারে, এর অর্থ হ'ল আরও ক্ষেত্র শ্রেণিতে রয়েছে, এই জাতীয় শ্রেণীর আরও মেমরি অবজেক্ট গ্রাস করবে। অন্যদিকে, একটি শ্রেণিতে নতুন বৈশিষ্ট্য যুক্ত করা এই জাতীয় শ্রেণীর অবজেক্টগুলিকে বড় করে না। এখানে উদাহরণ।
class OneHundredFields
{
public int Field1;
public int Field2;
...
public int Field100;
}
OneHundredFields Instance=new OneHundredFields() // Variable 'Instance' consumes 100*sizeof(int) bytes of memory.
class OneHundredProperties
{
public int Property1
{
get
{
return(1000);
}
set
{
// Empty.
}
}
public int Property2
{
get
{
return(1000);
}
set
{
// Empty.
}
}
...
public int Property100
{
get
{
return(1000);
}
set
{
// Empty.
}
}
}
OneHundredProperties Instance=new OneHundredProperties() // !!!!! Variable 'Instance' consumes 0 bytes of memory. (In fact a some bytes are consumed becasue every object contais some auxiliarity data, but size doesn't depend on number of properties).
যদিও সম্পত্তি পদ্ধতিগুলি কিছু করতে পারে, বেশিরভাগ ক্ষেত্রে তারা কীভাবে বস্তুর ক্ষেত্রগুলিতে অ্যাক্সেস করতে পারে তার উপায় হিসাবে কাজ করে। আপনি যদি অন্য শ্রেণীতে কোনও ক্ষেত্রকে অ্যাক্সেসযোগ্য করতে চান তবে আপনি 2 উপায়ে করতে পারেন।
এখানে সর্বজনীন ক্ষেত্র ব্যবহার করে একটি বর্গ রয়েছে।
class Name
{
public string FullName;
public int YearOfBirth;
public int Age;
}
Name name=new Name();
name.FullName="Tim Anderson";
name.YearOfBirth=1979;
name.Age=40;
কোডটি পুরোপুরি বৈধ হলেও ডিজাইনের দৃষ্টিকোণ থেকে এটির বেশ কয়েকটি ত্রুটি রয়েছে। ক্ষেত্রগুলি উভয়ই পড়া এবং লিখিত হতে পারে, তাই আপনি ব্যবহারকারীদের ক্ষেত্রে লেখার হাত থেকে আটকাতে পারবেন না। আপনি readonly
কীওয়ার্ড প্রয়োগ করতে পারেন , তবে এইভাবে, আপনাকে কেবলমাত্র নির্মাণকারীতে কেবল পাঠযোগ্য ক্ষেত্রগুলি শুরু করতে হবে। আরও কী, আপনার ক্ষেত্রগুলিতে কোনও কিছুই আপনাকে অবৈধ মান রাখতে বাধা দেয় না।
name.FullName=null;
name.YearOfBirth=2200;
name.Age=-140;
কোডটি বৈধ, সমস্ত অ্যাসাইনমেন্টগুলি অযৌক্তিক হলেও কার্যকর করা হবে। Age
একটি নেতিবাচক মান আছে, YearOfBirth
ভবিষ্যতে অনেক দূরে এবং বয়সের সাথে মিলে যায় না এবং FullName
শূন্য হয়। ক্ষেত্রগুলির সাহায্যে আপনি ব্যবহারকারীদের এ class Name
জাতীয় ভুল করতে আটকাতে পারবেন না ।
এই সমস্যাগুলি সমাধান করে এমন বৈশিষ্ট্য সহ এখানে একটি কোড।
class Name
{
private string MFullName="";
private int MYearOfBirth;
public string FullName
{
get
{
return(MFullName);
}
set
{
if (value==null)
{
throw(new InvalidOperationException("Error !"));
}
MFullName=value;
}
}
public int YearOfBirth
{
get
{
return(MYearOfBirth);
}
set
{
if (MYearOfBirth<1900 || MYearOfBirth>DateTime.Now.Year)
{
throw(new InvalidOperationException("Error !"));
}
MYearOfBirth=value;
}
}
public int Age
{
get
{
return(DateTime.Now.Year-MYearOfBirth);
}
}
public string FullNameInUppercase
{
get
{
return(MFullName.ToUpper());
}
}
}
শ্রেণীর আপডেট হওয়া সংস্করণটির নিম্নলিখিত সুবিধা রয়েছে।
FullName
এবং YearOfBirth
অবৈধ মান জন্য পরীক্ষা করা হয়।Age
লিখনযোগ্য নয়। এটি YearOfBirth
বর্তমান বছরের থেকে কলকুলেটেড ।FullNameInUppercase
রূপান্তর FullName
করে। এটি সম্পত্তি ব্যবহারের সামান্য স্বীকৃত উদাহরণ, যেখানে বৈশিষ্ট্যগুলি সাধারণত ব্যবহারকারীর পক্ষে উপযুক্ত যে বিন্যাসে ক্ষেত্রের মানগুলি উপস্থাপন করতে ব্যবহৃত হয় - উদাহরণস্বরূপ DateTime
বিন্যাসের নির্দিষ্ট সংখ্যায় বর্তমান লোকেল ব্যবহার করে।এর পাশাপাশি, বৈশিষ্ট্যগুলিকে ভার্চুয়াল বা ওভাররাইড হিসাবে সংজ্ঞায়িত করা যায় - কেবল কারণ এটি নিয়মিত। নেট পদ্ধতি ET নিয়মিত পদ্ধতি হিসাবে যেমন সম্পত্তি পদ্ধতির ক্ষেত্রে একই বিধি প্রযোজ্য।
সি # এছাড়াও সূচকগুলিকে সমর্থন করে যা বৈশিষ্ট্যগুলির মধ্যে সম্পত্তি বৈশিষ্ট্যের একটি সূচক পরামিতি রয়েছে। এখানে উদাহরণ।
class MyList
{
private string[] MBuffer;
public MyList()
{
MBuffer=new string[100];
}
public string this[int Index]
{
get
{
return(MBuffer[Index]);
}
set
{
MBuffer[Index]=value;
}
}
}
MyList List=new MyList();
List[10]="ABC";
Console.WriteLine(List[10]);
যেহেতু সি # 3.0 আপনাকে স্বয়ংক্রিয় বৈশিষ্ট্যগুলি সংজ্ঞায়িত করতে দেয়। এখানে উদাহরণ।
class AutoProps
{
public int Value1
{
get;
set;
}
public int Value2
{
get;
set;
}
}
যদিও class AutoProps
কেবলমাত্র বৈশিষ্ট্য রয়েছে (বা এটির মতো দেখায়), এটি 2 টি মান সংরক্ষণ করতে পারে এবং এই শ্রেণীর বস্তুর আকার sizeof(Value1)+sizeof(Value2)
= 4 + 4 = 8 বাইটের সমান ।
এটার কারন খুবিই সাধারন. আপনি যখন একটি স্বয়ংক্রিয় সম্পত্তি সংজ্ঞায়িত করেন, সি # সংকলক স্বয়ংক্রিয় কোড উত্পন্ন করে যার মধ্যে লুকানো ক্ষেত্র এবং এই গোপন ক্ষেত্রটিতে অ্যাক্সেসের সম্পত্তি পদ্ধতি সহ একটি সম্পত্তি রয়েছে। এখানে কোড সংকলক উত্পাদন করে।
সংকলিত সমাবেশ থেকে আইএলএসপি দ্বারা উত্পাদিত একটি কোড এখানে । শ্রেণিতে উত্পাদিত লুকানো ক্ষেত্র এবং বৈশিষ্ট্য রয়েছে।
internal class AutoProps
{
[CompilerGenerated]
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private int <Value1>k__BackingField;
[CompilerGenerated]
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private int <Value2>k__BackingField;
public int Value1
{
[CompilerGenerated]
get
{
return <Value1>k__BackingField;
}
[CompilerGenerated]
set
{
<Value1>k__BackingField = value;
}
}
public int Value2
{
[CompilerGenerated]
get
{
return <Value2>k__BackingField;
}
[CompilerGenerated]
set
{
<Value2>k__BackingField = value;
}
}
}
সুতরাং, যেমন আপনি দেখতে পাচ্ছেন, সংকলকটি এখনও মানগুলি সংরক্ষণের জন্য ক্ষেত্রগুলি ব্যবহার করে - যেহেতু ক্ষেত্রগুলি কেবলমাত্র বস্তুকে কীভাবে মান সংরক্ষণ করতে পারে are
আপনি যেমন দেখতে পাচ্ছেন, যদিও বৈশিষ্ট্য এবং ক্ষেত্রগুলিতে একই রকম ব্যবহার সিনট্যাক্স রয়েছে সেগুলি খুব আলাদা ধারণা। এমনকি যদি আপনি স্বয়ংক্রিয় বৈশিষ্ট্য বা ইভেন্টগুলি ব্যবহার করেন - লুকানো ক্ষেত্রগুলি সংকলক দ্বারা উত্পন্ন হয় যেখানে আসল ডেটা সংরক্ষণ করা হয়।
আপনার যদি ক্ষেত্রের মানটি বাইরের বিশ্বে অ্যাক্সেসযোগ্য করে তুলতে হয় (আপনার শ্রেণীর ব্যবহারকারীরা) সর্বজনীন বা সুরক্ষিত ক্ষেত্রগুলি ব্যবহার করবেন না। ক্ষেত্রগুলি সর্বদা ব্যক্তিগত হিসাবে চিহ্নিত করা উচিত। বৈশিষ্ট্যগুলি আপনাকে মান চেক, ফর্ম্যাটিং, রূপান্তর ইত্যাদি তৈরি করতে দেয় এবং সাধারণত আপনার কোডটিকে আরও নিরাপদ, আরও পঠনযোগ্য এবং ভবিষ্যতের পরিবর্তনের জন্য আরও প্রসারিত করে তোলে।
আপনি যদি থ্রেড আদিম ব্যবহার করতে চলেছেন তবে আপনাকে ক্ষেত্রগুলি ব্যবহার করতে বাধ্য করা হবে। বৈশিষ্ট্যগুলি আপনার থ্রেডযুক্ত কোডটি ভেঙে দিতে পারে। তা ছাড়াও কোরি যা বলেছেন তা সঠিক।
(এটি সত্যই একটি মন্তব্য হওয়া উচিত, তবে আমি কোনও মন্তব্য পোস্ট করতে পারি না, সুতরাং পোস্ট হিসাবে এটি উপযুক্ত না হলে দয়া করে ক্ষমা করে দিন)।
আমি একবার এমন জায়গায় কাজ করেছি যেখানে প্রস্তাবিত অনুশীলনটি ছিল সম্পত্তিগুলির পরিবর্তে সর্বজনীন ক্ষেত্রগুলি ব্যবহার করা যখন সমপরিমাণ সম্পত্তি ডিএফ সবেমাত্র কোনও ক্ষেত্র অ্যাক্সেস করত, যেমন:
get { return _afield; }
set { _afield = value; }
তাদের যুক্তি ছিল যে প্রয়োজনের পরে যদি ভবিষ্যতে জনসাধারণের ক্ষেত্রটি একটি সম্পত্তিতে রূপান্তরিত হতে পারে। এ সময়টি আমার কাছে কিছুটা অদ্ভুত মনে হয়েছিল। এই পোস্টগুলির দ্বারা বিচার করে, দেখে মনে হচ্ছে এখানে অনেকগুলিই একমত হবে না। জিনিসগুলি পরিবর্তনের চেষ্টা করার জন্য আপনি কী বলেছিলেন?
সম্পাদনা: আমার যুক্ত করা উচিত যে এই জায়গাগুলির সমস্ত কোড বেস একই সময়ে সংকলিত হয়েছিল, তাই তারা সম্ভবত ভেবেছিল যে ক্লাসগুলির পাবলিক ইন্টারফেস পরিবর্তন করা (কোনও পাবলিক ফিল্ডকে সম্পত্তি হিসাবে পরিবর্তন করে) কোনও সমস্যা ছিল না।
প্রযুক্তিগতভাবে, আমি মনে করি না যে কোনও পার্থক্য আছে, কারণ বৈশিষ্ট্যগুলি কেবল ব্যবহারকারী দ্বারা তৈরি ক্ষেত্রের চারপাশে কেবল মোড়কযুক্ত বা সংকলক দ্বারা স্বয়ংক্রিয়ভাবে তৈরি করা হয় properties বৈশিষ্ট্যের উদ্দেশ্য হ'ল এনক্যাপাসুয়েশন প্রয়োগ করা এবং একটি হালকা পদ্ধতির মতো বৈশিষ্ট্য সরবরাহ করা। ক্ষেত্রগুলিকে জনসাধারণ হিসাবে ঘোষণা করা কেবল একটি খারাপ অভ্যাস, তবে এতে কোনও সমস্যা নেই।
ক্ষেত্রগুলি সাধারণ সদস্য ভেরিয়েবল বা শ্রেণীর সদস্য দৃষ্টান্ত। প্রোপার্টি একটি হয় পেতে এবং তাদের মান সেট করতে বিমূর্ততা । বৈশিষ্ট্যগুলিকে অ্যাক্সেসরও বলা হয় কারণ তারা শ্রেণিতে কোনও ক্ষেত্রকে ব্যক্তিগত হিসাবে প্রকাশ করলে তারা ক্ষেত্র পরিবর্তন এবং পুনরুদ্ধার করার জন্য একটি উপায় সরবরাহ করে। সাধারণত, আপনার নিজের সদস্যদের ভেরিয়েবলগুলি ব্যক্তিগত হিসাবে ঘোষণা করা উচিত, তারপরে তাদের জন্য বৈশিষ্ট্য ঘোষণা বা সংজ্ঞায়িত করা উচিত।
class SomeClass
{
int numbera; //Field
//Property
public static int numbera { get; set;}
}
বৈশিষ্ট্যগুলি ক্ষেত্রগুলিকে encapsulate করে, এভাবে আপনাকে সেট করা বা পুনরুদ্ধার করা মানটিতে অতিরিক্ত প্রসেসিং করতে সক্ষম করে। আপনি যদি ক্ষেত্রের মানটিতে কোনও প্রাক-বা পোস্টপ্রসেসিং না করে থাকেন তবে বৈশিষ্ট্যগুলি ব্যবহার করা সাধারণত ওভারকিল।
Ditionতিহ্যগতভাবে ব্যক্তিগত ক্ষেত্রগুলি গেটর এবং সেটার পদ্ধতির মাধ্যমে সেট করা হয়। কম কোডের খাতিরে আপনি তার পরিবর্তে ক্ষেত্রগুলি সেট করতে সম্পত্তি ব্যবহার করতে পারেন।
যখন আপনার একটি ক্লাস থাকে যা "গাড়ি"। বৈশিষ্ট্যগুলি হ'ল রঙ, আকৃতি ..
ক্ষেত্রগুলি যেমন শ্রেণীর ক্ষেত্রের মধ্যে সংজ্ঞাযুক্ত ভেরিয়েবল Where
উইকিপিডিয়া থেকে - অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং :
অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (ওওপি) হ'ল "অবজেক্টস" এর ধারণার ভিত্তিতে একটি প্রোগ্রামিং দৃষ্টান্ত, যা ক্ষেত্র আকারে ডেটা স্ট্রাকচার যা ডেটা ধারণ করে , প্রায়শ বৈশিষ্ট্য হিসাবে পরিচিত; প্রক্রিয়া আকারে এবং কোড, প্রায়শই পদ্ধতি হিসাবে পরিচিত । (সামনে জোর দাও)
বৈশিষ্ট্যগুলি আসলে কোনও বস্তুর আচরণের অংশ, তবে বস্তুর গ্রাহকদেরকে অবজেক্টের ডেটা দিয়ে কাজ করার মায়া / বিমূর্ততা দেওয়ার জন্য ডিজাইন করা হয়েছে।
আমার একটি ক্ষেত্রের নকশা হ'ল ক্ষেত্রটি কেবলমাত্র তার পিতামাতার দ্বারা পরিবর্তিত হওয়া দরকার, সুতরাং শ্রেণিটি। পরিবর্তনশীলটি ব্যক্তিগত হয়ে যায়, তারপরে আমি কেবল গেট দিয়ে সম্পত্তি ব্যবস্থায় যাব তার বাইরে ক্লাস / পদ্ধতিগুলি পড়ার অধিকার দিতে সক্ষম হতে। ক্ষেত্রটি তখন সম্পত্তি দ্বারা পুনরুদ্ধার করা হয় এবং কেবল পঠনযোগ্য! আপনি যদি এটি পরিবর্তন করতে চান তবে আপনাকে পদ্ধতিগুলি (উদাহরণস্বরূপ নির্মাতা) যেতে হবে এবং আমি দেখতে পেয়েছি যে আপনাকে সুরক্ষিত করার এই উপায়টির জন্য আমাদের কোডের উপর আমাদের আরও ভাল নিয়ন্ত্রণ রয়েছে কারণ আমরা "ফ্ল্যাঞ্জ" করছি " একজন সর্বদাই সর্বসাধারণের কাছে সর্বদা প্রকাশ করতে পারে তাই প্রতিটি সম্ভাব্য ক্ষেত্রে, ভেরিয়েবল / পদ্ধতি / শ্রেণি ইত্যাদির ধারণা ... আমার মতে কোডের বিকাশ, রক্ষণাবেক্ষণের জন্য কেবল একটি সহায়তা। উদাহরণস্বরূপ, যদি কোনও ব্যক্তি সর্বজনীন ক্ষেত্রগুলির সাথে একটি কোড পুনরায় চালু করে, তবে সে কিছু করতে পারে এবং তাই "অযৌক্তিক" উদ্দেশ্য সম্পর্কিত, কোডটি কেন লেখা হয়েছিল তার যুক্তিযুক্ত। এটা আমার দৃষ্টিভঙ্গি।
যখন আমি একটি ক্লাসিক মডেল ব্যক্তিগত ক্ষেত্র / পাবলিক পঠনযোগ্য বৈশিষ্ট্যগুলি ব্যবহার করি, তখন 10 টি বেসরকারী ক্ষেত্রের জন্য আমার 10 টি পাবলিক বৈশিষ্ট্য লেখা উচিত! কোডটি সত্যিই দ্রুততর হতে পারে। আমি প্রাইভেট সেটারটি আবিষ্কার করি এবং এখন আমি কেবলমাত্র একটি প্রাইভেট সেটার দিয়ে সর্বজনীন সম্পত্তি ব্যবহার করি। সেটার ব্যাকগ্রাউন্ডে একটি ব্যক্তিগত ক্ষেত্র তৈরি করে।
আমার পুরানো ক্লাসিক প্রোগ্রামিং শৈলীটি হ'ল:
public class MyClass
{
private int _id;
public int ID { get { return _id; } }
public MyClass(int id)
{
_id = id;
}
}
আমার নতুন প্রোগ্রামিং শৈলী:
public class MyClass
{
public int ID { get; private set; }
public MyClass(int id)
{
ID = id;
}
}
এটি সম্পর্কে চিন্তা করুন: আপনার কাছে এই ঘরে প্রবেশ করার জন্য একটি ঘর এবং একটি দরজা রয়েছে। কে কীভাবে আপনার ঘরে আসছেন এবং কীভাবে আপনার ঘরে সুরক্ষিত তা পরীক্ষা করতে চান তবে আপনার সম্পত্তি ব্যবহার করা উচিত অন্যথায় তারা কোনও দরজা হবে না এবং প্রত্যেকে সহজেই ডাব্লু / ও যে কোনও প্রবিধানে আসবে
class Room {
public string sectionOne;
public string sectionTwo;
}
Room r = new Room();
r.sectionOne = "enter";
লোকেরা সহজেই বিভাগে inুকছে খুব সহজেই, কোনও চেক করা হয়নি
class Room
{
private string sectionOne;
private string sectionTwo;
public string SectionOne
{
get
{
return sectionOne;
}
set
{
sectionOne = Check(value);
}
}
}
Room r = new Room();
r.SectionOne = "enter";
এখন আপনি সেই ব্যক্তিকে চেক করেছেন এবং তার সাথে তার কিছু খারাপ আছে কিনা তা সম্পর্কে জানতে
ক্ষেত্রগুলি ক্লাসে পরিবর্তনশীল। ক্ষেত্রগুলি হ'ল ডেটা যা আপনি অ্যাক্সেস মডিফায়ার ব্যবহারের মাধ্যমে সজ্জিত করতে পারেন।
বৈশিষ্ট্যগুলি ক্ষেত্রগুলির সাথে সমান যা তারা রাজ্যগুলি এবং কোনও বস্তুর সাথে সম্পর্কিত ডেটা সংজ্ঞায়িত করে।
ক্ষেত্রের বিপরীতে কোনও সম্পত্তির একটি বিশেষ বাক্য গঠন থাকে যা কোনও ব্যক্তি কীভাবে ডেটা পড়েন এবং ডেটা লেখেন তা নিয়ন্ত্রণ করে, এগুলি গেট অ্যান্ড সেট অপারেটর হিসাবে পরিচিত। সেট যুক্তি প্রায়শই বৈধতা ব্যবহার করতে ব্যবহৃত হতে পারে।
বৈশিষ্ট্যগুলি বিশেষ ধরণের শ্রেণীর সদস্য, বৈশিষ্ট্যগুলিতে আমরা একটি পূর্বনির্ধারিত সেট বা গেট পদ্ধতি ব্যবহার করি y তারা এমন অ্যাকসেসর ব্যবহার করে যার মাধ্যমে আমরা ব্যক্তিগত ক্ষেত্রগুলির মান পড়তে, লিখতে বা পরিবর্তন করতে পারি।
উদাহরণস্বরূপ, আসুন আমরা Employee
নাম, বয়স এবং কর্মচারী_আইডির জন্য ব্যক্তিগত ক্ষেত্র সহ একটি ক্লাস নেওয়া যাক । আমরা শ্রেণীর বাইরে থেকে এই ক্ষেত্রগুলি অ্যাক্সেস করতে পারি না, তবে আমরা সম্পত্তিগুলির মাধ্যমে এই ব্যক্তিগত ক্ষেত্রগুলিতে অ্যাক্সেস করতে পারি।
আমরা সম্পত্তি কেন ব্যবহার করব?
শ্রেণীর ক্ষেত্রটি সর্বজনীন করা এবং এটি প্রকাশ করা ঝুঁকিপূর্ণ, কারণ কী বরাদ্দ ও ফিরে আসে তা আপনার নিয়ন্ত্রণে থাকবে না not
একটি উদাহরণ সহ এটি স্পষ্টভাবে বোঝার জন্য আইডি, পাসমার্ক, নাম রয়েছে এমন একটি শিক্ষার্থী ক্লাস নেওয়া যাক। এখন এই উদাহরণে পাবলিক ফিল্ডের সাথে কিছু সমস্যা
এই সমস্যাটি সরাতে আমরা get এবং সেট পদ্ধতিটি ব্যবহার করি।
// A simple example
public class student
{
public int ID;
public int passmark;
public string name;
}
public class Program
{
public static void Main(string[] args)
{
student s1 = new student();
s1.ID = -101; // here ID can't be -ve
s1.Name = null ; // here Name can't be null
}
}
এখন আমরা get and set পদ্ধতির উদাহরণ নিই
public class student
{
private int _ID;
private int _passmark;
private string_name ;
// for id property
public void SetID(int ID)
{
if(ID<=0)
{
throw new exception("student ID should be greater then 0");
}
this._ID = ID;
}
public int getID()
{
return_ID;
}
}
public class programme
{
public static void main()
{
student s1 = new student ();
s1.SetID(101);
}
// Like this we also can use for Name property
public void SetName(string Name)
{
if(string.IsNullOrEmpty(Name))
{
throw new exeception("name can not be null");
}
this._Name = Name;
}
public string GetName()
{
if( string.IsNullOrEmpty(This.Name))
{
return "No Name";
}
else
{
return this._name;
}
}
// Like this we also can use for Passmark property
public int Getpassmark()
{
return this._passmark;
}
}
অতিরিক্ত তথ্য: ডিফল্টরূপে, পান এবং সেট অ্যাক্সেসরগুলি সম্পত্তির মতোই অ্যাক্সেসযোগ্য। আপনি তাদের উপর আরও সীমাবদ্ধ অ্যাক্সেস মডিফায়ার প্রয়োগ করে স্বতন্ত্রভাবে (পেতে এবং সেট করার জন্য) অ্যাক্সেসরের অ্যাক্সেসযোগ্যতা নিয়ন্ত্রণ / সীমাবদ্ধ করতে পারেন।
উদাহরণ:
public string Name
{
get
{
return name;
}
protected set
{
name = value;
}
}
এখানে পেতে এখনও সর্বজনীনভাবে অ্যাক্সেস করা হয়েছে (সম্পত্তি হিসাবে জনসাধারণ হিসাবে) তবে সেটটি সুরক্ষিত রয়েছে (আরও সীমাবদ্ধ অ্যাক্সেসের নির্দিষ্টকরণকারী)।
বৈশিষ্ট্যগুলি ক্ষেত্রটি প্রকাশ করতে ব্যবহৃত হয়। তারা অ্যাক্সেসর ব্যবহার করে (সেট করুন, পাবেন) যার মাধ্যমে ব্যক্তিগত ক্ষেত্রগুলির মানগুলি পড়তে, লিখিত বা হেরফের করতে পারে।
সম্পত্তি স্টোরেজ অবস্থানগুলির নাম দেয় না। পরিবর্তে, তাদের এমন অ্যাক্সেসর রয়েছে যা তাদের মানগুলি পড়তে, লিখতে বা গণনা করতে পারে।
বৈশিষ্ট্যগুলি ব্যবহার করে আমরা কোনও ফিল্ডে সেট করা ডেটার প্রকারের উপর বৈধতা সেট করতে পারি।
উদাহরণস্বরূপ, আমাদের ব্যক্তিগত পূর্ণসংখ্যার ক্ষেত্রের বয়স রয়েছে যাতে আমাদের ইতিবাচক মানগুলি দেওয়া উচিত কারণ বয়স নেতিবাচক হতে পারে না।
আমরা এটি দুটি উপায়ে গেটর এবং সেটটার এবং সম্পত্তি ব্যবহার করে করতে পারি can
Using Getter and Setter
// field
private int _age;
// setter
public void set(int age){
if (age <=0)
throw new Exception();
this._age = age;
}
// getter
public int get (){
return this._age;
}
Now using property we can do the same thing. In the value is a key word
private int _age;
public int Age{
get{
return this._age;
}
set{
if (value <= 0)
throw new Exception()
}
}
অটো বাস্তবায়িত সম্পত্তি যদি আমরা অ্যাক্সেসরগুলি পেতে এবং সেট করতে লজিক না করি তবে আমরা স্বয়ংক্রিয়ভাবে প্রয়োগ করা সম্পত্তি ব্যবহার করতে পারি।
আপনি যখন স্বয়ংক্রিয়ভাবে প্রয়োগকৃত সম্পত্তি সংকলনগুলি একটি ব্যক্তিগত, বেনামি ক্ষেত্র তৈরি করেন যা কেবল প্রাপ্ত এবং সেট অ্যাক্সেসরগুলির মাধ্যমে অ্যাক্সেস করা যায়।
public int Age{get;set;}
বিমূর্ত বৈশিষ্ট্য একটি বিমূর্ত শ্রেণীর একটি বিমূর্ত সম্পত্তি থাকতে পারে, যা উত্পন্ন শ্রেণিতে প্রয়োগ করা উচিত
public abstract class Person
{
public abstract string Name
{
get;
set;
}
public abstract int Age
{
get;
set;
}
}
// overriden something like this
// Declare a Name property of type string:
public override string Name
{
get
{
return name;
}
set
{
name = value;
}
}
আমরা ব্যক্তিগতভাবে একটি সম্পত্তি সেট করতে পারি এতে আমরা ব্যক্তিগতভাবে অটো সম্পত্তি সেট করতে পারি (শ্রেণিতে সেট করা)
public int MyProperty
{
get; private set;
}
আপনি এই কোড দিয়ে একই অর্জন করতে পারেন। এই বৈশিষ্ট্যে সেট বৈশিষ্ট্যটি উপলভ্য নয় কারণ আমাদের সরাসরি ক্ষেত্রের জন্য মান সেট করতে হবে।
private int myProperty;
public int MyProperty
{
get { return myProperty; }
}
বেশিরভাগ ক্ষেত্রে এটি এমন একটি সম্পত্তির নাম হতে চলেছে যা আপনি ভেরিয়েবল নাম ( ক্ষেত্র ) এর বিপরীতে অ্যাক্সেস করেন তার কারণ হ'ল নেট এবং অনুশীলন বিশেষত সি # তে একটি শ্রেণীর মধ্যে প্রতিটি টুকরো তথ্য রক্ষা করার জন্য এটি ভাল অভ্যাস হিসাবে বিবেচিত হয় , এটি কোনও উদাহরণের পরিবর্তনশীল বা স্ট্যাটিক ভেরিয়েবল (শ্রেণি ভেরিয়েবল) কারণ এটি কোনও শ্রেণীর সাথে সম্পর্কিত।
সেই সমস্ত ভেরিয়েবলকে প্রাসঙ্গিক বৈশিষ্ট্য সহ সুরক্ষিত করুন যা আপনাকে ডেটাগুলির এই টুকরোগুলি পরিচালনা করে যখন আপনাকে সংজ্ঞায়িত করতে, সেট করতে এবং অ্যাক্সেসরগুলি পেতে এবং বৈধতার মতো কাজ করার অনুমতি দেয় ।
তবে ম্যাথ ক্লাস (সিস্টেম নেমস্পেস) এর মতো অন্যান্য ক্ষেত্রে , বেশ কয়েকটি স্থির বৈশিষ্ট্য রয়েছে যা শ্রেণিতে অন্তর্নির্মিত। যার মধ্যে একটি হল গণিতের ধ্রুবক পিআই I
যেমন। Math.PI
এবং যেহেতু পিআই হ'ল ডেটা টুকরো যা ভালভাবে সংজ্ঞায়িত হয়েছে, আমাদের পিআইয়ের একাধিক অনুলিপি থাকার দরকার নেই, এটি সর্বদা একই মান হতে চলেছে। সুতরাং স্ট্যাটিক ভেরিয়েবলগুলি কখনও কখনও কোনও শ্রেণীর অবজেক্টের মধ্যে ডেটা ভাগ করতে ব্যবহার করা হয় তবে ধ্রুবক তথ্যের জন্য সাধারণত সাধারণত ব্যবহৃত হয় যেখানে আপনার কেবলমাত্র এক টুকরো ডেটার একটি অনুলিপি প্রয়োজন।