c# - একটি ক্ষেত্র এবং একটি সম্পত্তি মধ্যে পার্থক্য কি?




সি শার্প বাংলা বই pdf (20)

বিভাজন - USES (কখন এবং কেন)

একটি ক্ষেত্র একটি পরিবর্তনশীল যা সরাসরি একটি বর্গ বা struct মধ্যে ঘোষণা করা হয়। একটি ক্লাস বা struct উদাহরণ ক্ষেত্র বা স্ট্যাটিক ক্ষেত্র বা উভয় হতে পারে। সাধারণত, আপনি শুধুমাত্র ব্যক্তিগত বা সুরক্ষিত অ্যাক্সেসিবিলিটি রয়েছে এমন ভেরিয়েবলগুলির জন্য ক্ষেত্রগুলি ব্যবহার করতে হবে। আপনার ক্লাস ক্লায়েন্ট কোড প্রকাশ করে এমন ডেটা পদ্ধতি, বৈশিষ্ট্য এবং সূচকের মাধ্যমে সরবরাহ করা উচিত । অভ্যন্তরীণ ক্ষেত্রগুলিতে পরোক্ষ অ্যাক্সেসের জন্য এই গঠনগুলি ব্যবহার করে, আপনি অবৈধ ইনপুট মানগুলির বিরুদ্ধে সুরক্ষা করতে পারেন।

একটি সম্পত্তি একটি সদস্য যা একটি ব্যক্তিগত ক্ষেত্রের মান পড়া, লেখার বা গণনা করার জন্য একটি নমনীয় প্রক্রিয়া সরবরাহ করে। প্রোপার্টি ব্যবহার করা যেতে পারে যেমন তারা জনসাধারণের ডেটা সদস্য, কিন্তু আসলে এটি অ্যাক্সেসার নামে বিশেষ পদ্ধতি। এটি ডেটা সহজে অ্যাক্সেস করতে সক্ষম করে এবং এখনও সুরক্ষাগুলির সুরক্ষা এবং নমনীয়তা প্রচার করতে সহায়তা করে । বৈশিষ্ট্যগুলি কার্যকরকরণ বা যাচাইকরণ কোড গোপন করার সময় মানগুলি পাওয়ার এবং সেট করার জনসাধারণের উপায় প্রকাশ করার জন্য একটি শ্রেণিকে সক্ষম করে। একটি সম্পত্তি অ্যাক্সেসার সম্পত্তি মূল্য ফেরত ব্যবহৃত হয়, এবং একটি সেট অ্যাক্সেসার একটি নতুন মান বরাদ্দ ব্যবহৃত হয়।

C # তে কোন সম্পত্তি কোনও সম্পত্তি থেকে আলাদা আলাদা করে তোলে এবং সম্পত্তিটির পরিবর্তে কখন ক্ষেত্রটি ব্যবহার করা উচিত?


(এটি অবশ্যই একটি মন্তব্য হওয়া উচিত, তবে আমি একটি মন্তব্য পোস্ট করতে পারছি না, তাই এটি পোস্ট হিসাবে উপযুক্ত না হলে অনুগ্রহ করে অনুগ্রহ করে)।

আমি একবার এমন জায়গায় কাজ করতাম যেখানে সুপারিশকৃত অনুশীলনটি সম্পত্তিগুলির পরিবর্তে জনসাধারণের ক্ষেত্রগুলি ব্যবহার করতে হয়েছিল যখন সমতুল্য সম্পত্তি ডিফেক্ট কেবলমাত্র একটি ক্ষেত্র অ্যাক্সেস করতে পারে, যেমন:

get { return _afield; }
set { _afield = value; }

তাদের যুক্তি ছিল যে প্রয়োজন হলে জনসাধারণের ক্ষেত্রটি পরবর্তীতে ভবিষ্যতে একটি সম্পত্তি রূপান্তর করা যেতে পারে। এটা সময় আমার একটু অদ্ভুত লাগছিল। এই পোস্ট দ্বারা বিচার, এখানে অনেক একমত হবে না দেখে মনে হচ্ছে। আপনি কি কিছু পরিবর্তন করার চেষ্টা করতে পারেন?

