návratová hodnota volané metody   zodpovězená otázka

C#

Určitě to je hovadina, ale nějak si s tím neumím poradit.

Z metody main v konzolové aplikaci volám metodu jiné třídy s parametrem. Ta mi má vrátit hodnotu, ale nevrátí ... zůstává mi tam ten parametr.

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string text = "slovo1";

            Class1 step = new Class1();
            step.Step(text);
            Console.WriteLine(text);
            Console.ReadLine();
        }
    }
}

namespace ConsoleApplication1
{
    public class Class1
    {
        public string Step(string word)
        {
            word = "slovo2";
            
            return word;
        }
    }
}

Na výstupu mám vždycky slovo1.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

To je ale přeci naprosto jasné,ždy vypisujete na consoly proměnou "text",která má hodnotu "slovo1".Naučte se základy OOP a budete vědět v čem je problém,nemá cenu radit,když nevíte oč jde

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

No, základy OOP bych měl mít už zvládnuté, ale když to člověk nepoužívá, rychle zapomene. A to bude můj případ. Už mi je jasné, kde se stala ta hovadina.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To jsem rád,tohle je opravdu začátečnické ;-)) Kdyby Vám to ani tak nešlo,tak napište;-)

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

Vy se zase naučte základy programování obecně (a to OOP, se kterým to nemá vůbec nic společného také). To co chce udělat autor dotazu samozřejmě možné je (jak ve VB tak v C#):

class Program
{
  static void Main(string[] args)
  {
    string text = "slovo1";
    Class1 step = new Class1();
    step.Step(ref text);
    Console.WriteLine(text);
    Console.ReadLine();
  }
}
public class Class1
{
  public string Step(ref string word)
  {
    word = "slovo2";
    return word;
  }
}

Takže hodnotu lze vracet buď přímým voláním funkce (běžný způsob), nebo nastavením předaného argumentu (hodí se ve specifických situacích).

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

O jaké specifické situace například jde?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Stačí se podívat napříč .NET Frameworkem, tam je to k vidění plus mínus na místech, kde se to má používat.

Např. metoda int.Parse bere jako parametr string a vrací přes klasické return číslo int. Pokud daný řetězec není číslo, tak vyhodí výjimku.

Existuje ale i metoda int.TryParse, která nehází výjimku, ale vrací True/False, jestli se ten text dá převést na číslo nebo ne. A protože ona vlastně potřebuje vráti dvě hodnoty (jestli se to povedlo, a případně číselnou hodnotu), tak tu číselnou hodnotu vrací přes parametr předávaný referencí.

V C# to volání vypadá asi takto:

int vysledek;
if (int.TryParse("123456", out vysledek)) 
{
    // podařilo se naparsovat, výsledná hodnota je v proměnné vysledek
}
else 
{
    // zadaný text není číslo
}

Ve většině případů stačí jedna návratová hodnota. Když jich ale ptořebujete víc a nechcete vracet objekt (třeba u takovéhoto příkladu by to bylo zbytečné), můžete použít předávání referencí (tedy ref nebo out, rozdíl je akorát v tom, že když použijete ref, proměnná musí být inicializovaná - tedy musel byste do ní před zavoláním té funkce TryParse něco přiřadit; out tohle nevyžaduje).

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Super,děkuji za vysvětlení.Abych řekl pravdu,tak již nějaký čas programuji(ne profesionálně) a ještě jsem takovou syntaxi nepoužil..Tedy i proto,že jsem zatim takovou situaci neřešil nebo o tom alespon nevím.Nicméně je dobré o ní vědět...ještě jednou děkuji za perfektní vysvětlení

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Problém je v tom, že ta funkce vám vrací nový řetězec, ale vy ji zavoláte jako proceduru a návratovou hodnotu nikam neposíláte.

Parametry se standardně do funkce předávají hodnotou a ne referencí, takže pokud do parametru uvnitř funkce přiřadíte něco jiného, navenek se to neprojeví.

Objekty se také předávají hodnotou, ale hodnotou je tady míněna reference na objekt na haldě. Pokud byste si do funkce předal třeba objekt MyClass a uvnitř funkce mu měnil nějaké vlastnosti, pak by se to projevilo i venku. Ale pokud do parametru přiřadíte úplně jiný objekt, tak to venku vidět nebude.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback