c# - হওয - স্বয়ংক্রিয় বৈশিষ্ট্য বনাম পাবলিক ক্ষেত্র




সাভার বিশ্ববিদ্যালয় কলেজ কি সরকারি (7)

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

সিএলআর ডিবাগার ডাটা ব্রেক পয়েন্ট সমর্থন করে না (বেশিরভাগ নেটিভ ডিবাগার্স করে)। তাই ক্লাসে একটি বিশেষ ক্ষেত্র পড়তে বা লিখতে ব্রেক বিন্দু সেট করা সম্ভব নয়। এটি কিছু ডিবাগিং পরিস্থিতিতে খুব সীমিত।

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

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

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

public class Book
{
    private string _title;

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

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

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

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

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

public class Book
{
    public string Title;
}

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

আপনি শুধুমাত্র একটি পাবলিক বৈশিষ্ট্য সঙ্গে যান তাহলে আপনি কম নমনীয়তা থাকবে।

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


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


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

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


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


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

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

  • প্রতিবিম্ব ভেরিয়েবল বনাম বৈশিষ্ট্যের উপর ভিন্নভাবে কাজ করে, তাই আপনি প্রতিফলন উপর নির্ভর করে, এটি সমস্ত বৈশিষ্ট্য ব্যবহার করা সহজ।
  • আপনি একটি পরিবর্তনশীল বিরুদ্ধে databind করতে পারবেন না।
  • একটি সম্পত্তি পরিবর্তনশীল পরিবর্তন একটি বিরতি পরিবর্তন। উদাহরণ স্বরূপ:

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

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





automatic-properties