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


1129

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


32
মাইক্রোসফ্ট তার সদস্য নকশা গাইডলাইনসের অংশ হিসাবে সরাসরি এই প্রশ্নের উত্তর দেয় (সকল। নেট ভাষার জন্য) । নির্দিষ্টকরণের জন্য নিবন্ধগুলি সম্পত্তি নকশা এবং ফিল্ড ডিজাইন দেখুন । নোট করুন উদাহরণস্বরূপ সদস্য এবং স্থির সদস্যদের মধ্যে পার্থক্য রয়েছে ।
ডেভিডআরআর 2'14

উত্তর:


979

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

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

@ কেন্ট উল্লেখ করেছে যে সম্পত্তিগুলি ক্ষেত্রগুলি আবশ্যক করার প্রয়োজন হয় না, তারা অন্যান্য ক্ষেত্রগুলিতে একটি গণনা করতে পারে বা অন্য উদ্দেশ্যে পরিবেশন করতে পারে।

@ জিএসএস উল্লেখ করেছে যে আপনি অন্য যুক্তি যেমন বৈধকরণও করতে পারেন, যখন কোনও সম্পত্তি অ্যাক্সেস করা হয়, অন্য একটি দরকারী বৈশিষ্ট্য।


185
এটি লক্ষণীয় যে বৈশিষ্ট্যগুলি ক্ষেত্রগুলি encapsulate করার জন্য প্রয়োজন হয় না। সম্পত্তির পিছনে কোনও ক্ষেত্র থাকতে পারে না। এটি একটি গণনা হতে পারে বা একটি ধ্রুবক বা যা কিছু ফিরিয়ে দেয়।
কেন্ট বুগার্ট

9
"আপনার ক্লাসটি ব্যবহার করে এমন জিনিসগুলির দ্বারা তারা অ্যাক্সেস করে থাকে এমন বাহ্যিক উপায়ে প্রভাবিত না করে।" যদি আমি ভুলভাবে বুঝতে পারি তবে আমাকে ক্ষমা করুন, তবে কেন সম্পত্তিটির সামনে কেন অ্যাক্সেস মডিফায়ারের প্রয়োজন হবে, যদি এর পিছনের ক্ষেত্রটি হ্যান্ডেল করে বলে মনে হয়? অর্থাত্ কেন জনসাধারণ ব্যতীত অন্য কোনও সম্পত্তি বানান?
চকি

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

6
@ জেপফ আমি যদি শ্রেণি ভোক্তা হয় তবে আমি শ্রেণি নির্মাতার দ্বারা নির্ধারিত চুক্তিগুলি অনুসরণ করি। যদি কোনও সম্পত্তি হয় string, তবে আমার চুক্তিটি হ'ল: b 2 বিল অবধি কোনও অক্ষর নির্ধারণ করুন। যদি কোনও সম্পত্তি হয় তবে DateTimeআমার চুক্তিটি হ'ল: ডেটটাইমের সীমাতে যে কোনও সংখ্যা নির্ধারণ করুন, যা আমি সন্ধান করতে পারি। যদি নির্মাতা সেটটারগুলিতে বাধা যুক্ত করে তবে এই সীমাবদ্ধতাগুলি যোগাযোগ করা হয় না। কিন্তু যদি, পরিবর্তে, স্রষ্টা ধরণ থেকে পরিবর্তন stringকরতে Surname, তারপর তাদের নতুন উপাধি বর্গ সীমাবদ্ধতার যোগাযোগ, এবং সম্পত্তি public Surname LastNameসেটার বৈধতা নেই। এছাড়াও, Surnameপুনরায় ব্যবহারযোগ্য।
সুমেরে

4
এবং যেহেতু Surname, আমার উদাহরণে, পুনঃব্যবহারযোগ্য, তাই সম্পত্তি সম্পর্কিত সেটারে এই বৈধতাগুলিকে কোডের অন্য জায়গাগুলিতে অনুলিপি / পেস্ট করার বিষয়ে আপনাকে পরে চিন্তা করার দরকার নেই। এবং আপনি যদি কখনও અટর ব্যবহারের ব্যবসায়ের নিয়মগুলিতে পরিবর্তন করে থাকেন তবে কোনও અટারের বৈধতা একাধিক স্থানে রয়েছে কিনা তা ভাবছেন না। মান অবজেক্টস সম্পর্কে আমি পোস্ট করা লিঙ্কটি দেখুন
সুমেরে

