Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

C# - předávání parametrů Centrum pro virtuální a moderní metody a formy vzdělávání na Obchodní akademii T.G. Masaryka, Kostelec nad Orlicí.

Podobné prezentace


Prezentace na téma: "C# - předávání parametrů Centrum pro virtuální a moderní metody a formy vzdělávání na Obchodní akademii T.G. Masaryka, Kostelec nad Orlicí."— Transkript prezentace:

1 C# - předávání parametrů Centrum pro virtuální a moderní metody a formy vzdělávání na Obchodní akademii T.G. Masaryka, Kostelec nad Orlicí

2 Možnosti předávání parametrů V C# je možné předávat parametry jak hodnotou tak odkazem (referencí) Předávání odkazem umožňuje metodám pracovat s odkazem na konkrétní proměnnou, objekt a pracovat s přímo s jejím obsahem – „při práci s parametrem měníme originál“ Pokud chceme předávat parametr referencí budeme potřebovat klíčové slovo ref nebo out

3 Předávání parametrů hodnotového typu hodnotou (by value) – odhadněte výstup programu using System; class PassingValByVal { static void Ctverec(int x) // Parametr x je předáván hodnotou. Změny //hodnoty parametru x se nedotknou hodnoty myInt. { x *= x; Console.WriteLine(„Hodnota uvnitř metody: {0}", x); } public static void Main() { int myInt = 5; Console.WriteLine(„Hodnota před zavoláním metody: {0}", myInt); Ctverec(myInt); // Předání hodnoty v proměnné myInt hodnotou. Console.WriteLine(„Hodnota po zavolání metody: {0}", myInt); }

4 Odpověď Hodnota před voláním metody: 5 Hodnota uvnitř metody: 25 Hodnota po zavolání metody: 5

5 Předávání parametrů hodnotového typu odkazem (by reference) – odhadněte výstup programu using System; class PassingValByRef { static void Ctverec(ref int x) { // Parametr x je předán odkazem. Změny x // ovlivní původní proměnnou myInt. x *= x; Console.WriteLine(„Hodnota uvnitř metody : {0}", x); } public static void Main() { int myInt = 5; Console.WriteLine(„Hodnota před zavoláním metody: {0}", myInt); Ctverec(ref myInt); // Předání myInt odkazem. Console.WriteLine(„Hodnota po zavolání metody: {0}", myInt); }

6 Odpověď Hodnota před zavoláním metody: 5 Hodnota uvnitř metody: 25 Hodnota po zavolání metody: 25

7 Předávání parametrů referenčního typu hodnotou (by value) – odhadněte výstup programu using System; class PassingRefByVal { static void Change(int[] arr) { arr[0]=888; // Toto ovlivní originální hodnotu. arr = new int[5] {-3, -1, -2, -3, -4}; // Tato změna je lokální. Console.WriteLine(„Uvnitř metody, první element je: {0}", arr[0]); } public static void Main() { int[] myArray = {1,4,5}; Console.WriteLine(„Uvnitř Main, před voláním metody, první prvek je: {0}", myArray [0]); Change(myArray); Console.WriteLine(„Uvnitř Main, po volání metody, první prvek je: {0}", myArray [0]); }

8 Odpověď Uvnitř Main, před voláním methody, první prvek je: 1 Uvnitř metody, první prvek je: -3 Uvnitř Main, po volání methody, první prvek je: 888

9 Předávání parametrů referenčního typu odkazem (by reference) – odhadněte výstup programu using System; class PassingRefByRef { static void Change(ref int[] arr) { arr[0]=888; //tyto operace ovlivní prvky předaného pole arr = new int[5] {-3, -1, -2, -3, -4}; Console.WriteLine(„Uvnitř metody, první prvek je: {0}", arr[0]); } public static void Main() { int[] myArray = {1,4,5}; Console.WriteLine(„Uvnitř Main, před voláním metody, první prvek je: {0}", myArray [0]); Change(ref myArray); Console.WriteLine(„Uvnitř Main, po volání methody, první prvek je: {0}", myArray [0]); }

10 Odpověď Uvnitř Main, před voláním metody, první prvek je: 1 Uvnitř metody, první prvek je: -3 Uvnitř Main, po volání metody, první prvek je: -3

11 Úkol Napište program s jednou metodou SwapStrings, která bude mít dva parametry předané odkazem a provede záměnu dvou stringových řetězců.

12 Výstupní parametry – output parameters Použijeme klíčové slovo out Toto klíčové slovo u parametru znamená, že parametr odkazuje na tu proměnnou, která byla do metody poslána jako parametr. Všechny změny provedené u tohoto parametru budou reflektovány do proměnných i po návratu do volající metody. Používá se u metod u kterých je potřeba vracet více hodnot. Metoda s out parametry může stále používat pro návrat hodnoty klíčové slovo return Proměnná předaná jako out parametr nemusí být inicializována, k nastavení hodnoty ale musí dojít uvnitř funkce Při použití out parametru je předávána reference ne hodnota !!!

13 Out Parameters – příklad Odhadněte výsledek následující funkce using System; public class MyClass { public static int TestOut(out char i) { i = 'b'; return -1; } public static void Main() { char i; // proměnná nemusí být inicializována Console.WriteLine(TestOut(out i)); Console.WriteLine(i); }

14 Rozdíl mezi out a ref předáním parametrů Out parametry musí být definovány před použitím ve volané funkci např.: Ref parametry musí být definovány před použitím ve volané funkci např.: public static void MyMethod(out int[] arr) { arr = new int[10]; // jednoznačné přiřazení arr } public static void MyMethod(ref int[] arr) { arr = new int[10]; // arr inicializováno na jiné pole }

15 Příklad použití Out parametrů Zdrojový kód using System; class TestOut { static public void FillArray(out int[] myArray) { // Inicializuji pole: myArray = new int[5] {1, 2, 3, 4, 5}; } static public void Main() { int[] myArray; // Inicializace není potřebná // Předání parametru pole funkci s použitím out: FillArray(out myArray); // Zobrazím prvky pole: Console.WriteLine(„Prvky pole :"); for (int i=0; i < myArray.Length; i++) Console.WriteLine(myArray[i]); } Výstup ?

16 Příklad použití Out parametrů Zdrojový kód using System; class TestOut { static public void FillArray(out int[] myArray) { // Inicializuji pole: myArray = new int[5] {1, 2, 3, 4, 5}; } static public void Main() { int[] myArray; // Inicializace není potřebná // Předání parametru pole funkci s použitím out: FillArray(out myArray); // Zobrazím prvky pole: Console.WriteLine(„Prvky pole jsou:"); for (int i=0; i < myArray.Length; i++) Console.WriteLine(myArray[i]); } Výstup Prvky pole:

17 Příklad použití Ref parametrů Zdrojový kód using System; class TestRef { static public void FillArray(ref int[] myArray) { // Pokud pole není vytvořené vytvořím ho: if (arr == null) arr = new int[10]; // Pokud je vytvořené naplním ho: arr[0] = 123; arr[4] = 1024; } static public void Main() { int[] myArray = {1,2,3,4,5}; // Inicializace // Předání parametru pole funkci s použitím ref: FillArray(ref myArray); // Zobrazím prvky pole: Console.WriteLine(„Prvky pole :"); for (int i=0; i < myArray.Length; i++) Console.WriteLine(myArray[i]); } Výstup ?

18 Příklad použití Ref parametrů Zdrojový kódVýstup Prvky pole: using System; class TestRef { static public void FillArray(ref int[] myArray) { // Pokud pole není vytvořené vytvořím ho: if (arr == null) arr = new int[10]; // Pokud je vytvořené naplním ho: arr[0] = 123; arr[4] = 1024; } static public void Main() { int[] myArray = {1,2,3,4,5}; // Inicializace // Předání parametru pole funkci s použitím ref: FillArray(ref myArray); // Zobrazím prvky pole: Console.WriteLine(„Prvky pole :"); for (int i=0; i < myArray.Length; i++) Console.WriteLine(myArray[i]); }

19 Úkol Vytvořte program, který bude obsahovat dvě globální proměnné global_x, global_y. Vytvořte funkci na sčítání dvou čísel secti_a_inkrementuj_val(int param_x, param_y) a funkci secti_a_inkrementuj_ref(ref int param_x, ref int param_y). Obě funkce budou volány z funkce Main a jako parametry do nich budou vstupovat naše globální proměnné. Funkce pouze sečtou hodnoty parametrů a zvýší jejich hodnotu o jedničku. Pomocí nástroje ladění kontrolujte chování hodnot v průběhu Vaší aplikace. Jednotlivé změny hodnot vypište s příslušným komentářem na konzoli.

20 20 Centrum pro virtuální a moderní metody a formy vzdělávání na Obchodní akademii T.G. Masaryka, Kostelec nad Orlicí Použité materiály: Kniha: Programujeme profesionálně, nakladatelství WROX, autor: Jay Glynn,… Seriály o programování v jazyce C# :


Stáhnout ppt "C# - předávání parametrů Centrum pro virtuální a moderní metody a formy vzdělávání na Obchodní akademii T.G. Masaryka, Kostelec nad Orlicí."

Podobné prezentace


Reklamy Google