যদি / অন্যটি এবং সি # তে স্যুইচ-কেস ব্যবহারের মধ্যে কোনও উল্লেখযোগ্য পার্থক্য আছে?


219

সি # তে switchএকটি বনাম একটি বিবৃতি ব্যবহার করে কী সুবিধা / নিম্নগামী if/else। আপনার কোডটির চেহারা ব্যতীত অন্যরকম পার্থক্য রয়েছে তা আমি কল্পনা করতে পারি না।

ফলাফলযুক্ত আইএল বা সম্পর্কিত রানটাইম পারফরম্যান্স একেবারে আলাদা হওয়ার কোনও কারণ আছে কি?

সম্পর্কিত: দ্রুত কি, স্ট্রিং উপর সুইচ বা অন্যথায় টাইপ?


সম্পর্কিত বিষয়: স্ট্যাকওভারফ্লো
জন টি

3
এই প্রশ্নটি কেবলমাত্র বেশিরভাগ বিকাশকারীদের জন্য তত্ত্বের মধ্যে আকর্ষণীয়, যদি না আপনি প্রায়শই নিজেকে এক বিলিয়ন বার পুনরাবৃত্তি করে দেখেন। (তারপরে একটি স্যুইচ স্টেটমেন্ট ব্যবহার করুন এবং 48 থেকে 43 সেকেন্ড পর্যন্ত যান ...) বা ডোনাল্ড নুথের কথায়: "আমাদের ছোট কার্যকারিতা সম্পর্কে ভুলে যাওয়া উচিত, সময়ের প্রায় 97% বলা উচিত: অকালীন অপ্টিমাইজেশন হ'ল সমস্ত মন্দের মূল" en.wikedia.org/wiki/Praram_optimization# কখন_তো_প্রোমাইজ করুন
সায়ার

আমি প্রায়শই যদি / অন্যটি পরিবর্তে স্যুইচ ভাগ করে নেওয়ার কারণে ভাগ করে নেব sc
জোশ

উত্তর:


340

সুইচ স্টেটমেন্টটি কেবল ডিবাগ বা সামঞ্জস্য মোডে আইএফ হিসাবে একই সমাবেশ উত্পন্ন করে। প্রকাশের ক্ষেত্রে, এটি জাম্প টেবিল (এমএসআইএল 'স্যুইচ' বিবৃতি মাধ্যমে) সংকলিত হবে - যা ও (1)।

সি # (অন্যান্য অনেক ভাষার মতো নয়) স্ট্রিং ধ্রুবকগুলিকে স্যুইচ করতে দেয় - এবং এটি কিছুটা আলাদাভাবে কাজ করে। স্বেচ্ছাসেবী দৈর্ঘ্যের স্ট্রিংয়ের জন্য জাম্প টেবিল তৈরি করা স্পষ্টতই ব্যবহারিক নয়, তাই প্রায়শই এই জাতীয় স্যুইচ IF এর স্ট্যাকে সংকলিত হবে।

তবে যদি শর্তের সংখ্যা ওভারহেডগুলি কভার করার জন্য যথেষ্ট বড় হয় তবে সি # সংকলক একটি হ্যাশটবেল অবজেক্ট তৈরি করবে, স্ট্রিং ধ্রুবক দ্বারা এটি বিশিষ্ট করবে এবং লাফের পরে সেই টেবিলে একটি অনুসন্ধান করবে। হ্যাশটেবল সন্ধানের কঠোরভাবে ও (1) নয় এবং লক্ষণীয় ধ্রুবক ব্যয় রয়েছে তবে কেস লেবেলের সংখ্যা যদি বড় হয় তবে এটি প্রতিটি স্ট্রিং ধ্রুবকের সাথে আইএফএসের তুলনায় তুলনামূলকভাবে দ্রুততর হবে।

সংক্ষেপে বলা যায়, শর্তের সংখ্যা যদি 5 বা তার বেশি হয় তবে সুইচকে IF এর চেয়ে বেশি পছন্দ করুন, অন্যথায় যা ভাল লাগে তা ব্যবহার করুন।


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

8
আমার প্রায় দশটা মনে হয়। 20 নিরাপদ দিকে হতে। এবং বিটিডব্লিউ, আমার ক্রোধ আপনার নয়, বরং লোকেদের উত্সাহ দেওয়া ও গ্রহণ করা।
ইমাম

