"Dönüş" dönüş türü nedir C # [kapalı]


9

Bir konsol uygulaması yapıyorum ve kullanıcının yeni bir Person nesnesi oluşturmak için bilgi girebileceği bir "Menü" var. Aşağıdaki bir yöntemin içindedir.

        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();

böyle. Yeni bir kişi yapmak istemediklerine karar verirse kullanıcının istediği zaman yöntemden çıkabilmesini istiyorum. Bu yüzden "CheckExit" adında yeni bir yöntem yapmak istiyorum ve "EXIT" yazarlarsa, "CreatePerson" yöntemini bırakacaklardır. Bu yüzden bir dönüş döndürmek için "CheckExit" istiyorum. Aksi takdirde her girdiden sonra bir "if" deyimi eklemek zorunda ve bu dağınıklık-y alır.

Mümkün mü? Geri dönüşün bir dönüş türü var mı? Bunu yapmanın uygun yolu ne olurdu?


Bu notta ben bile bir if içeriden bir dönüş sadece if deyimi çıkmak işe yaramazsa bilmiyorum. Bir go kullanmak zorunda kalabilirim. Her iki durumda da bu
Arkyris

Ama programı sonlandırmak mı yoksa yeni kişiyi rutin yapmak mı istiyorsunuz?
dcg

Yeni bir insan rutini yapmaya son verin. Temelde sadece bir menü lvl yukarı gidin. Ama bunu her girişten sonra yapmak istemiyorum. if (fname == "EXIT") {Console.Write ("Bu menüden gerçekten çıkmak istiyor musunuz?"); Console.ReadLine (); dönüş; }
Arkyris

1
Şunları yapabilirsiniz throw exceptionyönteminde ve returnkarşılık gelencatch
Dmitry Bychenko

Yanıtlar:


8

returndöndürebileceğiniz bir tür değil, bir sonuç döndürmek için kullanılan bir anahtar kelime. Ne yazık ki yapmaya çalıştığınız şey mümkün değil. Ancak, bir dizi sorgu kullanarak ve bir döngünün her biri için sonuçları alarak kodunuzu çok daha okunabilir ve genişletilebilir yapabilirsiniz. Bu, daha fazla sorgu kolaylıkla ekleyebilme avantajına sahiptir.

// 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
Bu daha okunaklı değil.
user253751

Bu Javascript'e benziyor, C # değil.
ouflak

@outflak Microsoft C #, Allman stilini kullanır, ancak Mono C #, JavaScript tarafından kullanılan Java stilini de kullanır.
aloisdg moving to codidact.com

2
@ user253751 Daha fazla yanlış olamazdınız. Bu yanıttaki kod, yanıtlayıcının doğru bir şekilde açıklanması nedeniyle OP kodundan çok daha basittir. Ve doğruluktan sonraki ilk endişe olarak okunabilirlik ve sürdürülebilirliğin güçlü bir savunucusuyum.
StackOverthrow

2
@ user253751 On yıllar önce kullanım dışı kalan ve iyi bir nedenle son derece şüpheli bir ölçüm .
StackOverthrow

7

Bu işlemi otomatikleştirmek için konsoldan okumak için bir yöntem oluşturabilirsiniz.

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;
}

Sonra kodunuz şöyle görünecektir:

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

2
İlginçtir Kendi istisnalarımı yaratmanın farkında değildim. Bu teşekkür hakkında daha fazla şey öğreneceğim.
Arkyris

@CaiusJard bitti! Dikkat çektiğiniz için teşekkürler, bu iyi bir uygulamadır.
dcg

@CaiusJard evet, daha iyi olurdu, ben düzenleyeceğim. Teşekkürler
dcg

1
@Arkyris özel olarak kendi istisnanız olmak zorunda değildir; bu teknik, sadece söyleyerek throw new Exception()ve yakalayarak bile iyi çalışır . Çerçevede, adı belki de yapmaya çalıştığınız şeye uyan ve kullanımı mantıklı olabilecek bir OperationCanceledException vardır. Genellikle farklı İstisna türlerini atarız, böylece başkalarını değil bazılarını yakalamayı ayırt edebiliriz, ancak özünde bir alt yöntemin bir dış yöntem dönüşü yapmasının tek yolu, alt yöntemin atması, dışın yakalanmaması ve daha sonra kontrolün kontrol edilmesidir. dış / a "dönüş getirisi" üzerindeki yönteme
başvurunuz

1
@dgg Akış denetimi için istisnalar kullanmayın ve gerçekten gerekli olmadıkça istisna sınıfları oluşturmayın . Öte yandan, daha da kötü gördüm; Ben hata mesajları tarafından ayırt dize yazılan istisnalar sözde üst düzey geliştirici kontrollü program akış kodunu koruyorum.
StackOverthrow

1

Dönüş ifadeleri, dönüş türüne sahip bir yöntemden bir değer döndürmek için kullanılır. Dönüş türü olarak void olan bir yöntem yazdığınızda, yöntemden return;çıkmak için.

örneğin, aşağıdaki yöntemde dönüş türü olarak bir dize kullanılır,

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

Nesneyi oluşturan ve çağıran yönteme döndüren bir yöntem yazıyorsanız, dönüş türü Kişi olur (başka bir şey yapmayı düşünmüyorsanız). Kullanıcı girişini kontrol edip Kişi oluşturmamaya karar verirseniz kullanabilirsiniz 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;
}

Ve bu yöntemi Main'de kullanabilirsiniz,

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

Yine de her şeye girmek için zaman ayırmak zorunda kalacaklardı, değil mi?
Arkyris

herhangi bir zamanda çıkış yazarlarsa, durur. dönüş, yöntemi CreatePersonhemen terk anlamına gelir .
Jawad

0

Tek returnyöntem yöntemi sonlandırmak istiyorsanız kullanmaktır . Ancak kodunuzu şöyle bir şey kısaltabilirsiniz:

    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;
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.