সি # তে বিবৃতি পতনস্থল স্যুইচ করবেন?


365

switchবনাম if/else ifনির্মাণের প্রতি ভালবাসার জন্য আমার ব্যক্তিগত অন্যতম বড় কারণ স্যুইচ স্টেটমেন্ট ফলথ্রুটি । এখানে একটি উদাহরণ ক্রমযুক্ত:

static string NumberToWords(int number)
{
    string[] numbers = new string[] 
        { "", "one", "two", "three", "four", "five", 
          "six", "seven", "eight", "nine" };
    string[] tens = new string[] 
        { "", "", "twenty", "thirty", "forty", "fifty", 
          "sixty", "seventy", "eighty", "ninety" };
    string[] teens = new string[]
        { "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen",
          "sixteen", "seventeen", "eighteen", "nineteen" };

    string ans = "";
    switch (number.ToString().Length)
    {
        case 3:
            ans += string.Format("{0} hundred and ", numbers[number / 100]);
        case 2:
            int t = (number / 10) % 10;
            if (t == 1)
            {
                ans += teens[number % 10];
                break;
            }
            else if (t > 1)
                ans += string.Format("{0}-", tens[t]);
        case 1:
            int o = number % 10;
            ans += numbers[o];

            break;
        default:
            throw new ArgumentException("number");
    }
    return ans;
}

স্মার্ট লোকেরা ক্রিং হচ্ছে কারণ string[]ফাংশনটির বাইরে এসগুলি ঘোষণা করা উচিত: ভাল, তারা, এটি কেবল একটি উদাহরণ।

সংকলক নিম্নলিখিত ত্রুটির সাথে ব্যর্থ:

নিয়ন্ত্রণ একটি কেস লেবেল ('কেস 3:') থেকে অন্যটিতে পড়তে পারে না
নিয়ন্ত্রণ একটি কেস লেবেল ('কেস 2:') থেকে অন্যটিতে পড়তে পারে না

কেন? এবং তিন ধরণের না করে এই ধরণের আচরণ করার কোনও উপায় আছে if?

উত্তর:


648

( আমি অন্যত্র যে উত্তর সরবরাহ করেছি তার অনুলিপি / অনুলিপি করুন )

মাধ্যমে পতনশীল switch- caseগুলি একটি কোন কোড না থাকার অর্জন করা যেতে পারে case(দেখুন case 0), অথবা বিশেষ ব্যবহার goto case(দেখুন case 1) অথবা goto default(দেখুন case 2) ফর্ম:

switch (/*...*/) {
    case 0: // shares the exact same code as case 1
    case 1:
        // do something
        goto case 2;
    case 2:
        // do something else
        goto default;
    default:
        // do something entirely different
        break;
}

121
আমি মনে করি যে, এই বিশেষ পরিস্থিতিতে গোটো ক্ষতিকারক হিসাবে বিবেচিত হয় না।
টমাস

78
জঘন্য - আমি 1.0 এর প্রথম দিন থেকেই সি # এর সাথে প্রোগ্রামিং করে চলেছি এবং এখন পর্যন্ত আমি এটি কখনও দেখিনি। শুধু দেখাতে যান, আপনি প্রতিদিন নতুন জিনিস শিখেন।
এরিক ফোর্বস

37
সব কিছু ভাল, এরিক। এটি সম্পর্কে একমাত্র কারণ / আমি / জানতাম হ'ল আমি কম্পাইলার থিওরি নার্ড যিনি ECMA-334 চশমাটি ম্যাগনিফাইং গ্লাস দিয়ে পড়েন।
অ্যালেক্স লাইমান

13
@ ড্যানক্রম্ব: বৈশিষ্ট্যটি লেখা হয়েছিল সেই সময়ে, সি # এখনও কোনও "নরম" কীওয়ার্ড যোগ করতে পারেনি (যেমন 'ফলন', 'বর্ণ', 'থেকে' এবং 'নির্বাচন'), সুতরাং তাদের তিনটি আসল বিকল্প ছিল: 1 ) 'ফলথ্রু' একটি কঠিন কীওয়ার্ড তৈরি করুন (আপনি এটি ভেরিয়েবলের নাম হিসাবে ব্যবহার করতে পারবেন না), ২) এই জাতীয় সফটওয়্যারটি ব্যবহার করার জন্য প্রয়োজনীয় কোড লিখুন, ৩) ইতিমধ্যে সংরক্ষিত কীওয়ার্ড ব্যবহার করুন। এই পোর্টিং কোডগুলির জন্য # 1 একটি বড় সমস্যা ছিল; # 2 হ'ল আমি যা বুঝি তার থেকে মোটামুটি বড় ইঞ্জিনিয়ারিংয়ের কাজ ছিল; এবং তারা যে বিকল্পটি দিয়েছিল, # 3 এর একটি পার্শ্ব সুবিধা ছিল: অন্যান্য ডিভসরা কোডটি পড়ার পরে গোটোর বেস কনসেপ্ট থেকে বৈশিষ্ট্যটি জানতে পারে
অ্যালেক্স লিম্যান