48
কিছুটা পরীক্ষার মাধ্যমে গণনা <= 6: "যদি"; গণনা> = 7: অভিধান। এটি এমএস। নেট 3.5 সি # সংকলক সহ - এটি অবশ্যই সংস্করণ এবং বিক্রেতাদের মধ্যে পরিবর্তিত হতে পারে।
জন স্কিটি

37
আরে, আমি তোমার কাছে ক্ষমা চাই। হাড়ের মাথা হওয়ার জন্য দুঃখিত
স্কট উইসনিউইস্কি

ব্যবহারিক প্রয়োগগুলির জন্য অনুসরণ হিসাবে, বেশিরভাগ সময়ই কি কোনও বাস্তব বিশ্বের পার্থক্য রয়েছে? আমি সি # তে স্যুইচ স্টেটমেন্টগুলি বিজোড় হিসাবে দেখতে পেয়েছি, তাদের বাক্য গঠনটি অন্য কোনও কিছুর মতো নয় এবং আমি দেখতে পাচ্ছি যে তারা আমার কোডটি কম পঠনযোগ্য করে তোলে, স্যুইচ স্টেটমেন্টগুলি ব্যবহার করা কি বিরক্তিকর, অথবা আমার অন্য আইএফএসের সাথে কেবল প্রোগ্রাম করা উচিত এবং কেবলই আসা উচিত আমি যদি পারফরম্যান্সের বাধা পাই তবে সেগুলি প্রতিস্থাপন করব?
জেসন মাস্টার্স

54

সাধারণভাবে (সমস্ত ভাষা এবং সমস্ত সংকলক বিবেচনা করে) একটি স্যুইচ বিবৃতি একটি / if বিবৃতি চেয়ে দক্ষ হতে পারে, কারণ একটি সংকলকটির পক্ষে স্যুইচ স্টেটমেন্ট থেকে জাম্প টেবিল তৈরি করা সহজ is যথাযথ সীমাবদ্ধতা দেওয়া হলে / অন্য বিবৃতিগুলির জন্য একই জিনিস করা সম্ভব, তবে এটি আরও বেশি কঠিন।

সি # এর ক্ষেত্রে এটিও সত্য, তবে অন্যান্য কারণেও।

প্রচুর পরিমাণে স্ট্রিং সহ, একটি স্যুইচ স্টেটমেন্ট ব্যবহার করার ক্ষেত্রে একটি উল্লেখযোগ্য পারফরম্যান্স সুবিধা রয়েছে কারণ সংকলকটি জাম্পটি বাস্তবায়নের জন্য হ্যাশ টেবিল ব্যবহার করবে।

অল্প সংখ্যক স্ট্রিং সহ, দুজনের পারফরম্যান্স একই।

এটি কারণ কারণ সে ক্ষেত্রে সি # সংকলকটি একটি জাম্প টেবিল তৈরি করে না। পরিবর্তে এটি এমএসআইএল উত্পন্ন করে যা আইএফ / ইএলএসই ব্লকগুলির সমতুল্য।

একটি "স্যুইচ স্টেটমেন্ট" এমএসআইএল নির্দেশনা রয়েছে যে যখন জিট করা হয় তখন একটি স্যুইচ স্টেটমেন্ট বাস্তবায়নের জন্য একটি জাম্প টেবিল ব্যবহার করবে। এটি কেবল পূর্ণসংখ্যার ধরণের সাথে কাজ করে, তবে (এই প্রশ্নটি স্ট্রিং সম্পর্কে জিজ্ঞাসা করে)।

সংখ্যক স্ট্রিংয়ের জন্য, IF / ELSE ব্লক তৈরি করতে সংকলকটির পক্ষে এটি আরও কার্যকর তবে হ্যাশ টেবিলটি ব্যবহার করা।

আমি যখন প্রাথমিকভাবে এটি লক্ষ্য করেছি, তখন আমি অনুমান করেছিলাম যে আইএফ / ইএলএসই ব্লকগুলি অল্প সংখ্যক স্ট্রিংয়ের সাথে ব্যবহার করা হয়েছিল যে সংকলকটি বড় সংখ্যক স্ট্রিংয়ের জন্য একই রূপান্তরটি করেছিল।

এটি ছিল ভুল। 'আইএমএ' আমার কাছে এটি উল্লেখ করার জন্য যথেষ্ট সদয় ছিল (ভাল ... তিনি এ বিষয়ে দয়া করেননি, তবে তিনি সঠিক ছিলেন, এবং আমি ভুল ছিলাম, যা গুরুত্বপূর্ণ অংশ)

আমি এমএসআইএল-তে "স্যুইচ" নির্দেশের অভাব সম্পর্কে একটি হাড়ের নেতৃত্বাধীন ধারণাও তৈরি করেছি (আমি বুঝতে পেরেছি, যদি কোনও স্যুইচ আদিম ছিল, তারা কেন এটি একটি হ্যাশ টেবিল দিয়ে ব্যবহার করছিল না, তাই সেখানে কোনও সুইচ আদিম হওয়া উচিত নয়)। ...)। এটি উভয়ই ভুল ছিল এবং আমার দিক থেকে অবিশ্বাস্যভাবে বোকা। আবার 'আইএমএ' আমার দিকে ইঙ্গিত করেছে।

আমি এখানে আপডেটগুলি করেছি কারণ এটি সর্বাধিক রেটযুক্ত পোস্ট এবং স্বীকৃত উত্তর।

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


3
এমএসআইএল-এ একটি স্যুইচ আদিম রয়েছে এবং সি # স্টেটমেন্টগুলি সাধারণত সি-এর মতো লুক্কায়নে সংকলন করে। নির্দিষ্ট পরিস্থিতিতে (টার্গেট প্ল্যাটফর্ম, ক্লিচ সুইচ ইত্যাদি) সংকলনের সময় আইএফগুলিতে স্যুইচ প্রসারিত করা যেতে পারে তবে এটি কেবল একটি ফ্যালব্যাক সামঞ্জস্যতা পরিমাপ।
ইমাম

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

9
ইমাম, যদি ত্রুটি আছে, তাদের চিহ্নিত করুন। স্কটের মত শব্দ পোস্টটি সংশোধন করে খুশি হবে। যদি তা না হয় তবে অন্যরাও যে উত্তরটি সংশোধন করার ক্ষমতা অর্জন করেছে তারা তা করবে। এই জাতীয় সাইট এটিই একমাত্র উপায়, এবং মনে হয় সাধারণভাবে এটি কাজ করছে। অথবা আপনার বলটি নিয়ে বাড়ি যান :)
jwalkerjr

2
@ স্কট: আমি আপনাকে দ্বিতীয় এবং তৃতীয় অনুচ্ছেদগুলিকে "স্ট্রিংগুলির জন্য" স্পষ্টভাবে বর্ণনা করতে সম্পাদনা করতে উত্সাহিত করব। লোকেরা নীচে আপডেটটি ভালভাবে পড়তে পারে না।
জন স্কিটি

4
@ আইমা যদি আপনি মনে করেন কোনও উত্তর উদ্দেশ্যমূলকভাবে ভুল হয় তবে এটি সঠিক হতে সম্পাদনা করুন। এজন্য প্রত্যেকে উত্তর সম্পাদনা করতে পারে।
মাইলস রাউটে

18

তিনটি কারণ পছন্দ switch:

  • একটি কম্পাইলার লক্ষ্য করে নেটিভ কোড প্রায়ই মধ্যে একটি সুইচ বিবৃতি কম্পাইল করতে পারেন এক শর্তসাপেক্ষ শাখা প্লাস একটি পরোক্ষ লাফ যেহেতু একটা ক্রম ifকরা একটি প্রয়োজন শর্তসাপেক্ষ শাখা ক্রম । মামলার ঘনত্বের উপর নির্ভর করে কীভাবে কেস স্টেটমেন্টগুলি দক্ষতার সাথে সংকলন করা যায় সে সম্পর্কে একটি বিস্তৃত জ্ঞাত গবেষণাপত্র রচিত হয়েছে; কিছু এলসিসি সংকলক পৃষ্ঠা থেকে লিঙ্কযুক্ত । (এলসিসি-তে স্যুইচগুলির জন্য আরও একটি উদ্ভাবনী সংকলক ছিল))

  • একটি স্যুইচ বিবৃতি পারস্পরিক একচেটিয়া বিকল্পগুলির মধ্যে একটি পছন্দ এবং স্যুইচ সিনট্যাক্স এই নিয়ন্ত্রণ প্রবাহটিকে প্রোগ্রামারের কাছে আরও স্বচ্ছ করে তোলে তারপরে-অন্যথায় বিবৃতিগুলির একটি নীড়।

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

একটি উপাখ্যান: আজীবন কৃতিত্বের জন্য পুরষ্কার পাওয়ার সময় তিনি যে বক্তৃতাটি দিয়েছিলেন, আমি টনি হোয়ারকে বলতে শুনেছিলাম যে তিনি তার কেরিয়ারে যা কিছু করেছিলেন তার মধ্যে তিনটি ছিল যার জন্য তিনি সবচেয়ে বেশি গর্বিত:

  • কুইকসোর্ট আবিষ্কার হচ্ছে
  • স্যুইচ স্টেটমেন্টটি আবিষ্কার করা হচ্ছে (যাকে টনি caseস্টেটমেন্ট বলেছে)
  • শিল্পে তাঁর কেরিয়ার শুরু এবং শেষ

আমি ছাড়া বাঁচতে ভাবতে পারি নাswitch


16

সংকলকটি সামান্য পার্থক্য (নুথ, কেউ?) সহ একই কোডে বেশ কিছু সবকিছুকেই অনুকূলিত করতে চলেছে।

পার্থক্যটি হ'ল একটি সুইচ স্টেটমেন্ট পনের চেয়েও পরিষ্কার, যদি অন্য বিবৃতি একসাথে জড়িত থাকে।

বন্ধুরা যদি-অন্য বিবৃতিগুলিকে বন্ধুদের স্ট্যাক না করে।


13
"বন্ধুরা যদি অন্যথায় বিবৃতি দেয় তবে বন্ধুদের বন্ধুবান্ধব থাকতে দেয় না।" আপনার একটি ভারী সিটেকার করা উচিত :)
ম্যাথু এম

14

আসলে, একটি স্যুইচ স্টেটমেন্টটি আরও দক্ষ more সংকলকটি এটি দেখার জন্য সারণিতে অনুকূলিত করবে যেখানে / অন্য বিবৃতি দিয়ে তা না পারলে। নীচের দিকটি হ'ল পরিবর্তনশীল মানগুলির সাথে একটি স্যুইচ স্টেটমেন্ট ব্যবহার করা যায় না।
আপনি করতে পারবেন না:

switch(variable)
{
   case someVariable
   break;
   default:
   break;
}

এটা করা হয়েছে

switch(variable)
{
  case CONSTANT_VALUE;
  break;
  default:
  break;
}

1
আপনার কোন ধরণের সংখ্যা আছে? আমি কৌতূহলী যে কতটা সংকলক যদি একটি ইফ / অন্যথায় একটি সুইচ বিবৃতিটি অনুকূল করতে পারে
ম্যাথিউ এম

হ্যাঁ আমি বিশ্বাস করি একটি স্যুইচ স্টেটমেন্ট সর্বদা ও (1) এর সাথে অনুকূল হয় যেখানে অন্যথায় বিবৃতি ও (এন) হবে যেখানে এন যদি / অন্যথায় বিবৃতি দেয় তবে সঠিক মানের অবস্থান হয়।
কেমিলার2002

সি # এর ক্ষেত্রে এটি সত্য নয়, আরও তথ্যের জন্য নীচে আমার পোস্টটি দেখুন।
স্কট উইসনিউইস্কি

আমি এ সম্পর্কে পুরোপুরি নিশ্চিত নই, তবে আমি যে বইয়ের শপথ করেছিলাম সে বইটিতে আমি এটি খুঁজে পেয়েছি। আপনি কি নিশ্চিত যে আপনি এমএসআইএল কোডটি অপ্টিমাইজেশন ছাড়া খুঁজছেন না। আপনি অপ্টিমাইজেশানটি সংকলন না করে এটি জাম্প টেবিল তৈরি করবে না।
kemiller2002

আমি উভয় ডিবাগ এবং খুচরা মোডে সংকলন করেছি এবং উভয় ক্ষেত্রেই এটি উত্পন্ন হয় যদি / অন্যগুলি ব্লক করে। আপনি কি নিশ্চিত যে বইটি আপনি দেখছিলেন সেটি সি # এর কথা বলছিল? বইটি সম্ভবত একটি সংকলক বই বা সি বা সি ++ সম্পর্কিত একটি বই ছিল
স্কট উইসনিউস্কি

14