সম্পাদন: আমি এই জায়গায় সমস্ত কোড বেস একই সময়ে সংকলিত করা উচিত যে যোগ করা উচিত, তাই তারা ভেবেছিল যে ক্লাসের পাবলিক ইন্টারফেস পরিবর্তন (একটি সম্পত্তি একটি পাবলিক ক্ষেত্র পরিবর্তন করে) একটি সমস্যা ছিল না।


অবজেক্ট ভিত্তিক প্রোগ্রামিং নীতিগুলি বলে যে, একটি শ্রেণির অভ্যন্তরীণ কাজ বাইরের বিশ্বের থেকে লুকানো উচিত। আপনি যদি ক্ষেত্রটি প্রকাশ করেন তবে আপনি অবশ্যই শ্রেণির অভ্যন্তরীণ বাস্তবায়নকে উদ্ভাসিত করছেন। সুতরাং আমরা আমাদের উপর নির্ভর করে কোড ভাঙা ছাড়াই বাস্তবায়ন পরিবর্তন করার ক্ষমতা দেওয়ার জন্য প্রোপার্টি (অথবা জাভা ক্ষেত্রে ক্ষেত্রে পদ্ধতি) দিয়ে ক্ষেত্রগুলি মোড়ানো করি। আমরা যদি সম্পত্তিটিতে যুক্তি যুক্ত করতে পারি তবে আমরা আমাদের এটির প্রয়োজন হলে বৈধতা লজিক ইত্যাদি সম্পাদন করতে সক্ষম হব। সি # 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
}

আইএমও, প্রোপার্টিগুলি "SetXXX ()" "GetXXX ()" ফাংশন / পদ্ধতি / ইন্টারফেস জোড়া যা আমরা পূর্বে ব্যবহার করেছি, কিন্তু তারা আরো সংক্ষিপ্ত এবং মার্জিত।


আমি আপনাকে গিয়ার্স বাঁক পেতে পারে যে বৈশিষ্ট্য ব্যবহার করার একটি দম্পতি উদাহরণ দিতে হবে:

  • অলস সূচনা : যদি আপনার কাছে এমন কোনও বস্তুর সম্পত্তি থাকে যা লোড করার জন্য ব্যয়বহুল, তবে কোডের স্বাভাবিক রানগুলিতে এটিকে সমস্ত অ্যাক্সেস করা হয় না, তবে আপনি সম্পত্তিটির মাধ্যমে লোডিং বিলম্বিত করতে পারেন। এই ভাবে, এটি কেবল সেখানে বসে আছে, কিন্তু প্রথমবারের মতো অন্য কোনও মডিউল সেই সম্পত্তিটি কল করার চেষ্টা করে, এটি অন্তর্নিহিত ক্ষেত্র নিল কিনা তা পরীক্ষা করে - যদি এটি হয় তবে এটি এগিয়ে যায় এবং এটি লোড করে, এটি কলিং মডিউলে অজানা। এই ব্যাপকভাবে বস্তুর আরম্ভ গতি আপ করতে পারেন।
  • Dirty Tracking: আমি স্ট্যাকঅভারফ্লোতে আমার নিজের প্রশ্ন থেকে আসলে যা শিখেছি। যখন আমার অনেকগুলি অবজেক্ট থাকে যা কোনও রান চলাকালে পরিবর্তিত হতে পারে তবে আমি সম্পত্তিটি ট্র্যাক করতে ব্যবহার করতে পারি যদি সেগুলি ডাটাবেসের কাছে সংরক্ষণ করতে হয় বা না। যদি কোনও বস্তুর একক সম্পত্তি পরিবর্তিত না হয় তবে, ISDirty পতাকাটি ট্রিপড হবে না এবং অতএব ডেটাবেসে ফিরে যাওয়ার জন্য কী প্রয়োজন তা নির্ধারণ করার সময় সঞ্চয় কার্যকারিতা এটি এড়িয়ে যাবে।

উইকিপিডিয়া থেকে - অবজেক্ট ভিত্তিক প্রোগ্রামিং :