10
একটি সুস্পষ্ট পতনের জন্য নতুন / বিশেষ কীওয়ার্ড সম্পর্কে এই সমস্ত আলোচনা। তারা কি 'চালিয়ে যাওয়া' কীওয়ার্ডটি ব্যবহার করতে পারত না? অন্য কথায়। স্যুইচটি ভেঙে পড়ুন বা পরবর্তী ক্ষেত্রে চালিয়ে যান (এর মধ্য দিয়ে পড়ুন)।
তাল সমান-তোভ

44

"কেন" হ'ল দুর্ঘটনাজনিত পতন এড়ানো, যার জন্য আমি কৃতজ্ঞ। এটি সি এবং জাভাতে বাগগুলির কোনও অস্বাভাবিক উত্স নয়।

কার্যকারিতা হ'ল গোটো ব্যবহার করা, যেমন

switch (number.ToString().Length)
{
    case 3:
        ans += string.Format("{0} hundred and ", numbers[number / 100]);
        goto case 2;
    case 2:
    // Etc
}

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


1
এটি আমার মনের মধ্যে স্যুইচ এবং অন্যথায় পার্থক্য। স্যুইচটি একটি একক ভেরিয়েবলের বিভিন্ন রাজ্য পরীক্ষা করার জন্য, যেখানে / অন্যটি সংযুক্ত কিছু সংখ্যক বিষয় যাচাই করার জন্য ব্যবহার করা যেতে পারে তবে অগত্যা একক বা একই পরিবর্তনশীল নয়।
ম্যাথু শার্লে 13

2
যদি এটি দুর্ঘটনাজনিত পতন রোধ করা হত তবে আমি মনে করি একটি সংকলক সতর্কতা আরও ভাল হত। শুধু মনে হচ্ছে আপনি যদি এক হবে তা হচ্ছে আপনার যদি বিবৃতি একটি কাজ রয়েছে:if (result = true) { }
তাল জোড়-Tov

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

26

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

switch(value)
{
    case 1:// this is still legal
    case 2:
}

23
আমি কেন কখনই বুঝতে পারি না যে এটি "কেস 1, 2:" নয়
বিসিএস

11
@ ডেভিড ফেফার: হ্যাঁ এটি হ'ল, এবং case 1, 2:সেই ভাষাগুলিতেও এটি অনুমোদিত হয়। আমি যেটা কখনই বুঝতে পারব না কেন কোনও আধুনিক ভাষা কেন এটির অনুমতি দেয় না।
বিসিএস

গোটো স্টেটমেন্ট সহ @ বিবিএস, একাধিক কমা বিচ্ছিন্ন বিকল্পগুলি পরিচালনা করা জটিল?
পেঙ্গুয়াত

@ স্পেনগুট: এটি case 1, 2:একক লেবেল তবে একাধিক নাম সহ বলা আরও সঠিক হতে পারে । - এফডাব্লুআইডাব্লু, আমি মনে করি যে বেশিরভাগ ভাষাগুলি যেগুলি "পরপর কেস লেবেলগুলি" ইন্ডিয়াম বিশেষ ক্ষেত্রে পড়তে নিষেধ করে না, বরং কেস লেবেলকে পরবর্তী বিবৃতিতে টীকা হিসাবে বিবেচনা করে এবং লেবেলযুক্ত একটি বিবৃতি দেওয়ার আগে শেষ বিবৃতিটির প্রয়োজন হয় (একটি বা আরও) কেস লেবেল একটি লাফ হতে হবে।
বিসিএস

22

এখানে উত্তর যুক্ত করতে, আমি মনে করি এটির সাথে মিল রেখে বিপরীত প্রশ্ন বিবেচনা করা উপযুক্ত worth সি প্রথমে পড়ার অনুমতি দিয়েছে কেন?