আমি অন্য কাউকে (সুস্পষ্ট?) বিষয়টি বাড়াতে দেখিনি যে স্যুইচ বিবৃতিটির অনুমিত দক্ষতা সুবিধা বিভিন্ন ক্ষেত্রে প্রায় সমান সম্ভাবনা হওয়ার উপর নির্ভরশীল। যে ক্ষেত্রে মানগুলির একটি (বা কয়েকটি) খুব বেশি সম্ভাবনা রয়েছে, সর্বাধিক সাধারণ কেসগুলি প্রথমে পরীক্ষা করা হয়েছে তা নিশ্চিত করে যদি-তবে-অন্যথায় মই আরও দ্রুত হতে পারে:

সুতরাং, উদাহরণস্বরূপ:

if (x==0) then {
  // do one thing
} else if (x==1) {
  // do the other thing
} else if (x==2) {
  // do the third thing
}

বনাম

switch(x) {
  case 0: 
         // do one thing
         break;
  case 1: 
         // do the other thing
         break;
  case 2: 
         // do the third thing
         break;
}

যদি x শূন্য 90% হয় তবে "যদি-অন্য" কোডটি স্যুইচ-ভিত্তিক কোডের চেয়ে দ্বিগুণ দ্রুত হতে পারে। এমনকি যদি সংকলক "স্যুইচ" কে কোনও ধরণের চৌকস টেবিল-চালিত গোটোতে রূপান্তরিত করে, তবুও এটি শূন্যের জন্য যাচাই করা তত দ্রুত হবে না।


3
অকাল অপ্টিমাইজেশন নেই! সাধারণভাবে, যদি আপনার কাছে কেবল কয়েকটি ক্ষেত্রে বেশি থাকে এবং সেগুলি switchসামঞ্জস্যপূর্ণ হয় তবে switchবিবৃতিটি আরও ভাল (আরও পঠনযোগ্য, কখনও কখনও দ্রুত)। আপনি কি জানেন যে এক ক্ষেত্রে আরো অনেক কিছু সম্ভাবনা থাকে, আপনি যে বাইরে একটি গঠনের টান করতে পারেন if- else- switchকনস্ট্রাক্ট এবং যদি এটা measurably আরো দ্রুত যে এখনও যুক্তিসঙ্গতভাবে পাঠযোগ্য, আপনি যে ছেড়ে (একই পদ্ধতি পুনরাবৃত্তি করুন, যদি প্রয়োজন ছিল।) আইএমও।। যদি switchঅধঃপতন ঘটে এবং খুব ছোট হয়ে যায় তবে একটি রেজেক্স-প্রতিস্থাপন এটিকে একটি else ifচেইনে রূপান্তর করার বেশিরভাগ কাজ করবে ।
কেউ নেই

6
আসল প্রশ্নটি (তিন বছর আগে!) সেক্ষেত্রে / অন্যথায় এবং স্যুইচ করার মধ্যে সুবিধা এবং অসুবিধাগুলি চেয়েছিল। এটি একটি উদাহরণ। আমি ব্যক্তিগতভাবে এই ধরণের অপ্টিমাইজেশনটি একটি রুটিনের রানটাইমের ক্ষেত্রে একটি উল্লেখযোগ্য পার্থক্য করতে দেখেছি।
মার্ক বেসি

7

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

সুতরাং, যদি / অন্যটি আরও ভাল দেখাচ্ছে তবে এটি ব্যবহার করুন, অন্যথায় একটি স্যুইচ স্টেটমেন্ট ব্যবহার করুন।


4

পার্শ্ব বিষয়, তবে আমি প্রায়শই উদ্বিগ্ন (এবং প্রায়শই দেখতে পাচ্ছি) if/ elseএবং switchবিবৃতি অনেক ক্ষেত্রে খুব বড় হয়ে যায়। এগুলি প্রায়শই রক্ষণাবেক্ষণের ক্ষতি করে।

সাধারণ অপরাধীদের মধ্যে রয়েছে:

  1. বিবৃতি যদি একাধিক ভিতরে খুব বেশি করে
  2. বিশ্লেষণ করা মানুষের থেকে সম্ভবের চেয়ে বেশি কেস স্টেটমেন্ট
  3. যদি অনুসন্ধান করা হয় তবে তা মূল্যায়নের ক্ষেত্রে অনেকগুলি শর্ত

ঠিক করতে:

  1. মেথড রিফ্যাক্টরিং এ এক্সট্রাক্ট করুন।
  2. কেসের পরিবর্তে পদ্ধতি পয়েন্টার সহ একটি অভিধান ব্যবহার করুন বা যুক্ত কনফিগারেশনের জন্য আইওসি ব্যবহার করুন। পদ্ধতি কারখানাগুলিও সহায়ক হতে পারে।
  3. শর্তগুলি তাদের নিজস্ব পদ্ধতিতে আহরণ করুন

