"রিটার্ন" সি # ফেরতের ধরণ কী [বন্ধ]


9

আমি একটি কনসোল অ্যাপ্লিকেশন তৈরি করছি এবং আমার একটি "মেনু" রয়েছে যেখানে ব্যবহারকারী একটি নতুন ব্যক্তি অবজেক্ট তৈরি করতে তথ্য প্রবেশ করতে পারে। নিম্নলিখিতটি একটি পদ্ধতির ভিতরে রয়েছে।

        Write("Please enter the first name: ", false);
        string fName = Console.ReadLine().ToUpper();
        Write("Please enter the middle initial: ", false);
        string mInitial = Console.ReadLine().ToUpper();
        Write("Please enter the last name: ", false);
        string lName = Console.ReadLine().ToUpper();

তাই ভালো. আমি চাই যে ব্যবহারকারী কোনও নতুন ব্যক্তি বানাতে চান না তা স্থির করে যদি তারা যেকোনো সময় পদ্ধতি থেকে প্রস্থান করতে সক্ষম হয়। সুতরাং আমি "চেকএক্সিট" নামে একটি নতুন পদ্ধতি তৈরি করতে চাই এবং তারা "এক্সিট" টাইপ করলে এটি "ক্রিয়েটপারসন" পদ্ধতিটি ছেড়ে যাবে। সুতরাং আমি "চেকএক্সিট" একটি রিটার্ন ফিরিয়ে আনতে চাই। অন্যথায় আমাকে প্রতিটি ইনপুট পরে একটি "if" স্টেটমেন্ট যুক্ত করতে হবে এবং তা গোলমাল-ওয়াই হয়ে যায়।

এটা কি সম্ভব? রিটার্নের কি রিটার্ন টাইপ থাকে? এটি করার উপযুক্ত উপায় কী হবে?


এই নোটটিতে আমি জানিনা এমনকি যদি কোনও আইফির ভিতরে থেকে কোনও রিটার্ন যদি কেবল বিবৃতিতে প্রস্থান করে তবেই তা হবে। আমি একটি গোটো ব্যবহার করতে হতে পারে। যাইহোক এটি বিন্দু ছাড়াও
আরকিরিস

তবে আপনি প্রোগ্রামটি শেষ করতে চান বা নতুন ব্যক্তিকে রুটিন বানানো শেষ করতে চান?
ডিসিজি

একজন নতুন ব্যক্তিকে রুটিন বানানো শেষ করুন। মূলত শুধু একটি মেনুতে যান lvl। তবে আমি প্রতিটি প্রবেশের পরে এটি করতে চাই না। if (fname == "EXIT") so কনসোল.ওরাইট ("আপনি কি সত্যিই এই মেনুটি ছেড়ে যেতে চান?"); Console.ReadLine (); আসতে; }
আরকিরিস

1
আপনি throw exceptionপদ্ধতিতে এবং এর returnসাথে করতে পারেনcatch
দিমিত্রি বাইচেনকো

উত্তর:


8

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

// you can put these queries somewhere outside the function
string[] queries = {"Please enter the first name: ", ...}
var results = new List<string>();