অবজেক্ট-ভিত্তিক প্রোগ্রামিং (ওओপি) "বস্তু" ধারণার উপর ভিত্তি করে একটি প্রোগ্রামিং প্যাডডিজম, যা ডেটা স্ট্রাকচারগুলি থাকে যা ক্ষেত্র ধারণ করে, যা প্রায়ই বৈশিষ্ট্যাবলী হিসাবে পরিচিত হয়; এবং কোড, পদ্ধতির ফর্ম, প্রায়ই পদ্ধতি হিসাবে পরিচিত(সামনে জোর দাও)

বৈশিষ্ট্য আসলে একটি বস্তুর আচরণের অংশ, তবে বস্তুর ভোক্তাদের বস্তুর তথ্য দিয়ে কাজ করার বিভ্রম / বিমূর্ততা দেওয়ার জন্য ডিজাইন করা হয়েছে।


এখানে দ্বিতীয় প্রশ্ন, "কোন সম্পত্তির বদলে কোন ক্ষেত্রটি ব্যবহার করা উচিত?", এই সংক্ষিপ্ত উত্তরটি কেবল এই অন্য উত্তরে স্পর্শ করা হয়েছে এবং এটিও এক , কিন্তু প্রকৃতপক্ষে অনেক বিস্তারিত নয়।

সাধারণভাবে, অন্যান্য সমস্ত উত্তর ভাল ডিজাইন সম্পর্কে স্পট-অন: ক্ষেত্রগুলি প্রকাশের উপর বৈশিষ্ট্যগুলি প্রকাশ করা পছন্দ করে। যদিও আপনি সম্ভবত নিজেকে বলবেন না "বাহ, কল্পনা করুন যে আমি যদি সম্পত্তিটির পরিবর্তে এটি একটি ক্ষেত্র তৈরি করে থাকি তবে কতটা খারাপ জিনিস হবে", এমন পরিস্থিতি সম্পর্কে চিন্তা করা অনেক বেশি বিরল ঘটনা যেখানে আপনি বলবেন "বাহ, ঈশ্বরের ধন্যবাদ, আমি এখানে সম্পত্তি ব্যবহার করার পরিবর্তে একটি ক্ষেত্র ব্যবহার করেছি। "

তবে ক্ষেত্রগুলির বৈশিষ্ট্যগুলির উপর একটি সুবিধা রয়েছে এবং এটি তাদের "ref" / "out" পরামিতি হিসাবে ব্যবহার করার ক্ষমতা। ধরুন আপনার নিম্নলিখিত স্বাক্ষরগুলির সাথে একটি পদ্ধতি আছে:

public void TransformPoint(ref double x, ref double y);

এবং অনুমান করুন যে আপনি এই পদ্ধতিটি ব্যবহার করে এমন একটি অ্যারে রূপান্তরিত করতে ব্যবহার করতে চান:

System.Windows.Point[] points = new Point[1000000];
Initialize(points);

এখানে আমি এটি করার দ্রুততম উপায় মনে করি, কারণ X এবং Y হল বৈশিষ্ট্য:

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;
}

এবং যে বেশ ভাল হতে যাচ্ছে! অন্যথায় প্রমাণ না করা পর্যন্ত আপনি পরিমাপ আছে, একটি stink নিক্ষেপ করার কোন কারণ নেই। কিন্তু আমি বিশ্বাস করি এটি টেকনিক্যালি হিসাবে দ্রুত হিসাবে নিশ্চিত করা হয় না:

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);
}

নিজেকে কিছু measurements , ক্ষেত্রের সংস্করণটি প্রায় 61% বৈশিষ্ট্যগুলির সাথে সংস্করণ (.NET 4.6, উইন্ডোজ 7, ​​x64, রিলিজ মোড, কোন ডিবাগার সংযুক্ত নেই) হিসাবে নেয়। TransformPoint পদ্ধতিটি যত বেশি ব্যয়বহুল, TransformPoint পার্থক্যটি কম বলে ঘোষণা করা হয়। এইটিকে পুনরাবৃত্তি করতে, প্রথম লাইনের সাথে মন্তব্য করুন এবং এটির সাথে মন্তব্য করা হবে না।