261

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

89
অটোপোপার্টিগুলির উল্লেখ করার জন্য +1 - আমি মনে করি এটি এখানে (এবং অন্য কোথাও) বেশিরভাগ উত্তর আনতে ভুলে গেছে this এই ব্যাখ্যা ব্যতীত, public int myVar { get; set; }সত্যিকার অর্থে কি বোঝা যায় তা এখনও বুঝতে অসুবিধা হতে পারে (এবং আমি ধারণা করি যে এটির কারণ) হিট কমপক্ষে 50% জন্য এই প্রশ্নটি পায়)।
প্রিয়দু নিমরে

7
+1 এছাড়াও অটো উল্লেখ করার জন্য এবং এটি কীভাবে কাজ করে তা উল্লেখ করার জন্য ("অটোপ্রোপার্টি আমাদের জন্য ব্যক্তিগত ক্ষেত্র উত্পন্ন করে") আমি উত্তর দিয়েছিলাম এমন একটি প্রশ্ন যা আমি পেয়েছিলাম। গবেষণা করার সময় আমি তাদের সম্পর্কে এমএসডিএন এর পৃষ্ঠায় দেখতে পাইনি যে একটি ব্যক্তিগত ক্ষেত্র তৈরি হয়েছিল এবং বিভ্রান্তির সৃষ্টি করছে any আমার ধারণা এর অর্থ কি? "স্বতঃ-প্রয়োগকৃত বৈশিষ্ট্যগুলিতে অ্যাট্রিবিউটসের অনুমতি রয়েছে তবে স্পষ্টতই ব্যাকিং ফিল্ডগুলিতে নয় যেহেতু সেগুলি আপনার উত্স কোড থেকে অ্যাক্সেসযোগ্য নয় If যদি আপনাকে কোনও সম্পত্তির ব্যাকিং ফিল্ডে কোনও বৈশিষ্ট্য ব্যবহার করতে হয় তবে কেবল একটি নিয়মিত সম্পত্তি তৈরি করুন" " তবে নিশ্চিত ছিল না
নাইরা

3
নোট করুন যে প্রদত্ত উদাহরণটি স্কোয়াটকে আবদ্ধ করে না। এই সম্পত্তিটি ব্যক্তিগত ক্ষেত্রে 100% সম্পূর্ণ অ্যাক্সেস দেয়, সুতরাং এটি মোটেও বস্তু-ভিত্তিক নয়। এই ক্ষেত্রে আপনার পাশাপাশি একটি সার্বজনীন ক্ষেত্র থাকতে পারে। মঞ্জুর, এটি ভবিষ্যতে রিফ্যাক্টর কোডটি (প্রান্তিকভাবে) সহায়তা করে, তবে এটির মেটাল মূল্যমানের যে কোনও আইডিই কয়েকটি কীস্ট্রোক সহ একটি ক্ষেত্রটিকে কোনও সম্পত্তিতে রূপান্তর করতে পারে। উত্তর কীভাবে সম্পত্তি কাজ করে সে সম্পর্কে প্রযুক্তিগতভাবে সঠিক হতে পারে তবে এটি তাদের ব্যবহারগুলিতে একটি ভাল "ওওপি ব্যাখ্যা" দেয় না।
সারা

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

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

164

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


98

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

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

1
নোংরা ট্র্যাকিং সম্পর্কে একটি প্রশ্ন: আমি যদি ক্ষেত্রটি সরাসরি পরিবর্তন করতে পারি - তবে এটি করা সম্ভব কিনা তা আমি জানি না, আমি বলতে পারি: "কোনও বস্তুর একটিও ফিল্ড পরিবর্তন না হলে অবজেক্টটি সংরক্ষণ করার দরকার নেই" " এইভাবে নোংরা ট্র্যাকিং কোনও তফাত হবে না, আমি কি কিছু মিস করছি?
সাইটগুলি