যে কোনও প্রোগ্রামিং ভাষা অবশ্যই দুটি লক্ষ্য পরিবেশন করে:

  1. কম্পিউটারে নির্দেশাবলী সরবরাহ করুন।
  2. প্রোগ্রামারের উদ্দেশ্যগুলির একটি রেকর্ড রেখে দিন।

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

বিপরীতে, ভাষা যতটা প্রোগ্রামারের অভিপ্রায় প্রকাশ করে, সেই লক্ষ্যে নেওয়া উপায়ের পরিবর্তে, লেখার সময় এবং রক্ষণাবেক্ষণের সময় প্রোগ্রামটি তত বেশি উপলব্ধিযোগ্য।

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

এই ক্ষেত্রে পতনের মাধ্যমে অনুমতি দেওয়ার জন্য দুটি ভাল কারণ রয়েছে:

  1. এটি কেবল প্রাকৃতিকভাবেই ঘটে: আপনি যদি নির্দেশাবলীর একটি সেটটিতে একটি জাম্প টেবিল তৈরি করেন এবং নির্দেশাবলীর আগের কোনও একটি ব্যাচে কোনও ধরণের লাফ বা প্রত্যাবর্তন না থাকে তবে মৃত্যুদন্ড কার্যকরভাবে পরবর্তী ব্যাচে অগ্রসর হবে। আপনি যদি switchমেশিন কোডটি ব্যবহার করে -জপ-সি-কে জাম্প-টেবিল-এ পরিণত করেন তবে ফল্ট-থ্রো -এর মাধ্যমে অনুমতি দেওয়া হ'ল "সবেমাত্র ঘটবে" ।

  2. সমাবেশে লিখেছেন এমন কোডাররা ইতিমধ্যে সমতুল্য হিসাবে ব্যবহার করেছিলেন: সমাবেশে হাতে লাফিয়ে টেবিল লেখার সময় তাদের বিবেচনা করতে হবে যে প্রদত্ত কোডের ব্লকটি কোনও রিটার্নের সাথে শেষ হবে, টেবিলের বাইরের একটি জাম্প হবে বা কেবল চালিয়ে যাবে পরের ব্লকে যেমন breakপ্রয়োজনে কোডারকে একটি স্পষ্ট যোগ করার সাথে সাথে কোডারের জন্যও "প্রাকৃতিক" ছিল।

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

চার দশক পরে যদিও, কয়েকটি কারণে কয়েকটি জিনিস এক রকম নয়:

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

এই শেষ দুটি পয়েন্ট সম্পর্কিত, কে & আর এর বর্তমান সংস্করণ থেকে নিম্নলিখিত উদ্ধৃতি বিবেচনা করুন:

এক থেকে অন্য ক্ষেত্রে পড়ার বিষয়টি দৃust় নয়, যখন প্রোগ্রামটি সংশোধন করা হবে তখন বিচ্ছিন্ন হওয়ার ঝুঁকিপূর্ণ। একক গণনার জন্য একাধিক লেবেল ব্যতীত, পতনের মাধ্যমে অল্প ব্যবহার করা উচিত এবং মন্তব্য করা উচিত।

ভাল ফর্মের বিষয়টি হিসাবে, এটি লজিক্যাল অপ্রয়োজনীয় হওয়া সত্ত্বেও শেষ কেস (এখানে ডিফল্ট) পরে একটি ব্রেক দিন। কোনও দিন যখন অন্য কেস শেষে যুক্ত হয়, এই বিট ডিফেন্সিভ প্রোগ্রামিং আপনাকে বাঁচায়।

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

এবং আপনি যখন এটি সম্পর্কে ভাবেন তখন কোডটি এর মতো করুন:

switch(x)
{
  case 1:
   foo();
   /* FALLTHRU */
  case 2:
    bar();
    break;
}

হয় কিছু যোগ পতনের মাধ্যমে কোডে স্পষ্ট করতে, এটা ঠিক এমন কিছু বিষয় যা সনাক্ত করা যাবে (অথবা যার অনুপস্থিতি সনাক্ত করা যাবে) কম্পাইলার দ্বারা নয়।

এ হিসাবে, সি # তে পতনের মাধ্যমে এই বিষয়টি স্পষ্ট হওয়া উচিত যে যারা অন্য সি-স্টাইল ভাষায় ভাল লিখেছেন তাদের পক্ষে কোনও জরিমানা যুক্ত হয় না, যেহেতু তারা ইতিমধ্যে তাদের পতনের মধ্য দিয়ে স্পষ্ট হয়ে উঠবে। †