উপরের দিকে কোন পারফরম্যান্স সুবিধা থাকলেও, এমন কিছু জায়গা রয়েছে যেখানে রিফ এবং আউট প্যারামিটারগুলি ব্যবহার করা যায় উপকারী, যেমন পদ্ধতিগুলির Interlocked বা Volatile পরিবারকে কল করার সময়। দ্রষ্টব্য: যদি এটি আপনার কাছে নতুন হয় তবে ভলটাইল মূলত volatile শব্দ দ্বারা সরবরাহিত একই আচরণে পৌঁছানোর একটি উপায়। যেমন, volatile মতো, এটি জাদুকরীভাবে সমস্ত থ্রেড-নিরাপত্তা সমস্যাগুলির সমাধান করে না, যেমন এটির নাম প্রস্তাব করে।

আমি স্পষ্টভাবে মনে করতে চাই না যে আমি আপনাকে বলছি "ওহ, আমি সম্পত্তিগুলির পরিবর্তে ক্ষেত্রগুলি প্রকাশ করা শুরু করব।" বিন্দুটি হল যে যদি আপনি নিয়মিত "রেফ" বা "আউট" প্যারামিটারগুলি গ্রহণ করে এমন কলগুলিতে এই সদস্যদের ব্যবহার করতে চান তবে বিশেষ করে এমন কিছু যা একটি সাধারণ মান টাইপ যা কখনও বৈশিষ্ট্যের মান-যোগ করা উপাদানের প্রয়োজন হয় না। একটি যুক্তি তৈরি করা যেতে পারে।


এছাড়াও, বৈশিষ্ট্য মান নির্ধারণ করার সময় আপনি যুক্তি ব্যবহার করার অনুমতি দেয়।

সুতরাং আপনি বলতে পারেন যে আপনি কেবল একটি পূর্ণসংখ্যা ক্ষেত্রে একটি মান সেট করতে চান, যদি মান x এর থেকে বড় হয় তবে অন্যথায় ব্যতিক্রমটি নিক্ষেপ করুন।

সত্যিই দরকারী বৈশিষ্ট্য।


কোনও বস্তুর তথ্যটি জনসাধারণের ইন্টারফেসটি ভাঙ্গাই ছাড়াই অ্যাক্সেস করা যায় তা পরিবর্তন করার অনুমতিগুলির বৈশিষ্ট্যগুলিতে প্রাথমিক সুবিধা রয়েছে। উদাহরণস্বরূপ, যদি আপনি অতিরিক্ত বৈধতা যুক্ত করতে চান, বা একটি গণনাকৃত ক্ষেত্রটি গণনা করতে চান তবে আপনি প্রাথমিকভাবে ক্ষেত্র হিসাবে একটি সম্পত্তি হিসাবে প্রকাশ করলে তা সহজেই করতে পারেন। যদি আপনি সরাসরি একটি ক্ষেত্র খোলেন তবে নতুন কার্যকারিতা যোগ করার জন্য আপনাকে আপনার ক্লাসের সর্বজনীন ইন্টারফেস পরিবর্তন করতে হবে। সেই পরিবর্তনটি বিদ্যমান ক্লায়েন্টদের বিরতি দেবে, আপনার কোডের নতুন সংস্করণটি ব্যবহার করার আগে তাদের পুনর্নির্মাণের প্রয়োজন হবে।

আপনি যদি ব্যাপক ব্যবহারের জন্য ডিজাইনকৃত একটি ক্লাস লাইব্রেরি লিখেন (যেমন। নেট ফ্রেমওয়ার্ক, যা লক্ষ লক্ষ মানুষের দ্বারা ব্যবহৃত হয়), এটি একটি সমস্যা হতে পারে। যাইহোক, যদি আপনি একটি ছোট কোড বেসের অভ্যন্তরে অভ্যন্তরীণভাবে ব্যবহৃত একটি শ্রেণি লিখছেন (বলে <= 50 কে লাইনগুলি বলুন), এটি সত্যিই একটি বড় চুক্তি নয়, কারন আপনার কোনও পরিবর্তনগুলি বিপদজনকভাবে প্রভাবিত হবে না। যে ক্ষেত্রে এটি সত্যিই ব্যক্তিগত পছন্দ নিচে আসে।