2
@ জুয়ানপাস্তাস: নোংরা ট্র্যাকিং সম্পর্কিত সম্পত্তিগুলির সুবিধাটি হ'ল যদি সম্পত্তি সেটটাররা একটি "নোংরা" পতাকা সেট করে, তবে যেখানে পতাকা সেট কোডটি সেট করা হয় না সেই পরিস্থিতিতে কোনও বৈশিষ্ট্যের মান দেখতে হবে না see যদি তারা পরিবর্তন হতে পারে। বিপরীতে একটি বস্তু ক্ষেত্র হিসেবে তার বৈশিষ্ট্যাবলী অনাবৃত, তাহলে সব ক্ষেত্র বিষয়বস্তু পূর্ববর্তী মান (যা না শুধুমাত্র তুলনা করতে সময় যোগ করেন, কিন্তু এর মানে হল কোড আবশ্যক বিরুদ্ধে তুলনা করা যেতে আবশ্যক আছে পূর্ববর্তী মান)।
সুপারক্যাট

এগুলি একটি ভাল এটি এটি আপনাকে পদ্ধতিগুলি (ইভেন্ট হিসাবে) ট্রিগার করতে বা মান সেট করা বা পড়ার সময় লগিং করার অনুমতি দেয়।
coloboxp

54

প্রোপার্টি ব্যবহার করে, আপনি কোনও ইভেন্ট উত্থাপন করতে পারেন, যখন সম্পত্তির মান পরিবর্তন হয় (যেমন। প্রপার্টি চেঞ্জডভেন্ট) বা বাতিলকরণের সমর্থনে মান পরিবর্তন করার আগে।

(সরাসরি অ্যাক্সেস) ক্ষেত্রে এটি সম্ভব নয়।

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

3
আমি এটি খুঁজে পেতে একটি দীর্ঘ সময় নিয়েছি। এটি একটি এমভিভিএম । ধন্যবাদ ! :)

46

যেহেতু তাদের মধ্যে বেশিরভাগ প্রযুক্তিগত উপকারিতা এবং এর সাথে ব্যাখ্যা করেছেন 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;
        }
   }

এটি আকর্ষণীয় তথ্য, তবে আপনি ক্ষেত্র এবং সম্পত্তি দর্শনের বিন্দুটি অনুপস্থিত।
ডেভিড ফেরেঞ্জি রোগোয়ান

ফিলোসফি বলতে আপনার অর্থ কী ? @ ডেভিড ফেরেঞ্জি
সারাথ আভানাভ

উদাহরণস্বরূপ চিহ্নিত উত্তর দেখুন। তবে আপনি লক্ষ্য করেছেন যে আপনি কেবল ব্যবহারের উদাহরণ সরবরাহ করছেন, যেহেতু ক্ষেত্র এবং সম্পত্তিগুলির মধ্যে পার্থক্য ইতিমধ্যে বর্ণিত হয়েছে, সুতরাং আমার মন্তব্যটি ভুলে গেছেন, দয়া করে :)
ডেভিড ফেরেনসি রোোগান

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

1
আমি এটি পড়েছি, তবে আপনি আমার পূর্ববর্তী মন্তব্যটি স্পষ্টভাবে পড়েন নি: " তবে আপনি লক্ষ্য করেছেন যে, আপনি কেবল ব্যবহারের উদাহরণ দিচ্ছেন, যেহেতু ক্ষেত্র এবং সম্পত্তিগুলির মধ্যে পার্থক্য ইতিমধ্যে বর্ণিত ছিল, তাই আমার মন্তব্যটি ভুলে গেছেন, দয়া করে :) " ।
ডেভিড ফেরেঞ্জি রোগোয়ান

32

বিবিধ - ব্যবহার (কখন এবং কেন)

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

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


এটি একটি দুর্দান্ত উত্তর, সত্যই আমাকে এটি বুঝতে সাহায্য করেছে।
স্টিভ বাউমান

14

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

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


11

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

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

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

বৈশিষ্ট্যগুলি মান পেতে / সেট করতে যা বোঝায় তার অর্থ এনপ্যাপুলেশন করে বিমূর্তির একটি স্তরকে সমর্থন করে।