4

এই লিঙ্ক অনুসারে, আইএফ বনাম স্যুইচ ব্যবহার করে পুনরাবৃত্তির পরীক্ষার তুলনা করুন এবং যদি বিবৃতিটি হয় 1,000,000,000 পুনরাবৃত্তির জন্য, স্যুইচ বিবৃতি = 43.0 এর দ্বারা নেওয়া সময় এবং যদি বিবৃতি = 48.0 দ্বারা

যা আক্ষরিকভাবে প্রতি সেকেন্ডে 20833333 পুনরাবৃত্তি, সুতরাং, আমাদের সত্যই আরও ফোকাস করা উচিত,

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


এটা আমার জন্য নখ।
গ্রেগ গাম

3

আপনি যদি কেবল ব্যবহার করছেন তবে অন্য সমাধানটি বেস সমাধানটি তুলনাটি ব্যবহার করছে? অপারেটর

(value == value1) ? (type1)do this : (type1)or do this;

আপনি সুইচটিতে রুটিনটি করতে পারেন

switch(typeCode)
{
   case TypeCode:Int32:
   case TypeCode.Int64:
     //dosomething here
     break;
   default: return;
}

2

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

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

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

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


2

আগ্রহের প্রশ্ন। এটি কয়েক সপ্তাহ আগে কর্মক্ষেত্রে উঠে এসেছিল এবং আমরা একটি উদাহরণ স্নিপেট লিখে এবং এটি। নেট প্রতিফলকটিতে দেখে দেখে একটি উত্তর পেয়েছি (প্রতিচ্ছবিটি দুর্দান্ত! এটি আমি পছন্দ করি)।

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

আপনি যদি স্ট্রিংগুলির সাথে কেস-সংবেদনশীল তুলনা করতে চান তবে আপনি স্ট্রিং সম্পাদন করার চেয়ে দ্রুত হওয়ার কারণে আপনি একটি সুইচ স্টেটমেন্ট ব্যবহার করতে পারেন an (সম্পাদনা করুন: দ্রুত কী তা পড়ুন , স্ট্রিংটি স্যুইচ করুন বা টাইপের মতো অন্য কিছু ? কিছু প্রকৃত পারফরম্যান্স পরীক্ষার জন্য) তবে আপনি যদি কেস-সংবেদনশীল না করতে চান তবে ফলাফলটি কোডটি সুন্দর না হওয়ায় যদি এটি / অন্যথায় ব্যবহার করা ভাল।

switch (myString.ToLower())
{
  // not a good solution
}

থাম্বের সেরা নিয়মটি হ'ল স্যুইচ স্টেটমেন্টগুলি ব্যবহার করে যদি তা বোঝা যায় (গুরুত্ব সহকারে), যেমন:

  • এটি আপনার কোডের পঠনযোগ্যতা উন্নত করে
  • আপনি বিভিন্ন মানের (ফ্লোট, ইনট) বা এনামের সাথে তুলনা করছেন

যদি আপনার স্যুইচ বিবৃতিতে ফিড দেওয়ার জন্য মানটি হস্তান্তর করা প্রয়োজন (বিপরীতে স্যুইচ করার জন্য একটি অস্থায়ী পরিবর্তনশীল তৈরি করুন) তবে আপনার সম্ভবত একটি / অন্য নিয়ন্ত্রণ স্টেটমেন্ট ব্যবহার করা উচিত।

একটি আপডেট:

স্ট্রিংটিকে বড় হাতের (যেমন ToUpper()) রূপান্তর করা আরও ভাল কারণ স্পষ্টতই আরও আরও অনুকূলিতকরণ রয়েছে যা জাস্ট-ইন-টাইম সংকলকটি তুলনামূলকভাবে করতে পারে ToLower()। এটি একটি মাইক্রো অপ্টিমাইজেশন, তবে একটি শক্ত লুপে এটি কার্যকর হতে পারে।


একটু পাশের নোট:

স্যুইচ স্টেটমেন্টগুলির পঠনযোগ্যতা উন্নত করতে নিম্নলিখিতগুলি ব্যবহার করে দেখুন:

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

অনেক ক্ষেত্রে টোলওয়ার () ব্যবহার করা হ'ল সঠিক সমাধান, বিশেষত যদি প্রচুর মামলা হয় এবং হ্যাশ টেবিল উত্পন্ন হয়।
ব্লেজারব্লেড

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