ক্ষেত্র সাধারণ সদস্য ভেরিয়েবল বা একটি বর্গ সদস্য সদস্য। বৈশিষ্ট্য পেতে এবং তাদের মান সেট একটি বিমূর্ততা হয় । প্রোপার্টিগুলিকে অ্যাক্সেসারসও বলা হয় কারণ তারা ব্যক্তিগত হিসাবে শ্রেণিতে একটি ক্ষেত্র প্রকাশ করলে যদি তারা একটি ক্ষেত্র পরিবর্তন এবং পুনরুদ্ধারের একটি উপায় সরবরাহ করে। সাধারণত, আপনি আপনার সদস্য ভেরিয়েবল ব্যক্তিগত ঘোষণা করুন, তারপরে তাদের জন্য সম্পত্তি ঘোষণা করুন বা সংজ্ঞায়িত করুন।

  class SomeClass
  {
     int numbera; //Field

     //Property 
    public static int numbera { get; set;}

  }

পটভূমি একটি সম্পত্তি পদ্ধতিতে কম্পাইল করা হয়। সুতরাং একটি Name সম্পত্তি get_Name() এবং set_Name(string value) সংকলিত হয়। আপনি কম্পাইল কোড পড়া যদি আপনি এটি দেখতে পারেন। সুতরাং তাদের ব্যবহার করার সময় একটি (খুব) ছোট কর্মক্ষমতা ওভারহেড আছে। সাধারনত আপনি যদি ক্ষেত্রের বাইরের ক্ষেত্রটি প্রকাশ করেন তবে আপনি সর্বদা একটি সম্পত্তি ব্যবহার করবেন এবং আপনি যদি মানটির বৈধতা করতে চান তবে আপনি এটি অভ্যন্তরীণভাবে ব্যবহার করবেন।


প্রোপার্টি ব্যবহার করে, আপনি কোনও ইভেন্ট নিক্ষেপ করতে পারেন যখন সম্পত্তির মান পরিবর্তিত হয় (আ। সম্পত্তি। ChangedEvent) অথবা মূল্যটি বাতিল করার সমর্থনে মান পরিবর্তনের আগে।

এই ক্ষেত্র (সরাসরি এক্সেস) সঙ্গে সম্ভব নয়।

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(){
   EventHandler localEvent = NameChanging;
   if (localEvent != null) {
     localEvent(this,EventArgs.Empty);
   }
 }

 private void OnNameChanged(){
   EventHandler localEvent = NameChanged;
   if (localEvent != null) {
     localEvent(this,EventArgs.Empty);
   }
 }
}

বৈশিষ্ট্যাবলী অ্যাসিমমেট্রিক অ্যাক্সেস সমর্থন করে, অর্থাত আপনি একটি পেতে পারেন এবং একটি setter বা দুটি মাত্র এক। একইভাবে বৈশিষ্ট্য Gator / setter জন্য পৃথক অ্যাক্সেসযোগ্যতা সমর্থন। ক্ষেত্রগুলি সর্বদা সমৃদ্ধ, অর্থাত আপনি সবসময় উভয় পেতে এবং মান সেট করতে পারেন। এই ব্যতিক্রম ব্যতিক্রমই ক্ষেত্র যা স্পষ্টভাবে শুরু করার পরে সেট করা যাবে না।

বৈশিষ্ট্যগুলি খুব দীর্ঘ সময়ের জন্য চলতে পারে, পার্শ্বপ্রতিক্রিয়া থাকতে পারে এবং এমনকি ব্যতিক্রমগুলিও নিক্ষেপ করতে পারে। ক্ষেত্র কোন পার্শ্ব প্রতিক্রিয়া সঙ্গে দ্রুত, এবং ব্যতিক্রম নিক্ষেপ করা হবে না। পার্শ্ব প্রতিক্রিয়াগুলির কারণে একটি সম্পত্তি প্রতিটি কলটির জন্য একটি ভিন্ন মান ফেরত দিতে পারে (যেমন তারিখের তারিখের জন্য মামলা হতে পারে, অর্থাত তারিখের সময়। এখন সর্বদা তারিখের সময় সমান নয়)। ক্ষেত্র সবসময় একই মান ফিরে।