বেশিরভাগ / সমস্ত ক্ষেত্রে বৈশিষ্ট্যগুলি ব্যবহার করুন তবে পার্শ্ব প্রতিক্রিয়া এড়াতে চেষ্টা করুন।


ক্ষেত্রগুলির সমস্ত ধরণের মূল্য সম্পর্কিত সমস্যা থাকতে পারে যখন ক্ষেত্রের ডেটা ধরণের কোনও রূপান্তর অপারেটর ওভারলোডের সাথে একটি বস্তু হয় - এটি একটি সূক্ষ্ম গোচা।
অ্যান্ডি ডেন্ট

1
বৈশিষ্ট্যগুলির কখনই পার্শ্ব প্রতিক্রিয়া হওয়া উচিত নয়। এমনকি ডিবাগারও ধরে নেয় এটি নিরাপদে তাদের মূল্যায়ন করতে পারে।
ক্রেগ গিডনি

@ স্ট্রিল্যাঙ্ক: আমি সম্পূর্ণরূপে একমত, তবে, সবসময় এটি হয় না। ডিবাগার হিসাবে, ফানক্যাভাল নিয়ে অনেক সমস্যা রয়েছে যদি আপনি এটির কথা বলছেন।
ব্রায়ান রাসমুসেন

11

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


7

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

উদাহরণস্বরূপ, যদি আমার কাছে "আইডি" এবং "নাম" নামে ব্যক্তিগতকৃত ভেরিয়েবল থাকে যা ব্যক্তিগত তবে তবে এমন পরিস্থিতি থাকতে পারে যেখানে শ্রেণীর বাইরে এই লেখকটি পড়তে / লেখার জন্য প্রয়োজন হয়। এই পরিস্থিতিতে, সম্পত্তি আমাকে সম্পত্তির জন্য সংজ্ঞায়িত 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";
    }
}

6

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

সাধারণভাবে, অন্য সমস্ত উত্তরগুলি ভাল ডিজাইন সম্পর্কে স্পট-অন: এক্সপোজিং ফিল্ডগুলির চেয়ে এক্সপোজিং প্রোপার্টি পছন্দ করে। আপনি সম্ভবত করবে না নিয়মিতভাবে নিজেকে বলছে এটি "বাহ, কল্পনা কত খারাপ জিনিষ হবে যদি আমি একটি সম্পত্তির পরিবর্তে এই একটি ক্ষেত্র তৈরি করেছে" এটা আছে, এত , একটি অবস্থা যেখানে আপনি বলতে "ঘেউ হবে মনে আরো বিরল 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, এটি এর যাদুকরীভাবে সমস্ত থ্রেড-সুরক্ষা সমস্যাগুলি সমাধান করে না যেমন এর নাম থেকেই বোঝায় যে এটি হতে পারে।

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


6

ক্ষেত্র এবং বৈশিষ্ট্য একে অপরের সাথে সমান বলে মনে হলেও এগুলি 2 সম্পূর্ণ ভিন্ন ভাষার উপাদান।

  1. ক্ষেত্রগুলি হ'ল শ্রেণি স্তরে ডেটা সংরক্ষণ করার একমাত্র প্রক্রিয়া। ক্ষেত্রগুলি ক্লাস স্কোপে ধারণামূলকভাবে পরিবর্তনশীল। আপনি যদি আপনার ক্লাসগুলির উদাহরণগুলিতে কিছু তথ্য সঞ্চয় করতে চান (অবজেক্টস) আপনার ক্ষেত্রগুলি ব্যবহার করা দরকার। অন্য কোন উপায় নেই। বৈশিষ্ট্যগুলি কোনও ডেটা সংরক্ষণ করতে পারে না যদিও এটি দেখতে সক্ষম হতে পারে so নীচে দেখুন.

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

  1. ক্ষেত্রগুলি সর্বজনীন হিসাবে তৈরি করা ঠিক নয় not
  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());
        }
    }
}