2

স্যুইচ স্টেটমেন্টটি অবশ্যই দ্রুততর তবে যদি অন্যথায় হয়। ব্ল্যাকওয়াস্প এটি সরবরাহ করেছে speed

http://www.blackwasp.co.uk/SpeedTestIfElseSwitch.aspx

--এটা দেখ

তবে আপনি যে সম্ভাবনাগুলির জন্য অ্যাকাউন্টিং করার চেষ্টা করছেন তার উপর প্রচুর পরিমাণে নির্ভর করে তবে আমি যখনই সম্ভব স্যুইচ স্টেটমেন্টটি ব্যবহার করার চেষ্টা করি।


1

কেবল সি # নয়, সমস্ত সি-ভিত্তিক ভাষাগুলি, আমি মনে করি: যেহেতু একটি স্যুইচ কেবল ধীরে ধীরে সীমাবদ্ধ, তাই "জাম্প টেবিল" ব্যবহার করে খুব দক্ষ কোড তৈরি করা সম্ভব। সি কেসটি সত্যই একটি পুরানো ফরটারান গণিত গোটো, তবে সি # কেসটি এখনও ধ্রুবকের বিরুদ্ধে পরীক্ষা করে।

অপটিমাইজার একই কোড তৈরি করতে সক্ষম হবে এমনটি নয়। বিবেচনা করুন, উদাহরণস্বরূপ,

if(a == 3){ //...
} else if (a == 5 || a == 7){ //...
} else {//...
}

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

switch(a){
   case 3: // ...
    break;
   case 5:
   case 7: //...
    break;
   default: //...
}

এটি সংকলিত হতে পারে

BTABL: *
B3:   addr of 3 code
B5:
B7:   addr of 5,7 code
      load 0,1 ino reg X based on value
      jump indirect through BTABL+x

কারণ আপনি স্পষ্টভাবে সংকলককে বলছেন যে এটির ও সমতা পরীক্ষার গণনা করার দরকার নেই।


কোনও অনুকূল অপ্টিমাইজার যতক্ষণ না কার্যকর হয় ততক্ষণ 1 ম কোডটি পরিচালনা করতে পারে না। "সংকলকটি অনুকূলিত করতে পারে না" কেবল সিনেমিক পার্থক্যের উপর নির্ভর করে যা কেবলমাত্র মানুষ মিলন করতে পারে (যেমন যদি চ () বলা হয় তবে এটি জানে না যে চ () সর্বদা 0 বা 1 প্রদান করে)।
ব্লেসরব্লেড

0

আমার সিএস অধ্যাপক আপনাকে পরামর্শটি পরিবর্তন না করার পরামর্শ দিয়েছিলেন যেহেতু প্রায়শই লোকেরা বিরতি ভুলে যায় বা এটি ভুলভাবে ব্যবহার করে। আমি বলতে পারি না তিনি ঠিক কী বলেছেন তা কিন্তু কিছু লাইন বরাবর এমন কিছু সেমিনাল কোড বেসের দিকে তাকিয়ে যা স্যুইচ স্টেটমেন্টের উদাহরণ দেখিয়েছিল (বছর আগে) এতেও অনেকগুলি ভুল ছিল।


আসলে সি # তে কোনও সমস্যা নয়। দেখুন: stackoverflow.com/questions/174155/... ... এবং পড়া stackoverflow.com/questions/188461/... কেন ভয় বসবাসকারী সর্বোত্তম নীতি নাও হতে পারে আলোচনা জন্য ...
Shog9

0

আমি সবেমাত্র লক্ষ্য করেছি এমন কিছু হ'ল আপনি / যদি অন্যত্র এবং বিবৃতিগুলি পরিবর্তন করতে পারেন তবে আপনি একত্রিত করতে পারেন! পূর্বশর্তগুলি পরীক্ষা করার প্রয়োজন হলে খুব দরকারী।

if (string.IsNullOrEmpty(line))
{
    //skip empty lines
}
else switch (line.Substring(0,1))
{
    case "1":
        Console.WriteLine(line);
        break;
    case "9":
        Console.WriteLine(line);
        break;
    default:
        break;
}

