c# - সি#3.0 স্বয়ংক্রিয় বৈশিষ্ট্য-দরকারী নাকি?




.net automatic-properties (12)

দ্রষ্টব্য: এটি পোস্ট করা হয়েছিল যখন আমি সি # শুরু করছিলাম। ২014 সালের জ্ঞানের সাথে, আমি সত্যিই বলতে পারি যে স্বয়ং-সম্পত্তিগুলি এমন সেরা জিনিসগুলির মধ্যে রয়েছে যা C # ভাষাতে ঘটেছে।

আমি একটি ব্যক্তিগত এবং একটি পাবলিক ক্ষেত্র ব্যবহার করে # সি আমার বৈশিষ্ট্য তৈরি করতে ব্যবহার করা হয়:

private string title;
public string Title
{
    get { return title;  }
    set { title = value;  }
}

এখন, .NET 3.0 সহ, আমরা স্বয়ং-বৈশিষ্ট্য পেয়েছি:

public string Title { get; set; }

আমি জানি এটি আরো একটি দার্শনিক / বিষয়গত প্রশ্ন, কিন্তু প্রতিটি ক্ষেত্রের জন্য কোডের পাঁচটি লাইন সংরক্ষণ ছাড়া এই স্বয়ংক্রিয় বৈশিষ্ট্যগুলি ব্যবহার করার কোনো কারণ আছে কি? আমার ব্যক্তিগত দড়ি যে বৈশিষ্ট্য আমার কাছ থেকে উপাদান গোপন করা হয়, এবং আমি কালো যাদু একটি বড় ফ্যান না।

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

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

তাই, আমি এখানে কি অনুপস্থিত? কেন কেউ আসলে স্বয়ং সম্পত্তি ব্যবহার করতে চান?


@ ডমিনিকিক: আমি এটা পাই না .. আপনি স্বয়ংক্রিয় বৈশিষ্ট্যগুলির সাথে এটি করতে পারবেন না ?:

public string Title { get; }

অথবা

public string Title { get; private set; }

এই আপনি উল্লেখ করা হয় কি?


অটো-প্রপার্টিগুলির সাথে আমার সবচেয়ে বড় গ্রীপ হল যে তারা সময় বাঁচানোর জন্য ডিজাইন করা হয়েছে কিন্তু আমি প্রায়ই তাদের সম্পূর্ণ ফ্লো বৈশিষ্ট্যগুলিতে প্রসারিত করতে পারি।

কি VS2008 অনুপস্থিত একটি বিস্ফোরণ অটো সম্পত্তি রিফেক্টর হয়।

আমরা একটি encapsulate ক্ষেত্র রিফ্যাক্টর আছে শুধু আমি পাবলিক ক্ষেত্র ব্যবহার করার জন্য দ্রুত কাজ করে তোলে।


আমরা স্ট্যাক ওভারফ্লো তাদের সব সময় ব্যবহার।

আপনি বৈশিষ্ট্যের বনাম পাবলিক ভেরিয়েবল একটি আলোচনা আগ্রহী হতে পারে। IMHO সত্যিই এটি একটি প্রতিক্রিয়া কি, এবং যে উদ্দেশ্যে, এটা মহান।


আমার মতে, আপনি সর্বদা পাবলিক ক্ষেত্রের পরিবর্তে স্বয়ংক্রিয় সম্পত্তি ব্যবহার করতে হবে। যে বলেন, এখানে একটি আপোষ আছে:

আপনি একটি সম্পত্তি জন্য ব্যবহার করতে হবে নামকরণ কনভেনশন ব্যবহার করে একটি internal ক্ষেত্র দিয়ে শুরু। যখন আপনি প্রথম হয়

  • তার সমাবেশ বাইরে থেকে ক্ষেত্র অ্যাক্সেস প্রয়োজন, অথবা
  • একটি Gator / Setter যুক্তি যুক্ত করা প্রয়োজন

এটা কর:

  1. ক্ষেত্রের নামকরণ
  2. এটা ব্যক্তিগত করা
  3. একটি পাবলিক সম্পত্তি যোগ করুন

আপনার ক্লায়েন্ট কোড পরিবর্তন করতে হবে না।

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


আমি তাদের সাথে শুধুমাত্র সমস্যা যে তারা যথেষ্ট যেতে না। স্বয়ংক্রিয় বৈশিষ্ট্য যোগ করা কম্পাইলার একই রিলিজ, আংশিক পদ্ধতি যোগ। কেন তারা একসঙ্গে দুই না করা আমার অতিক্রম করা হয়। একটি সরল "আংশিক অন <PropertyName> পরিবর্তিত" এই জিনিস সত্যিই সত্যিই দরকারী হয়েছে।


