বিভিন্ন গেটর শৈলীর মধ্যে সি # তে পার্থক্য


154

আমি কখনও কখনও প্রাপ্তির জন্য বৈশিষ্ট্যগুলিতে সংক্ষিপ্ত বিবরণ দেখতে পাই। যেমন two দুই প্রকার:

public int Number { get; } = 0

public int Number => 0;

কেউ দয়া করে আমাকে বলতে পারেন যে এই দুজনের মধ্যে কোনও পার্থক্য রয়েছে কিনা। তারা কেমন আচরণ করে? এই দুজনেই কি কেবল পঠনযোগ্য?

উত্তর:


266

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

দ্বিতীয়টিতে, প্রাপ্ত ব্যক্তিটি প্রতিবার কেবল 0 প্রত্যাবর্তন করে, এতে কোনও ক্ষেত্র জড়িত নেই।

সুতরাং যেকোনও স্বয়ংক্রিয়ভাবে প্রয়োগ করা বৈশিষ্ট্য বা অভিব্যক্তি-দেহী সদস্যদের ব্যবহার এড়াতে আমাদের কাছে রয়েছে:

প্রথম সংস্করণ

private readonly int _number = 0;
public int Number { get { return _number; } }

দ্বিতীয় সংস্করণ

public int Number { get { return 0; } }

পার্থক্যের একটি সুস্পষ্ট উদাহরণ এটির মতো দেখা যেতে পারে:

public DateTime CreationTime { get; } = DateTime.UtcNow;
public DateTime CurrentTime => DateTime.UtcNow;

আপনি যদি একটি একক অবজেক্ট তৈরি করেন তবে এর CreationTimeসম্পত্তি সর্বদা একই ফল দেবে - কারণ এটি কেবলমাত্র পাঠ্যক্ষেত্রে সঞ্চিত, অবজেক্ট নির্মাণে আরম্ভ করা। যাইহোক, আপনি যতবার CurrentTimeসম্পত্তিতে অ্যাক্সেস করবেন , DateTime.UtcNowততবার মূল্যায়নের কারণ হবে , তাই আপনি সম্ভাব্য ভিন্ন ফলাফল পাবেন।


23
মনে রাখবেন যে দ্বিতীয় সংস্করণ সর্বদা একই মান দেয় না। একটি ভাল উদাহরণ আপনি ফিরে যদি random.NextInt()। প্রথম সংস্করণ একবার মূল্যায়ন করবে এবং সর্বদা একই মান হবে। দ্বিতীয়টি প্রতিবার একটি নতুন মান ফিরে আসবে।

248

একটি পার্থক্য হ'ল যখন এটি 0মূল্যায়ন করা হয়: অবজেক্ট তৈরির সময় বা সম্পত্তি ব্যবহার করার সময়।

ডেটটাইম বৈশিষ্ট্যগুলির সাথে আপনি এটি আরও ভাল দেখতে পারেন:

class SomeTestClass
{
    public DateTime Start { get; } = DateTime.Now;

    public DateTime Now => DateTime.Now;
}

Startসম্পত্তি, (যখন উদাহরণস্বরূপ তৈরি করা হয়েছে এর) একই সময় ফিরে যখন রাখে Nowপরিবর্তন বর্তমান সময় প্রতিফলিত।

ব্যাখ্যা :

প্রথম সংস্করণ ("স্টার্ট") একটি প্রাথমিক মান সরবরাহ করে যা এমনকি নির্মাণকারীর দ্বারা ওভাররাইট করা যেতে পারে। সুতরাং এটি একবার মূল্যায়ন করা হয়।
দ্বিতীয় সংস্করণ ("এখন") এমন ভাব প্রকাশ করে যা এই সম্পত্তিটির "প্রাপ্তি" হবে। সুতরাং প্রতিবার সম্পত্তিটি পড়ার সময় এটি মূল্যায়ন করা হয়। এমনকী কোনও ব্যাকিং ফিল্ডও নেই যা নির্মাণকারী ওভাররাইট করতে পারে।


26
এটি আমার মনে হয় সবচেয়ে গুরুত্বপূর্ণ পার্থক্য।
ম্যাথু

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

3
বাহ, আপনি বিখ্যাত জন স্কিট নিজেই চেয়ে বেশি ভোট পেয়েছেন।
machine_1

21

এগুলি সি # 6 ভাষার বৈশিষ্ট্য।

প্রথম উদাহরণ

public int Number { get; } = 0

প্রথম উদাহরণটি কেবলমাত্র গেটর-অটো সম্পত্তি । কেবলমাত্র গেটর-অটো-প্রপার্টিটির ব্যাকিং ফিল্ডকে স্পষ্টতই পঠনযোগ্য হিসাবে ঘোষণা করা হয়েছে।

দ্বিতীয় উদাহরণ

public int Number => 0;

এবং দ্বিতীয় উদাহরণ হ'ল সম্পত্তি-মত ফাংশন সদস্যদের মত প্রকাশের সংস্থা । মনে রাখবেন যে কোনও getকীওয়ার্ড নেই: এটি অভিব্যক্তি বডি সিনট্যাক্স ব্যবহারের দ্বারা নিহিত।

দুজনেই পঠনযোগ্য।


5
... তবে জোন স্কিট যেমন ব্যাখ্যা করেছেন, আপনি প্রথমটি যে মানটি পরিবর্তন করতে পারেন তা পরিবর্তন করতে পারেন।
মার্টিন বোনার

2
@ মার্টিনবোনার ... তবে কেবল কনস্ট্রাক্টরে।
ডেনিস কুইপার্স

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