ক্ষেত্রগুলি আউট / রেফার প্যারামিটারের জন্য ব্যবহার করা যেতে পারে, বৈশিষ্ট্যগুলি হতে পারে না। বৈশিষ্ট্যাবলী অতিরিক্ত যুক্তি সমর্থন করে - এটি অন্যান্য জিনিসের মধ্যে অলস লোডিং বাস্তবায়নের জন্য ব্যবহার করা যেতে পারে।

মানগুলি মান পেতে / সেট করতে যে কোনও মানে এনক্যাপুলেট করে বিমূর্তকরণের একটি স্তরের সমর্থন করে।

সর্বাধিক / সব ক্ষেত্রে বৈশিষ্ট্য ব্যবহার করুন, কিন্তু পার্শ্ব প্রতিক্রিয়া এড়ানোর চেষ্টা করুন।


বৈশিষ্ট্যাবলী ক্লাসের সদস্যের বিশেষ ধরনের, বৈশিষ্ট্যগুলিতে আমরা একটি পূর্বনির্ধারিত সেট বা পদ্ধতি ব্যবহার করি। তারা অ্যাক্সেসার ব্যবহার করে যার মাধ্যমে আমরা ব্যক্তিগত ক্ষেত্রগুলির মানগুলি পড়তে, লিখিত বা পরিবর্তন করতে পারি।

উদাহরণস্বরূপ, নাম, বয়স এবং Employee_Id এর জন্য ব্যক্তিগত ক্ষেত্রগুলির সাথে Employee নামক একটি শ্রেণি গ্রহণ করুন। আমরা ক্লাসের বাইরে থেকে এই ক্ষেত্রগুলি অ্যাক্সেস করতে পারছি না, তবে আমরা বৈশিষ্ট্যগুলির মাধ্যমে এই ব্যক্তিগত ক্ষেত্রগুলি অ্যাক্সেস করতে পারি।

কেন আমরা সম্পত্তি ব্যবহার করবেন?

শ্রেণির ক্ষেত্রটিকে জনসাধারণের তৈরি করা এবং এটি প্রকাশ করা ঝুঁকিপূর্ণ, কারণ আপনার কাছে কোনও নিয়ন্ত্রন নেই এবং এটি ফেরত দেওয়া হয় না।

একটি উদাহরণ দিয়ে স্পষ্টভাবে বুঝতে এটি একটি ছাত্র শ্রেণীর যারা আইডি, পাসमार्क, নাম আছে। এখন এই ক্ষেত্রে পাবলিক ক্ষেত্রের সাথে কিছু সমস্যা

  • আইডি হতে হবে না।
  • নাম নাল সেট করা যাবে না
  • পাস চিহ্ন শুধুমাত্র পড়া উচিত।
  • যদি ছাত্রের নাম অনুপস্থিত থাকে তবে কোন নাম প্রত্যাবর্তন করা উচিত নয়।

এই সমস্যাটি সরাতে আমরা পদ্ধতি এবং পদ্ধতি ব্যবহার করি।

// 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
    }
}

এখন আমরা পেতে এবং সেট পদ্ধতির একটি উদাহরণ নিতে

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;
    }
}

যখন আপনি আপনার প্রাইভেট ভেরিয়েবল (ক্ষেত্র) অন্যান্য শ্রেণীর থেকে আপনার ক্লাসের অবজেক্টের অ্যাক্সেসযোগ্য অ্যাক্সেস করতে চান তখন আপনাকে ঐ ভেরিয়েবলগুলির জন্য বৈশিষ্ট্যগুলি তৈরি করতে হবে।

