Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
ZveřejnilKlára Pavlíková
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: 1 2 3 4 5
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: 123 2 3 4 1024 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,… www.wikipedia.com Seriály o programování v jazyce C# : www.živě.cz www.java2s.com www.functionx.com www.csharp-station.com www.msdn.com www.bytes.com www.c-sharpcorner.com
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.