আমি ব্যক্তিগতভাবে স্বয়ং বৈশিষ্ট্য ভালোবাসি। কোড লাইন সংরক্ষণ সঙ্গে কি ভুল? আপনি GETERS বা Setters মধ্যে স্টাফ করতে চান, পরে তাদের স্বাভাবিক বৈশিষ্ট্য রূপান্তর করতে কোন সমস্যা নেই।

আপনি বলেছিলেন যে আপনি ক্ষেত্রগুলি ব্যবহার করতে পারেন, এবং যদি আপনি পরে তাদের যুক্ত করতে চান তবে আপনি তাদের বৈশিষ্ট্যগুলিতে রূপান্তর করবেন। কিন্তু এই প্রতিফলনের কোন ব্যবহার (এবং সম্ভবত অন্যত্র?) সঙ্গে সমস্যা উপস্থাপন করতে পারে।

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

আমি এটা var শব্দ হিসাবে একই অনুমান। ব্যক্তিগত পছন্দ একটি বিষয়।


আমি সব সময় স্বয়ংক্রিয় সম্পত্তি ব্যবহার। সি # 3 এর আগে আমি সব টাইপিং নিয়ে বিরক্ত হব না এবং পরিবর্তে কেবল পাবলিক ভেরিয়েবল ব্যবহার করতে পারি।

আমি মিস করছি শুধুমাত্র জিনিস এই কাজ করতে সক্ষম হচ্ছে:

public string Name = "DefaultName";

আপনি বৈশিষ্ট্য সঙ্গে আপনার কন্সট্রাক্টর মধ্যে ডিফল্ট স্থানান্তরিত করতে হবে। ক্লান্তিকর :-(


আমি সর্বদা পাবলিক ক্ষেত্রের পরিবর্তে বৈশিষ্ট্য তৈরি করি কারণ আপনি একটি ইন্টারফেস সংজ্ঞাতে বৈশিষ্ট্যগুলি ব্যবহার করতে পারেন, আপনি একটি ইন্টারফেস সংজ্ঞাতে সর্বজনীন ক্ষেত্রগুলি ব্যবহার করতে পারবেন না।


এখানে উল্লেখিত একটি বিষয় হল, আমার বোঝার জন্য, এটি সি # 3.0 এ সিনট্যাক্টিক চিনি মাত্র , যা কম্পাইলার দ্বারা তৈরি আইএলটি একই। আমি কালো জাদু এড়ানো সম্পর্কে একমত, কিন্তু একই জিনিস, একই জিনিস জন্য কম লাইন সাধারণত একটি ভাল জিনিস।


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

এর মত সহজ.


বৈশিষ্ট্যগুলির পরিবর্তে ক্ষেত্রগুলি ব্যবহার করার জন্য তিনটি বড় downsides হয়:

  1. আপনি একটি সম্পত্তি করতে পারেন, যখন আপনি একটি ক্ষেত্রের ডাটাবেজ করতে পারবেন না
  2. যদি আপনি কোনও ক্ষেত্র ব্যবহার করে শুরু করেন তবে আপনি পরে (সহজেই) কোনও সম্পত্তি পরিবর্তন করতে পারবেন না
  3. আপনি এমন কিছু বৈশিষ্ট্য যুক্ত করতে পারেন যা আপনি কোনও ক্ষেত্রে যোগ করতে পারবেন না

সি ++ এর নির্মাতা বিজ্নে স্ট্রাউস্ট্রপ থেকে:

আমি বিশেষ করে পেতে এবং ফাংশন সেট অনেক সঙ্গে ক্লাস অপছন্দ। এটি প্রায়শই একটি ইঙ্গিত যে এটি প্রথম শ্রেণিতে ছিল না। এটা শুধু একটি তথ্য গঠন। এবং যদি এটি সত্যিই একটি তথ্য কাঠামো, এটি একটি তথ্য গঠন করা।

এবং আপনি কি জানেন? সে সঠিক. প্রায়শই আপনি পেতে এবং সেটের মধ্যে কোনও কাজ না করেই কেবল কোনও সেট এবং সেটে ব্যক্তিগত ক্ষেত্রগুলি মোড়ানো হয়, কেবলমাত্র এটি "বস্তু ভিত্তিক" জিনিস। এই সমস্যাটি মাইক্রোসফটের সমাধান; তারা মূলত পাবলিক ক্ষেত্র যা আপনি বাঁধতে পারেন।





automatic-properties