উদাহরণস্বরূপ, যদি আমার "আইডি" এবং "নাম" হিসাবে নামকরণ করা ভেরিয়েবল থাকে তবে এটি ব্যক্তিগত তবে সেখানে এমন পরিস্থিতি থাকতে পারে যেখানে ক্লাসের বাইরে পাঠ / লেখার ক্রিয়াকলাপের জন্য এই পরিবর্তনশীলটির প্রয়োজন হয়। সেই অবস্থায়, সম্পত্তির জন্য সংজ্ঞায়িত পেতে / সেটের উপর নির্ভর করে সম্পত্তিটি আমাকে যাচাই করতে / লিখতে সাহায্য করতে পারে। একটি সম্পত্তি উভয় একটি readonly / writeonly / উভয় readwrite হতে পারে।

এখানে ডেমো

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";
    }
}

যখন আপনি একটি ক্লাস আছে যা "কার"। বৈশিষ্ট্য রং, আকৃতি হয় ..

যেখানে ক্ষেত্রগুলি একটি শ্রেণির সুযোগের মধ্যে ভেরিয়েবলগুলিকে সংজ্ঞায়িত করে।


অতিরিক্ত তথ্য: ডিফল্টরূপে, পেতে এবং অ্যাক্সেসারগুলি নিজেই সম্পত্তি হিসাবে অ্যাক্সেসযোগ্য হিসাবে সেট। আপনি তাদের উপর আরও বিধিনিষেধযুক্ত অ্যাক্সেস সংশোধনকারী প্রয়োগ করে পৃথকভাবে অ্যাক্সেসর অ্যাক্সেসিবিলিটি (পেতে এবং সেট করার জন্য) নিয়ন্ত্রণ / নিয়ন্ত্রণ করতে পারেন।

উদাহরণ:

public string Name
{
    get
    {
        return name;
    }
    protected set
    {
        name = value;
    }
}

এখানে পেতে এখনও জনসাধারণের অ্যাক্সেস করা হয় (সম্পত্তিটি সর্বজনীন হিসাবে), কিন্তু সেট সুরক্ষিত (আরো সীমিত অ্যাক্সেস স্পেসিফিকেশন)।


একটি ক্ষেত্রের আমার নকশা একটি ক্ষেত্র শুধুমাত্র তার অভিভাবক দ্বারা পরিবর্তিত করা প্রয়োজন, তাই ক্লাস। ভেরিয়েবলের ফলাফলটি ব্যক্তিগত হয়ে ওঠে, তখন আমি কেবল সিস্টেমের মাধ্যমে সিস্টেমের সিস্টেমের বাইরে যেতে ক্লাস / পদ্ধতিগুলি পড়ার অধিকার দিতে সক্ষম হব। ক্ষেত্র তারপর সম্পত্তি দ্বারা পুনরুদ্ধার করা হয় এবং শুধুমাত্র পঠনযোগ্য! আপনি যদি এটি সংশোধন করতে চান তবে আপনাকে অবশ্যই পদ্ধতিগুলি (উদাহরণস্বরূপ কনস্ট্রাক্টর) যেতে হবে এবং আমি আপনাকে সুরক্ষিত করার এই উপায়ে ধন্যবাদ জানাই, আমাদের কোডটিতে আমাদের আরও ভাল নিয়ন্ত্রণ রয়েছে কারণ আমরা "প্রান্তিক"। একজন সর্বদা সর্বদা সবকিছুকে যথাযথভাবে রাখতে পারে যাতে প্রতিটি সম্ভাব্য ক্ষেত্রে, ভেরিয়েবল / পদ্ধতি / শ্রেণী ইত্যাদি ধারণার ধারণা ... আমার মতামতটি কেবলমাত্র উন্নয়ন, কোড রক্ষণাবেক্ষণের জন্য একটি সহায়ক। উদাহরণস্বরূপ, যদি একজন ব্যক্তি পাবলিক ক্ষেত্রের সাথে একটি কোড পুনরায় শুরু করেন, তবে সে কিছু করতে পারে এবং তাই জিনিসগুলি "অযৌক্তিক"উদ্দেশ্য সম্পর্কিত, কোড কেন লিখিত ছিল যুক্তি। এটা আমার দৃষ্টিকোণ।