অবশেষে, এখানকার ব্যবহার gotoইতিমধ্যে সি এবং অন্যান্য ভাষা থেকে একটি আদর্শ:

switch(x)
{
  case 0:
  case 1:
  case 2:
    foo();
    goto below_six;
  case 3:
    bar();
    goto below_six;
  case 4:
    baz();
    /* FALLTHRU */
  case 5:
  below_six:
    qux();
    break;
  default:
    quux();
}

এই ধরণের ক্ষেত্রে যেখানে আমরা চাইছি যে কোনও ব্লককে কোডটির সাথে সম্পাদিত কোডের মধ্যে অন্তর্ভুক্ত করা উচিত ঠিক এটির চেয়ে অন্য কোনও মান যা পূর্ববর্তী ব্লকে একটি উপস্থিত করে, তারপরে আমাদের ইতিমধ্যে ব্যবহার করতে হবে goto। (অবশ্যই, বিভিন্ন শর্তসাপেক্ষে এটি এড়ানোর উপায় এবং উপায় রয়েছে তবে এটি এই প্রশ্নের সাথে সম্পর্কিত সমস্ত বিষয়ে সত্য)। যেমন একটি # ইতিমধ্যে একটি সাধারণ পরিস্থিতি যেখানে আমরা একটিতে কোডের একাধিক ব্লক হিট করতে চাই এবং সেখানে switchপতনের মধ্য দিয়ে কভার করার জন্য এটি সাধারণীকরণের জন্য সাধারণ পদ্ধতিতে নির্মিত। এটি দুটি ক্ষেত্রেই আরও সুবিধাজনক এবং স্ব-ডকুমেন্টিং তৈরি করেছে, যেহেতু আমাদের সিতে একটি নতুন লেবেল যুক্ত করতে হবে তবে caseলে # হিসাবে সি # তে ব্যবহার করতে পারবেন । সি # তে আমরা below_sixলেবেল থেকে মুক্তি পেতে পারি এবং এর জন্যgoto case 5 আমরা কী করছি তা পরিষ্কার(আমাদেরও যোগ করতে হবেbreakএর জন্য default, যা আমি উপরের সি কোডটি পরিষ্কারভাবে সি # কোড নয়) তৈরি করতে রেখেছি।

সংক্ষেপে তাই:

  1. সি # ৪০ বছর আগে সি কোড যেমন করেছিলেন ঠিক তেমনই বিনা প্রতিরোধী সংকলক আউটপুটটির সাথে সম্পর্কিত নয়, যা পড়ে না-পড়ে অপ্রাসঙ্গিকতার অন্যতম অনুপ্রেরণা তৈরি করে।
  2. breakঅনুরূপ ভাষাগুলির সাথে পরিচিতদের দ্বারা ভাষা আরও সহজ শেখার জন্য এবং সহজ পোর্টিংয়ের জন্য সি # কেবল অন্তর্নিহিত না থাকার ক্ষেত্রে সি এর সাথে সামঞ্জস্যপূর্ণ রয়েছে ।
  3. সি # সম্ভবত চার দশক ধরে সমস্যার কারণ হিসাবে ভালভাবে নথিভুক্ত বাগ বা ভুল বোঝাবুঝি কোডের একটি সম্ভাব্য উত্স সরিয়ে দেয়।
  4. সি # কম্পাইলার দ্বারা সি (দস্তাবেজের মাধ্যমে পড়া) প্রয়োগ করে কার্যকর সর্বোত্তম অনুশীলন করে।
  5. সি # আরও স্পষ্ট কোড সহ অস্বাভাবিক কেসটিকে এক করে তোলে, স্বাভাবিক ক্ষেত্রে যে কোডটি কেবল একটি স্বয়ংক্রিয়ভাবে লিখে থাকে।
  6. সি # তে gotoবিভিন্ন caseলেবেল থেকে একই ব্লকটি হিট করার জন্য একই ভিত্তিযুক্ত পদ্ধতির ব্যবহার করে যা সি তে ব্যবহৃত হয় এটি এটি অন্য কিছু ক্ষেত্রে সাধারন করে তোলে।
  7. বিবৃতিতে লেবেল হিসাবে কাজ করার gotoঅনুমতি দিয়ে সি # যে- ভিত্তিক পদ্ধতিকে সি-এর তুলনায় আরও সুবিধাজনক এবং পরিষ্কার করে তোলে case

সব মিলিয়ে একটি দুর্দান্ত যুক্তিসঙ্গত সিদ্ধান্ত


