এনামস এবং কনস্ট্যান্টস। কোনটি কখন ব্যবহার করবেন?


97

আমি এনামগুলিতে কিছু পড়ছিলাম এবং ধ্রুবকগুলি ঘোষণার সাথে এগুলি খুব মিল খুঁজে পেয়েছি। যখন আমি এনাম বা তদ্বিপরীত চেয়ে ধ্রুবক ব্যবহার করব তখন কীভাবে জানব। এনাম ব্যবহারের কিছু সুবিধা কী কী?



জাভা সম্পর্কিত অনুরূপ প্রশ্নের জন্য এছাড়াও স্ট্যাকওভারফ্লো.com/ প্রশ্নগুলি / ১১৫753737376/২ দেখুন (উত্তরগুলি বেশিরভাগ সি # তেও প্রযোজ্য)।
আলেক্সি লেভেনকভ

উত্তর:


97

আপনি কিছু হতে পারে এমন মানগুলির একটি ব্যাপ্তি নির্ধারণ করতে চাইলে এনামগুলি ব্যবহার করুন। রঙ যেমন একটি সুস্পষ্ট উদাহরণ:

public enum Colour
{
    White,
    Red,
    Blue
}

বা সম্ভবত কিছু জিনিস যেমন সেট: (উদাহরণ হিসাবে আমি এখানে অলস হিসাবে এখান থেকে চুরি করেছি)

[FlagsAttribute]
enum DistributedChannel
{
  None = 0,
  Transacted = 1,
  Queued = 2,
  Encrypted = 4,
  Persisted = 16,
  FaultTolerant = Transacted | Queued | Persisted
}

কনস্ট্যান্টগুলি পিআই এর মতো একক মানের জন্য হওয়া উচিত। পিআই মানগুলির একটি ব্যাপ্তি নেই, কেবল পিআই রয়েছে।

অন্যান্য বিষয় বিবেচনা করুন:

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

4
আপনি যদি .ToString()এনামকে প্রচুর পরিমাণে ব্যবহার করে শেষ করেন তবে কনস্ট স্ট্রিং সহ একটি শ্রেণি ব্যবহারের কোনও মান যা দেখতে এনামের মতো দেখায় এবং কাজ করে তবে একটি কলকে আবদ্ধ করে ToString()? উদাহরণ
সিঞ্জাই

অপেক্ষা করুন, আমি মনে করি আমি আমার নিজের প্রশ্নের উত্তর দিয়েছি। এই উদাহরণে কোডটি কাজ করবে না: আপনাকে ইনপুটটিকে স্ট্রিং হিসাবে নিতে হবে, যা সত্যই এনামের মতো আচরণ করবে না।
সিঞ্জাই

4
আপনি কেন এনামের চেয়ে ধ্রুব রঙের সাথে একটি স্ট্যাটিক ক্লাস কালার রাখতে পারবেন না? পার্থক্য কি?
ডাব্লুডিউউ

সংক্ষিপ্ত বিবৃতিতেType Safety"
আহমেদনাবিলি

31

অন্যান্য উত্তরগুলি থেকে কী অনুপস্থিত তা হ'ল এনামগুলিতে একটি পূর্ণসংখ্যার বেস টাইপ থাকে। আপনি ডিফল্টটিকে int থেকে অন্য কোনও অবিচ্ছেদ্য প্রকারের মতো চরের মতো পরিবর্তন করতে পারেন:

enum LongEnum : long {
    foo,
    bar,
}

আপনি বেস টাইপ থেকে স্পষ্টভাবে এবং স্পষ্টতই কাস্ট করতে পারেন, যা স্যুইচ-স্টেটমেন্টে কার্যকর useful সাবধান হোন যে কোনও এনামের জন্য বেস ধরণের কোনও মান castালতে পারে, এমনকি এনামের উপযুক্ত মান সহ কোনও সদস্য না থাকলেও। সুতরাং একটি সুইচে সর্বদা ডিফল্ট বিভাগ ব্যবহার করা ভাল ধারণা। বিটিডাব্লু।

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

void method(int a, int b) {...}

যদি ধ্রুবক A কেবলমাত্র একটিতে যেতে পারে এবং ধ্রুবক B কেবল বিতে যেতে পারে, তবে দুটি পৃথক এনাম টাইপ ব্যবহার করে সংকলনের সময় কোনও অপব্যবহারের উদ্রেক হবে।


21

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

ধ্রুবকগুলি কোনও ডেটা টাইপ হতে পারে তবে একটি এনাম একটি এনাম।

আমি এনাম এমন যে কোনও জায়গা ব্যবহার করব যেখানে আপনার কাছে প্রচুর বিকল্প থাকতে পারে এবং কোডটির পাঠযোগ্যতা উন্নত করতে চান। উদাহরণস্বরূপ, আপনার মান 0, 1, 2 এর মান হিসাবে বা ত্রুটি, সতর্কতা এবং তথ্য হিসাবে এনাম হিসাবে ট্রেস স্তর থাকতে পারে।

এনুমের বিটওয়াইড অপারেটর, অর্থাৎ ফন্টস্টাইল.বোল্ড | হিসাবে ব্যবহার করার ক্ষমতাও রয়েছে ফন্টস্টাইল.ইটালিক আপনাকে গা bold় এবং তির্যক ফন্ট দেবে।


8

রবার্টের উত্তর ছাড়াও:

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

  2. রবার্ট: হ্যাঁ, এনুমকে বিট ফিল্ড হিসাবে ব্যবহার করা যেতে পারে। পতাকা বৈশিষ্ট্যটি ব্যবহার করুন (এবং এনামের সদস্যদের উপযুক্ত সংখ্যাসূচক মান রয়েছে তা নিশ্চিত করুন)।


3

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

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


3

enumপরিবর্তে ব্যবহার করার সময় আমি যে জিনিসটি সহজেই খুঁজে পাই constতা হ'ল আপনি একটিতে থাকা মানগুলির মাধ্যমে পুনরাবৃত্তি করতে পারেন, মানগুলির সাথে enumএটি করা খুব কঠিন const

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