শ্রেণীর আপডেট হওয়া সংস্করণটির নিম্নলিখিত সুবিধা রয়েছে।

  1. FullNameএবং YearOfBirthঅবৈধ মান জন্য পরীক্ষা করা হয়।
  2. Ageলিখনযোগ্য নয়। এটি YearOfBirthবর্তমান বছরের থেকে কলকুলেটেড ।
  3. একটি নতুন সম্পত্তি UPPER CASE এ 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

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

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


4

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

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

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


4

আপনি যদি থ্রেড আদিম ব্যবহার করতে চলেছেন তবে আপনাকে ক্ষেত্রগুলি ব্যবহার করতে বাধ্য করা হবে। বৈশিষ্ট্যগুলি আপনার থ্রেডযুক্ত কোডটি ভেঙে দিতে পারে। তা ছাড়াও কোরি যা বলেছেন তা সঠিক।


1
কখন থেকে? সম্পত্তি মধ্যে আপনার ব্যাকিং ক্ষেত্র লক এবং এটি equivilant এর
Sekhat

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

4

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

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

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

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

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


যেহেতু C # এর 3.0 , প্যাটার্ন এখানে সুবিধামত একটি বৈশিষ্ট্য বলা দ্বারা সমর্থিত বর্ণিত অটো- বাস্তবায়িত প্রোপার্টি
ডেভিডআরআর

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

বৈশিষ্ট্যগুলি আউট বা আরএফএফ প্যারামিটার হিসাবে ব্যবহার করা যায় না, সুতরাং কোনও ক্ষেত্রকে কোনও সম্পত্তিতে পরিবর্তন করা হলে লাইনটিতে ত্রুটিগুলি সঙ্কলন করতে পারে। মানটি যদি প্রথম থেকেই সম্পত্তি হিসাবে প্রয়োগ করা হত, তবে এটি কখনই আউট বা আরএফ (পাস্কাল / ডেল্ফিতে VAR) প্যারামিটার হিসাবে ব্যবহৃত হত না এবং আপনি গেটর / সেটারে যে কোনও পরিবর্তন করেন তা ব্যবহারে স্বচ্ছ হবে।
হার্টওয়্যার

4

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


4

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

  class SomeClass
  {
     int numbera; //Field

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

  }

3

বৈশিষ্ট্যগুলি ক্ষেত্রগুলিকে encapsulate করে, এভাবে আপনাকে সেট করা বা পুনরুদ্ধার করা মানটিতে অতিরিক্ত প্রসেসিং করতে সক্ষম করে। আপনি যদি ক্ষেত্রের মানটিতে কোনও প্রাক-বা পোস্টপ্রসেসিং না করে থাকেন তবে বৈশিষ্ট্যগুলি ব্যবহার করা সাধারণত ওভারকিল।


1
না, আমি সর্বদা বৈশিষ্ট্যগুলি ব্যবহার করি, এটি আপনাকে আপনার এপিআইটি ভঙ্গ না করে যে কোনও সময়ে বাস্তবায়ন পরিবর্তন করার নমনীয়তা দেয়।
সেখাত

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

3

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


3

Ditionতিহ্যগতভাবে ব্যক্তিগত ক্ষেত্রগুলি গেটর এবং সেটার পদ্ধতির মাধ্যমে সেট করা হয়। কম কোডের খাতিরে আপনি তার পরিবর্তে ক্ষেত্রগুলি সেট করতে সম্পত্তি ব্যবহার করতে পারেন।


3

যখন আপনার একটি ক্লাস থাকে যা "গাড়ি"। বৈশিষ্ট্যগুলি হ'ল রঙ, আকৃতি ..

ক্ষেত্রগুলি যেমন শ্রেণীর ক্ষেত্রের মধ্যে সংজ্ঞাযুক্ত ভেরিয়েবল Where


3

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

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

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


3

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

যখন আমি একটি ক্লাসিক মডেল ব্যক্তিগত ক্ষেত্র / পাবলিক পঠনযোগ্য বৈশিষ্ট্যগুলি ব্যবহার করি, তখন 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;
 }
}

হ্যাঁ আমার খারাপ, দুঃখিত!
টনি পিনট

3