* বেসিকের কিছু ফর্ম কাউকে পছন্দ মতো করার অনুমতি দেয় GOTO (x AND 7) * 50 + 240যা ভঙ্গুর অবস্থায় থাকে এবং তাই নিষিদ্ধের জন্য একটি বিশেষ প্ররোচিত মামলা goto, নিম্ন-স্তরের কোডটি যেভাবে তৈরি করতে পারে তার উপর ভিত্তি করে উচ্চ-ভাষার সমতুল্য দেখায় serve গাণিতিক একটি মানের উপর নির্ভর করে, যা ম্যানুয়ালি বজায় রাখতে হয় এমন কিছুের চেয়ে সংকলনের ফলাফল যখন অনেক বেশি যুক্তিসঙ্গত। বিশেষত ডাফের ডিভাইসের প্রয়োগগুলি সমতুল্য মেশিন কোড বা আইএলকে তাদের ভাল ndণ দেয় কারণ নির্দেশাবলীর প্রতিটি ব্লক প্রায়শই nopফিলারগুলির সংযোজন ছাড়াই একই দৈর্ঘ্যের হয়ে থাকে ।

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


17

আপনি 'গেটো কেস লেবেল' করতে পারেন http://www.blackwasp.co.uk/CSharpGoto.aspx

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


8

যখন ইচ্ছা দ্বারা এটি ব্যবহার না করা হয়েছিল তবে সমস্যা তৈরি হয়েছিল তা এড়াতে তারা নকশার দ্বারা এই আচরণটি ছেড়ে দিয়েছিল।

কেস অংশে কোনও বিবৃতি না থাকলেই এটি ব্যবহার করা যেতে পারে, যেমন:

switch (whatever)
{
    case 1:
    case 2:
    case 3: boo; break;
}

4

তারা সি # এর জন্য স্যুইচ স্টেটমেন্ট (সি / জাভা / সি ++ থেকে) আচরণ পরিবর্তন করেছে। আমার ধারণা, যুক্তিটি হ'ল লোকেরা পতনের কথা ভুলে গিয়েছিল এবং ত্রুটিগুলি হয়েছিল। আমি যে একটি বই পড়েছি তা নকল করার জন্য গোটো ব্যবহার করতে বলেছে, তবে এটি আমার পক্ষে ভাল সমাধানের মতো শোনাচ্ছে না।


2
সি # গোটো সমর্থন করে, কিন্তু পতন নয়? কি দারুন. এবং এটি কেবল তাদেরই নয়। সি # হ'ল একমাত্র ভাষা যা আমি জানি এটি এইরকম আচরণ করে।
ম্যাথু শার্লে 13

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

এটি আমার মতে বিশাল চুক্তি নয়। 99% সময় আমি পড়তে চাই না এবং অতীতে আমি বাগ দ্বারা জ্বালিয়ে দিয়েছি।
কেন

1
"এটি আমার পক্ষে ভাল সমাধানের মতো শোনায় না" - আপনার সম্পর্কে এটি শুনে দুঃখিত, কারণ এটাই তার goto caseজন্য। পতনের ক্ষেত্রে এর সুবিধাটি এটি স্পষ্ট। এখানে কিছু লোক goto caseকেবল দেখানোর জন্য আপত্তি জানায় যে তারা এই বিষয়টির কোনও বোঝাপড়া না করেই "গোটো" এর বিরুদ্ধে প্ররোচিত হয়েছিল এবং তারা নিজেরাই চিন্তা করতে অক্ষম। ডিজকસ્ત્રা যখন "জিওটিও বিবেচিত ক্ষতিকারক" লিখেছিলেন, তখন তিনি এমন ভাষাগুলিকে সম্বোধন করছিলেন যেগুলির নিয়ন্ত্রণ প্রবাহ পরিবর্তনের অন্য কোনও উপায় ছিল না।
জিম বাল্টার

@ জিমবাল্টার এবং তারপরে কতজন লোক এই বিষয়ে ডিজকস্ট্রার উদ্ধৃতি দিয়ে নথকে উদ্ধৃত করবেন যে "অকালীন অপটিমাইজেশন সমস্ত মন্দের মূল" যদিও এই উক্তিটি যখন নূট স্পষ্টতই লিখেছিলেন যে gotoকোডটি অনুকূলিত করার সময় কীভাবে কার্যকর হতে পারে?
জন হান্না

1

