Иди на текст

Пренос параметара метода по вредности и референци

Креирање и позивање метода са преносом параметара по вредности и по референци су кључни концепти у програмирању у програмском језику C#. Ови концепти утичу на то како се подаци прослеђују методама и како их те методе могу мењати.

Пренос параметара по вредности

Када се параметар преноси по вредности, метода добија копију вредности параметра. Промене направљене у методи не утичу на оригинални податак.

class Program
{
    static void Inkrement(int num)
    {
        num++;
    }

    static void Main()
    {
        int x = 1;
        Inkrement(x);
        Console.WriteLine(x);    // 1
    }
}

У овом примеру, променљива x се методи Inkrement преноси по вредности, што значи да промена вредности унутар методе не утиче на оригиналну променљиву x.

Пренос параметара по референци

Када се параметар преноси по референци, метода добија референцу на оригинални податак, па зато промене направљене у методи утичу на оригинални податак.

class Program
{
    static void Inkrement(ref int num)
    {
        num++;
    }

    static void Main()
    {
        int x = 1;
        Inkrement(ref x);
        Console.WriteLine(x);    // 2
    }
}

У овом примеру, променљива x се методи Inkrement преноси по референци, користећи кључну реч ref. То значи да промена вредности унутар методе утиче на оригиналну променљиву x. Слично, у програмском језику C уместо кључне речи ref, користио би адресни оператор &x у позиву функције и показивачку променљиву int *num као параметар функције.

Значи, када се подаци преносе по вредности, променљива се копира и промене унутар методе не утичу на оригиналну променљиву. Када се подаци преносе по референци, променљива се не копира, већ се метода позива са референцом на оригиналну променљиву и промене унутар методе утичу на оригиналну променљиву.

Параметар out

Кључна реч out омогућава методи да врати више вредности. Променљива која се прослеђује као out не мора бити иницијализована пре позива метода, али метод мора да јој додели вредност пре него што се врати. На пример:

using System;

public class Osoba
{
    public void Podaci(out string ime, out int godine)
    {
        ime = "Velimir Radlovacki";
        godine = 17;
    }
}

class Program
{

    static void Main()
    {
        string imeOsobe;
        int godineOsobe;
        Osoba o = new Osoba();
        o.Podaci(out imeOsobe, out godineOsobe);
        Console.WriteLine(imeOsobe);                  // Velimir Radlovacki
        Console.WriteLine(godineOsobe.ToString());    // 17
    }
}