এটি সম্পর্কে চিন্তা করুন: আপনার কাছে এই ঘরে প্রবেশ করার জন্য একটি ঘর এবং একটি দরজা রয়েছে। কে কীভাবে আপনার ঘরে আসছেন এবং কীভাবে আপনার ঘরে সুরক্ষিত তা পরীক্ষা করতে চান তবে আপনার সম্পত্তি ব্যবহার করা উচিত অন্যথায় তারা কোনও দরজা হবে না এবং প্রত্যেকে সহজেই ডাব্লু / ও যে কোনও প্রবিধানে আসবে

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

এখন আপনি সেই ব্যক্তিকে চেক করেছেন এবং তার সাথে তার কিছু খারাপ আছে কিনা তা সম্পর্কে জানতে


3

ক্ষেত্রগুলি ক্লাসে পরিবর্তনশীল। ক্ষেত্রগুলি হ'ল ডেটা যা আপনি অ্যাক্সেস মডিফায়ার ব্যবহারের মাধ্যমে সজ্জিত করতে পারেন।

বৈশিষ্ট্যগুলি ক্ষেত্রগুলির সাথে সমান যা তারা রাজ্যগুলি এবং কোনও বস্তুর সাথে সম্পর্কিত ডেটা সংজ্ঞায়িত করে।

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


2

বৈশিষ্ট্যগুলি বিশেষ ধরণের শ্রেণীর সদস্য, বৈশিষ্ট্যগুলিতে আমরা একটি পূর্বনির্ধারিত সেট বা গেট পদ্ধতি ব্যবহার করি 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;
    }
}

2

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

উদাহরণ:

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

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


2

বৈশিষ্ট্যগুলি ক্ষেত্রটি প্রকাশ করতে ব্যবহৃত হয়। তারা অ্যাক্সেসর ব্যবহার করে (সেট করুন, পাবেন) যার মাধ্যমে ব্যক্তিগত ক্ষেত্রগুলির মানগুলি পড়তে, লিখিত বা হেরফের করতে পারে।

সম্পত্তি স্টোরেজ অবস্থানগুলির নাম দেয় না। পরিবর্তে, তাদের এমন অ্যাক্সেসর রয়েছে যা তাদের মানগুলি পড়তে, লিখতে বা গণনা করতে পারে।

বৈশিষ্ট্যগুলি ব্যবহার করে আমরা কোনও ফিল্ডে সেট করা ডেটার প্রকারের উপর বৈধতা সেট করতে পারি।

উদাহরণস্বরূপ, আমাদের ব্যক্তিগত পূর্ণসংখ্যার ক্ষেত্রের বয়স রয়েছে যাতে আমাদের ইতিবাচক মানগুলি দেওয়া উচিত কারণ বয়স নেতিবাচক হতে পারে না।

আমরা এটি দুটি উপায়ে গেটর এবং সেটটার এবং সম্পত্তি ব্যবহার করে করতে পারি 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; }
}

2

বেশিরভাগ ক্ষেত্রে এটি এমন একটি সম্পত্তির নাম হতে চলেছে যা আপনি ভেরিয়েবল নাম ( ক্ষেত্র ) এর বিপরীতে অ্যাক্সেস করেন তার কারণ হ'ল নেট এবং অনুশীলন বিশেষত সি # তে একটি শ্রেণীর মধ্যে প্রতিটি টুকরো তথ্য রক্ষা করার জন্য এটি ভাল অভ্যাস হিসাবে বিবেচিত হয় , এটি কোনও উদাহরণের পরিবর্তনশীল বা স্ট্যাটিক ভেরিয়েবল (শ্রেণি ভেরিয়েবল) কারণ এটি কোনও শ্রেণীর সাথে সম্পর্কিত।

সেই সমস্ত ভেরিয়েবলকে প্রাসঙ্গিক বৈশিষ্ট্য সহ সুরক্ষিত করুন যা আপনাকে ডেটাগুলির এই টুকরোগুলি পরিচালনা করে যখন আপনাকে সংজ্ঞায়িত করতে, সেট করতে এবং অ্যাক্সেসরগুলি পেতে এবং বৈধতার মতো কাজ করার অনুমতি দেয় ।

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

যেমন। Math.PI

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.