foreach (string query in queries) {
    Write(query, false);
    var result = Console.ReadLine().ToUpper();
    if (result.Equals("EXIT") {
        return;
    }
    results.Add(result);
}

// handle your inputs from the results list here ...

7
এটি বেশি পঠনযোগ্য নয়।
ব্যবহারকারী 253751

এটি জাভাস্ক্রিপ্টের মতো দেখাচ্ছে, সি # নয়।
ouflak

@ আউটফ্লাক মাইক্রোসফ্ট সি # অলম্যান স্টাইল ব্যবহার করে তবে মনো সি সি জাভা স্ক্রিপ্ট দ্বারা ব্যবহৃত জাভা স্টাইল ব্যবহার করে।
এলোআইএসডিজি

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

2
@ ব্যবহারকারী 253751 একটি অত্যন্ত সন্দেহজনক মেট্রিক যা কয়েক দশক আগে ব্যবহারের বাইরে এসেছিল এবং ভাল কারণে good
স্ট্যাকওভারথ্রো

7

আপনি এই প্রক্রিয়াটি স্বয়ংক্রিয় করতে কনসোল থেকে পড়ার জন্য একটি পদ্ধতি তৈরি করতে পারেন, এরকম কিছু

internal class StopCreatingPersonException : Exception
{}

public static string ReadFromConsole(string prompt)
{
     Write(prompt, false);
     var v = Console.ReadLine().ToUpper();
     if (v == "EXIT") { throw new StopCreatingPerson (); }
     return v;
}

তাহলে আপনার কোডটি দেখতে এমন হবে:

try {
    string fName = ReadFromConsole("Please enter the first name: ");
    ....
}
catch (StopCreatingPersonException)
{ }

2
আকর্ষণীয় আমি নিজের ব্যতিক্রমগুলি তৈরি করতে অসচেতন ছিলাম। আমি এই সম্পর্কে আরও শিখতে হবে আপনাকে ধন্যবাদ।
আরকিরিস

কায়ুসজার্ড শেষ হয়েছে! লক্ষ করার জন্য ধন্যবাদ, এটি একটি ভাল অনুশীলন।
ডিসিজি

কায়ুসজার্ড হ্যাঁ, এটি ভাল হবে, আমি সম্পাদনা করব। ধন্যবাদ
ডিসিজি

1
@ আরকিরিস এটি বিশেষত আপনার নিজস্ব ব্যতিক্রম হতে হবে না; এই কৌশলটি কেবল এটি বলে throw new Exception()এবং ধরা দিয়েও ভাল কাজ করবে। ফ্রেমওয়ার্কটিতে একটি অপারেশন-ক্যান্সেলড এক্সসেপশনও রয়েছে যার নাম সম্ভবত আপনি যা করার চেষ্টা করছেন সেটি মাপসই করে এবং ব্যবহার করার জন্য বোধ করতে পারে। সাধারণত আমরা বিভিন্ন ব্যাতিক্রমের প্রকারগুলি ছুঁড়ে ফেলি যাতে আমরা কিছুকে ধরতে পার্থক্য করতে পারি এবং অন্যকে না, তবে মূলত একটি উপ পদ্ধতির জন্য বাইরের পদ্ধতির রিটার্ন করার একমাত্র উপায় হ'ল সাব পদ্ধতিটি ছুঁড়ে ফেলা, বাইরেরটি ধরা না রাখা এবং তারপরে রিটার্ন নিয়ন্ত্রণ করা বাইরের / একটি "রিটার্ন রিটার্ন" এর উপরে পদ্ধতিতে
Caius Jard

1
@dgg প্রবাহ নিয়ন্ত্রণের জন্য ব্যতিক্রম ব্যবহার করবেন না এবং এটির প্রয়োজনীয়তা না থাকলে ব্যতিক্রম ক্লাসগুলি তৈরি করবেন না । অন্যদিকে, আমি আরও খারাপ দেখেছি; আমি কোড বজায় রাখছি যেখানে একটি অনুমিত সিনিয়র বিকাশকারী নিয়ন্ত্রিত প্রোগ্রামগুলি ত্রুটি বার্তাগুলির দ্বারা পৃথকভাবে টাইপ করা ব্যতিক্রম সহ প্রবাহিত হয়।
স্ট্যাকওভারথ্রো

1

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

উদাহরণস্বরূপ, নিম্নলিখিত পদ্ধতিটি রিটার্ন টাইপ হিসাবে একটি স্ট্রিং ব্যবহার করে,

public string ReturnString() { return "thisString"; }

আপনি যদি এমন কোনও পদ্ধতি লিখছেন যা অবজেক্টটি তৈরি করে এবং কলিং পদ্ধতিতে এটি ফিরিয়ে দেয়, তবে রিটার্নের ধরণটি ব্যক্তি হবে (যদি আপনি অন্য কিছু করার ইচ্ছা না করেন)। আপনি যদি ব্যবহারকারী ইনপুটটি পরীক্ষা করেন এবং কোনও ব্যক্তি তৈরি না করার সিদ্ধান্ত নেন তবে আপনি এটি ব্যবহার করতে পারেন return null;

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Initial { get; set; }
}

public static Person CreatePerson()
{
    Person person = new Person();
    Console.Write("Please enter the first name: ", false);
    string fName = Console.ReadLine().ToUpper();
    if (string.IsNullOrEmpty(fName) || fName.ToLower().Equals("exit"))
        return null;
    person.FirstName = fName;

    Console.Write("Please enter the middle initial: ", false);
    string mInitial = Console.ReadLine().ToUpper();
    if (string.IsNullOrEmpty(mInitial) || mInitial.ToLower().Equals("exit"))
        return null;
    person.Initial = mInitial;

    Console.Write("Please enter the last name: ", false);
    string lName = Console.ReadLine().ToUpper();
    if (string.IsNullOrEmpty(lName) || lName.ToLower().Equals("exit"))
        return null;
    person.LastName = lName;

    return person;
}

এবং আপনি এই পদ্ধতিটি মেইনে ব্যবহার করতে পারেন,

public static void Main(string[] args) 
{
    Person person = CreatePerson();
    if (person == null) {
       Console.WriteLine("User Exited.");
    }
    else
    {
       // Do Something with person.
    }
}

তাদের এখনও সবকিছু প্রবেশের জন্য সময় নিতে হবে, তাই না?
আরকিরিস

যদি তারা যে কোনও সময় প্রস্থান করতে টাইপ করে, এটি বন্ধ হয়ে যায়। প্রত্যাবর্তনের অর্থ, পদ্ধতিটি এখনই ছেড়ে দিন CreatePerson
জাওয়াদ

0

returnআপনি যদি পদ্ধতিটি শেষ করতে চান তবে একমাত্র উপায় । তবে আপনি নিজের কোডটি কিছুটা ছোট করতে পারেন:

    static void Main(string[] args)
    {
        createPerson();

        Console.WriteLine("Some display goes here...");
    }

    static void createPerson()
    {
        Console.WriteLine("Please enter the first name: ");
        string fName = getInput();
        if (isExit(fName))
        {
            return;
        }

        Console.WriteLine("Please enter the middle initial: ");
        string mInitial = getInput();
        if (isExit(mInitial))
        {
            return;
        }

        Console.WriteLine("Please enter the last name: ");
        string lName = getInput();
        if (isExit(lName))
        {
            return;
        }
    }

    static string getInput()
    {
        return Console.ReadLine().ToUpper();
    }

    static bool isExit(string value)
    {
        if (value == "EXIT")
        {
            Console.WriteLine("Create person has been canceled by the user.");
            return true;
        }
        return false;
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.