যখন আমি একটি ক্লাসিক মডেল ব্যক্তিগত ক্ষেত্র / পাবলিক পাঠযোগ্য বৈশিষ্ট্যগুলি ব্যবহার করি, 10 টি ব্যক্তিগত ক্ষেত্রের জন্য আমাকে 10 টি প্রকাশনা বৈশিষ্ট্য লিখতে হবে! কোড সত্যিই বড় হতে পারে। আমি প্রাইভেট সেটার আবিষ্কার করি এবং এখন আমি শুধুমাত্র ব্যক্তিগত বৈশিষ্ট্য ব্যবহার করে পাবলিক বৈশিষ্ট্য ব্যবহার করি। Setter ব্যাকগ্রাউন্ড একটি ব্যক্তিগত ক্ষেত্র তৈরি করুন।

যে কেন আমার পুরানো ক্লাসিক প্রোগ্রামিং শৈলী ছিল:

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;
 }
}

ক্ষেত্র ক্লাসে ভেরিয়েবল হয়। ক্ষেত্রগুলি সেই ডেটা যা আপনি অ্যাক্সেস মোডিফায়ারগুলি ব্যবহার করে সংযোজন করতে পারেন।

বৈশিষ্ট্যাবলী ক্ষেত্রের অনুরূপ যা তারা রাজ্যের এবং একটি বস্তুর সাথে সম্পর্কিত তথ্য সংজ্ঞায়িত করে।

একটি ক্ষেত্রের বিপরীতে একটি সম্পত্তি একটি বিশেষ সিনট্যাক্স থাকে যা কোনও ব্যক্তি কীভাবে তথ্যটি পড়তে এবং ডেটা লিখতে পারে তা নিয়ন্ত্রণ করে, এইগুলি পেতে এবং সেট অপারেটর হিসাবে পরিচিত। সেট যুক্তি প্রায়ই যাচাইকরণ করতে ব্যবহার করা যেতে পারে।


বেশিরভাগ ক্ষেত্রেই এটি এমন একটি সম্পত্তি নাম হতে যাচ্ছে যা আপনি একটি পরিবর্তনশীল নাম ( ক্ষেত্র ) এর বিরোধিতা হিসাবে অ্যাক্সেস করেন। এটির কারণ এটি একটি শ্রেণির অভ্যন্তরে ডাটা প্রতিটি টুকরা সুরক্ষিত করতে .NET এবং C # তে ভাল অনুশীলন বলে মনে করা হয়। , এটি একটি ইনস্ট্যান্স পরিবর্তনশীল বা স্ট্যাটিক পরিবর্তনশীল (ক্লাস পরিবর্তনশীল) কিনা এটি একটি বর্গের সাথে যুক্ত।

সংশ্লিষ্ট বৈশিষ্ট্যগুলির সাথে ঐ সমস্ত ভেরিয়েবলগুলি সুরক্ষিত করুন যা আপনাকে সংজ্ঞায়িত, সেট এবং accessorsপেতে দেয় এবং যখন আপনি তথ্যগুলির টুকরাগুলি ম্যানিপুলিউটিং করেন তখন যাচাইকরণের মতো জিনিসগুলি করুন।

কিন্তু অন্যান্য ক্ষেত্রে যেমন ম্যাথ ক্লাস (সিস্টেম নেমস্পেস), শ্রেণিতে নির্মিত কয়েক স্ট্যাটিক বৈশিষ্ট্য রয়েছে। যা এক গণিত ধ্রুবক PI

যেমন। Math.PI

এবং পিআই ডেটা একটি টুকরা যা ভালভাবে সংজ্ঞায়িত করা হয়েছে, আমাদের PI এর একাধিক কপি করার প্রয়োজন নেই, এটি সর্বদা একই মান হতে যাচ্ছে। সুতরাং স্ট্যাটিক ভেরিয়েবল কখনও কখনও একটি বর্গের বস্তুর মধ্যে তথ্য ভাগ করার জন্য ব্যবহার করা হয়, তবে সাধারণভাবে ধ্রুব তথ্যের জন্য এটি ব্যবহার করা হয় যেখানে আপনি শুধুমাত্র একটি টুকরাটির একটি কপি প্রয়োজন।





field