স্বয়ংক্রিয় বৈশিষ্ট্য বনাম পাবলিক ফিল্ড


353

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

তবে অনেক সময় আছে যখন কোনও ক্ষেত্রের মান ধরে রাখার জন্য কেবল সেখানে থাকে এবং পেতে বা সেট করতে কোনও গণনার প্রয়োজন হয় না। এগুলির জন্য আমরা সকলেই এই সংখ্যাটি করব:

public class Book
{
    private string _title;

    public string Title
    {
          get{ return _title;  }
          set{ _title = value; }
    }
}

ঠিক আছে, আমার একটি স্বীকারোক্তি আছে, আমি এগুলি সব লিখতে পারছিলাম না (সত্যিই, এটি এটি লেখার দরকার ছিল না, এটি এটি দেখার দরকার ছিল), তাই আমি দুর্বৃত্ত হয়ে গিয়েছিলাম এবং সরকারী ক্ষেত্রগুলি ব্যবহার করেছি।

তারপরে সি # 3.0 আসে এবং আমি দেখতে পাই তারা স্বয়ংক্রিয় বৈশিষ্ট্য যুক্ত করেছে:

public class Book
{
    public string Title {get; set;} 
}

যা পরিপাটি, এবং আমি এর জন্য কৃতজ্ঞ, কিন্তু সত্যই, কেবল একটি পাবলিক ফিল্ড তৈরির চেয়ে এর চেয়ে আলাদা কী?

public class Book
{
    public string Title;
}


6
আমি একটি ফিল্ডকে ঠিক একটি সম্পত্তিতে রূপান্তর করেছি যাতে আমি সেটারে একটি ব্রেকপয়েন্ট স্থাপন করতে পারি
ইয়ান রিংরোজ

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

2
propকোড স্নিপেট এটি দ্রুত বৈশিষ্ট্য তৈরি করে তোলে। শুধু টাইপ propতারপর ট্যাব।
টোনো নাম

উত্তর:


175

কিছুদিন আগে আমার একটি সম্পর্কিত প্রশ্নে জেফের ব্লগে একটি পোস্ট করার লিঙ্ক ছিল, কিছু পার্থক্য ব্যাখ্যা করে।

সম্পত্তি বনাম পাবলিক ভেরিয়েবল

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

    TryGetTitle(out book.Title); // requires a variable

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

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

28
এছাড়াও ক্ষেত্রটি একটি পরিবর্তনশীল এবং রেফারেন্স ( refবা outকীওয়ার্ড) দ্বারা পাস করা যেতে পারে , যখন কোনও সম্পত্তি এক জোড়া এক্সেসর এবং রেফারেন্সের মাধ্যমে পাস করা যায় না। উদাহরণস্বরূপ bool success = TryGetMyTitle(out myBook.Title);যা ব্যবহারগুলি outকোনও ক্ষেত্রের সাথে কাজ করবে এবং কোনও সম্পত্তি নিয়ে কাজ করবে না। ক্ষেত্র থেকে সম্পত্তিতে পরিবর্তন কেন একটি ব্রেকিং পরিবর্তন, এর স্পষ্ট উদাহরণ এটি!
জেপ্প স্টিগ নীলসন

2
@ কাইলবারান না, এটি খুব বেশি অর্থবোধ করে না কারণ একটি সম্পত্তি এক জোড়া এক্সেসর পদ্ধতির, কোনও ভেরিয়েবল নয়। একটি সাধারণ কাজটি হ'ল একটি স্থানীয় ভেরিয়েবল ঘোষণা করা (সম্ভবত সেই সম্পত্তিটি পড়ুন যা স্থানীয় ভেরিয়েবলের মধ্যে তার মান রাখে), স্থানীয় ভেরিয়েবলটিকে ref/ হিসাবে পাস করুন outএবং তারপরে সম্পত্তিটি স্থানীয় ভেরিয়েবলের মান হিসাবে সেট করুন। তবে তারপরে পদ্ধতিটি নিজেই সম্পত্তিটি অ্যাক্সেস করে না, এটি আপনি সেখানে তৈরি স্থানীয় ভেরিয়েবলটি অ্যাক্সেস করে।
জেপ্পে স্টিগ নীলসেন

5
@ থাইবার্স্কার্কার সত্য, যদিও সি # 6 এ আপনি এমনটি করতে পারেন public int Foo { get; }যা কেবলমাত্র পঠনযোগ্য ব্যাকিং ফিল্ডের সাথে একটি স্বয়ং-সম্পত্তি তৈরি করবে।
মাইকেল স্টাম

83

এপিআই সমস্যাগুলি উপেক্ষা করে, সম্পত্তি ব্যবহারের ক্ষেত্রে যে জিনিসটি আমি সবচেয়ে মূল্যবান বলে মনে করি তা হ'ল ডিবাগিং।

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

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


2
দশ বছর পরে, ডেটা ব্রেকপয়েন্টগুলি এখানে কমপক্ষে। নেট কোর :) এর জন্য রয়েছে
লুয়ান

72

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

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


9
আমি এই উত্তরটি পছন্দ করেছি কারণ এটি 'প্রতিবিম্ব', 'ইন্টারফেস' বা 'ওভাররাইড' শব্দ ব্যবহার করে না। ('চুক্তি' সম্পর্কে খুব খারাপ)

65

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


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

8
@odyodyodys - আমি নিশ্চিত নই যে আমি একমত যে এটি খারাপ নকশা। আপনার যুক্তি ব্যাখ্যা করুন?
যায়েদ মাসুদ

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

22
@ zooone9243, + মার্টিনস্ট্যাটনার: এটি 6 মাস আগে ছিল, তখন থেকে আমি অনেক কিছু শিখেছি। আমি এটি আবার নিয়ে যাচ্ছি :)
ওডিস

47

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


10

এটি সংস্করণ এবং এপিআই স্থিতিশীলতা সম্পর্কে। সংস্করণ 1-তে কোনও পার্থক্য নেই - তবে পরে, আপনি যদি সিদ্ধান্ত নেন যে সংস্করণ 2-এ পরীক্ষা করার জন্য কোনও ধরণের ত্রুটিযুক্ত আপনার এটিকে সম্পত্তি তৈরি করতে হবে, আপনাকে নিজের API পরিবর্তন করতে হবে না - কোথাও কোথাও কোনও কোড পরিবর্তন করা উচিত নয় সম্পত্তি সংজ্ঞা।


10

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


8

মাঠ তৈরিতে কোনও ভুল নেই public। তবে মনে রাখবেন ক্ষেত্র getter/setterদিয়ে তৈরি privateকরা কোনও এনক্যাপসুলেশন নয়। আইএমও, আপনি যদি এ এর ​​অন্যান্য বৈশিষ্ট্যগুলি যত্ন না করেন তবে আপনি এটি তৈরিও Propertyকরতে পারেন public


1

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

আপনি যদি কেবল সর্বজনীন বৈশিষ্ট্য নিয়ে যান তবে আপনার নমনীয়তা কম হবে।

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


0

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


0

আমার pov পরে কিছু গবেষণা করেছে

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

এটি সত্যই আমাদের আরও সম্ভাবনা এবং এক্সটেনসিবিলিটি দেয়।

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