আপনি গিটো কীওয়ার্ড দ্বারা সি ++ এর মতো পড়তে পারবেন।

গো EX:

switch(num)
{
   case 1:
      goto case 3;
   case 2:
      goto case 3;
   case 3:
      //do something
      break;
   case 4:
      //do something else
      break;
   case default:
      break;
}

9
দু'বছর আগে যদি কেউ পোস্ট করত!

0

একটি কেস স্টেটমেন্ট যেমন একটি বিরতির মতো প্রতিটি কেস ব্লকের পরে আবশ্যক, এটি শেষের ব্লক সহ কেস স্টেটমেন্ট বা ডিফল্ট বিবৃতি। একটি ব্যতিক্রম (সি ++ স্যুইচ স্টেটমেন্টের বিপরীতে) সহ, সি # একটি কেস লেবেল থেকে অন্য কেস থেকে অন্তর্ভুক্ত পতনকে সমর্থন করে না। একটি ব্যতিক্রম হ'ল যদি কেস স্টেটমেন্টের কোনও কোড থাকে।

- সি # স্যুইচ () ডকুমেন্টেশন


1
আমি বুঝতে পারি যে এই আচরণটি নথিভুক্ত রয়েছে, আমি জানতে চাই যে এটি কেন হয় এবং পুরানো আচরণটি পেতে কোনও বিকল্প।
ম্যাথু শার্লে 13

0

প্রতিটি কেস স্টেটমেন্টের পরে ব্রেক বা গোটো স্টেটমেন্টের প্রয়োজন হয় এমনকি এটি ডিফল্ট কেস হলেও।


2
দু'বছর আগে যদি কেউ পোস্ট করত!

1
@ পোল্ডি এটি প্রথমবারের মতো মজার ছিল ... শিল্পা আপনার প্রতিটি কোডের জন্য নিজের বিরতি বা গোটো দরকার না, কেবল প্রতিটি ক্ষেত্রে তার নিজস্ব কোড সহ। আপনার একাধিক কেস থাকতে পারে যা কোড ভাগ করে দেয়।
ম্যাভেরিক

0

মাত্র একটি দ্রুত নোট যোগ করার জন্য যে জামারিনের সংকলকটি আসলে এটি ভুল পেয়েছে এবং এটি পতনের জন্য অনুমতি দেয়। এটি অনুমান করা হয়েছে ঠিক করা হয়েছে, কিন্তু মুক্তি দেওয়া হয়নি। এটি এমন কোনও কোডে আবিষ্কার করা হয়েছে যা প্রকৃতপক্ষে পড়ছিল এবং সংকলকটি অভিযোগ করেনি।


0

স্যুইচ (সি # রেফারেন্স) বলে

সি # এর জন্য চূড়ান্ত বিভাগ সহ স্যুইচ বিভাগগুলির সমাপ্তি প্রয়োজন,

সুতরাং break;আপনার নিজের defaultবিভাগেও একটি যুক্ত করা দরকার , অন্যথায় এখনও একটি সংকলক ত্রুটি থাকবে।



-1

সি # সুইচ / কেস স্টেটমেন্টগুলির সাহায্যে পতনকে সমর্থন করে না। নিশ্চিত নয় কেন, তবে এটির পক্ষে আসলে কোনও সমর্থন নেই। লিঙ্কেজ


এটি খুব ভূল. অন্যান্য উত্তরগুলি দেখুন ... একটি অন্তর্নিহিত পতনের প্রভাব স্পষ্টতই পাওয়া যেতে পারে goto case। এটি সি # ডিজাইনারদের দ্বারা ইচ্ছাকৃত, বুদ্ধিমান ডিজাইনের পছন্দ ছিল।
জিম বাল্টার

-11

আপনি "বিরতি" যুক্ত করতে ভুলে গেছেন; কেস ইন স্টেটমেন্ট 3 কেস 2 ক্ষেত্রে আপনি এটি ব্লকে লিখেছিলেন। অতএব এটি চেষ্টা করুন:

case 3:            
{
    ans += string.Format("{0} hundred and ", numbers[number / 100]);
    break;
}


case 2:            
{
    int t = (number / 10) % 10;            
    if (t == 1)            
    {                
        ans += teens[number % 10];                
    }            
    else if (t > 1)                
    {
        ans += string.Format("{0}-", tens[t]);        
    }
    break;
}

case 1:            
{
    int o = number % 10;            
    ans += numbers[o];            
    break;        
}

default:            
{
    throw new ArgumentException("number");
}

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

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