3
আমি জানি এটি পুরানো, তবে আমি প্রযুক্তিগতভাবে মনে করি আপনি কোনও কিছুর "সমন্বয়" করছেন না। আপনার যে কোনও সময় কোঁকড়া বন্ধনী ছাড়াই "অন্য" থাকে, পরবর্তী বিবৃতি কার্যকর করা হবে। এই বিবৃতিটি এক-লাইন বিবৃতি হতে পারে, সাধারণত পরবর্তী লাইনে ইন্টেন্ট করা থাকে, বা মিশ্রিত বিবৃতি যেমন যদি হয়, স্যুইচ, ব্যবহার, লক ইত্যাদির ক্ষেত্রে হয় অন্য কথায় আপনার কাছে "অন্যথায়" থাকতে পারে, " অন্যটি পরিবর্তন করুন "," অন্যটি ব্যবহার করুন "ইত্যাদি Having এই কথাটি বলার পরে, আমি এটি দেখতে দেখতে পছন্দ করি এবং প্রায় ইচ্ছাকৃত দেখায়। (অস্বীকৃতি: আমি এই সমস্ত চেষ্টা করি নি তাই আমি ভুল হতে পারি!)
নেলসন রডর্মেল

নেলসন, আপনি 100% সঠিক। আমি উত্তরটি পোস্ট করার পরে কেন এটি ঘটে তা বুঝতে পেরেছিলাম।
এমনকি Mien,

0

আমি মনে করি স্যুইচ আরও বেশি দ্রুত যদি শর্তগুলির মতো দেখতে কোনও প্রোগ্রাম আছে কি না:

যে কোনও সংখ্যা প্রবেশ করানোর জন্য একটি প্রোগ্রাম লিখুন (1 - 99 এর মধ্যে) এবং এটি যা স্লটে ক) 1 - 9 তারপরে স্লট একটি খ) 11 - 19 তারপর স্লট দুটি গ) 21-29 তারপর স্লট তিনটি এবং 89- অবধি 99

তারপরে যদি আপনাকে অনেক শর্ত করতে হয় তবে পুত্র স্যুইচ কেস আপনার কেবল টাইপ করতে হবে

স্যুইচ করুন (নং / 10)

এবং কেস 0 = 1-9, কেস 1 = 11-19 এবং তেমন

এটা এত সহজ হবে

এরকম আরও অনেক উদাহরণ রয়েছে!


0

একটি স্যুইচ স্টেটমেন্টটি মূলত সমতার জন্য তুলনা। কোড লিখতে ও পড়তে সহজ হওয়ার সাথে সাথে কীবোর্ড ইভেন্টের সুইচ স্টেটমেন্টের দুর্দান্ত সুবিধা রয়েছে তবে অন্যথায় যদি বিবৃতিতে একটি {ব্র্যাকেট missing হারিয়ে যায় তবে ঝামেলাও আসতে পারে।

char abc;
switch(abc)
{
case a: break;
case b: break;
case c: break;
case d: break;
}

যদি অন্যরকম বিবৃতি দুর্দান্ত হয় তবে একটি সমাধান যদি (TheAmountOfApples বেশি হয় তবে 5 &&AmountOfApples কম হয় 10) আপনার আপেল সংরক্ষণ করুন অন্যথায় যদি (theAmountOfApples বেশি হয় তবে 10 || theAmountOfApples == 100) আপনার আপেল বিক্রি করে। আমি সি # বা সি ++ লিখি না তবে জাভা শেখার আগে আমি এটি শিখেছিলাম এবং সেগুলি ঘনিষ্ঠ ভাষা।


0

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

সাধারণ বুলিয়ান সমীকরণ / অভিব্যক্তিগুলির পরিধি ছাড়িয়ে যুক্তিযুক্ত ক্রিয়াগুলির জন্য স্যুইচ বিবৃতি উপযুক্ত নয়। এই বুলিয়ান সমীকরণ / এক্সপ্রেশনগুলির জন্য, এটি সুনির্দিষ্টভাবে উপযুক্ত তবে অন্যান্য যুক্তিযুক্ত ক্রিয়াকলাপের জন্য নয়।

আপনার যদি বিবৃতিতে যুক্তিযুক্ত আরও অনেক বেশি স্বাধীনতা রয়েছে তবে যদি বিবৃতিটি অযৌক্তিক হয়ে পড়ে বা খারাপভাবে পরিচালনা করা হয় তবে পাঠযোগ্যতার ক্ষতি হতে পারে।

আপনার মুখোমুখি কি প্রসঙ্গে তার উপর নির্ভর করে উভয়েরই জায়গা রয়েছে।

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