Jump to content

Програмирање - лекција бр. 1

Оцени ову тему


Препоручена порука

Kada stavite 'ref' to kompjuteru kaze da rezultat stavi upravo na ono mesto u memoriji gde je inicijalni podatak bio zapisan.

Ovo ce proslediti/iskopirati bas broj 5:

int val = 5;

method(val);

A ovo ce proslediti neku memorijsku adresu gde se nalazi bas taj broj 5:

int val = 5;

method(ref val);

A kompajler nam omogucava da ne moramo da se bakcemo cinjenicom da je to memorijska adresa (sto bi inace moralo recimo u C, C++).

 

Link to comment
Подели на овим сајтовима

Pitanje:

Razumem da je u zadatku autor hteo da nam objasni kako radi ref. Ali da li mozes @Grizzly Adams da to objasnis sa malo konkretnijim primerom u kome mozemo da vidimo kad to uopste treba da koristimo u praksi, to jest gde ne bismo mogli da koristimo klasican return? Meni ovo ispod ima 100 puta vise smisla nego da koristim void funkciju i ref:

static void Main(string[] args)
{
    int number = 20;
    number = AddFive(number);
    Console.WriteLine(number);
    Console.ReadKey();
}

static int AddFive(int number)
{
    return (number + 5);
}

 

Link to comment
Подели на овим сајтовима

пре 5 минута, uros рече

Razumem da je u zadatku autor hteo da nam objasni kako radi ref. Ali da li mozes @Grizzly Adams da to objasnis sa malo konkretnijim primerom u kome mozemo da vidimo kad to uopste treba da koristimo u praksi? Meni ovo ispod ima 100 puta vise smisla nego da koristim void funkciju i ref:

Па ref треба избегавати по сваку цену. Ретке су и прилике када је заиста потребан (као што твој пример илуструје). Рецимо, ово је један стандардан пример где се користи једна варијанта ref (који се зове out, али исто ради - само је обавезно да му се у функцији додели вредност):

            string brojKaoString = Console.ReadLine ();

            int broj;

            if (int.TryParse (brojKaoString, out broj)) {
                Console.WriteLine ("To je broj: " + broj);
            } 
            else {
                Console.WriteLine ("To nije broj.");
            }

Често ћеш да наиђеш на такве "Try" функције које враћају bool ако су успеле, а резултат као ref/out варијаблу.

 

  • Волим 1

ΜΟΛΩΝ ΛΑΒΕ

Link to comment
Подели на овим сајтовима

пре 24 минута, Grizzly Adams рече

Па ref треба избегавати по сваку цену. Ретке су и прилике када је заиста потребан (као што твој пример илуструје). Рецимо, ово је један стандардан пример где се користи једна варијанта ref (који се зове out, али исто ради - само је обавезно да му се у функцији додели вредност):

            string brojKaoString = Console.ReadLine ();

            int broj;

            if (int.TryParse (brojKaoString, out broj)) {
                Console.WriteLine ("To je broj: " + broj);
            } 
            else {
                Console.WriteLine ("To nije broj.");
            }

Често ћеш да наиђеш на такве "Try" функције које враћају bool ако су успеле, а резултат као ref/out варијаблу.

 

Samo da proverim da li kapiram:

Ti mu ovde kazes TryParse(brojKaoString, out broj), pa on ako uspe da dodeli brojKaoString int broj varijabli to znaci da je to broj, a ako ne uspe, kao na primer kad bi uneli da je brojKaoString =  "abc" onda da ode u else i kaze "To nije broj."  

Ako je odgovor "da", zasto kompajler puca ako (implicitno) kazemo 
int broj = "abc";

a u "out" slucaju ne puca?

btw otkrio sam da sam na sljaci sve vreme imao preinstaliran mono (linux verzija VS-a) sto stvarno nije ok za produktivnost kompanije, ali sta da se radi :/ 

Link to comment
Подели на овим сајтовима

пре 7 минута, uros рече

Ti mu ovde kazes TryParse(brojKaoString, out broj), pa on ako uspe da dodeli brojKaoString int broj varijabli to znaci da je to broj, a ako ne uspe, kao na primer kad bi uneli da je brojKaoString =  "abc" onda da ode u else i kaze "To nije broj."  

Да, тако је.

пре 8 минута, uros рече

Ako je odgovor "da", zasto kompajler puca ako (implicitno) kazemo 
int broj = "abc";

a u "out" slucaju ne puca?

Зато што је TryParse фунцкија направљена тако да прво "провери" да ли је у питању број, па тек онда конвертује. Ако пробаш то како си навео компајлер одмах види да није исправно. Ако пробаш само int.Parse("abc"); добићеш грешку (Exception) при извршавању програма зато што није "проверено" да ли је број, а функција Parse подразумева да јесте.

Сад мож да измениш регистар касу да прима само бројеве за цену и количину... ;)

ΜΟΛΩΝ ΛΑΒΕ

Link to comment
Подели на овим сајтовима

пре 32 минута, Grizzly Adams рече

Често ћеш да наиђеш на такве "Try" функције које враћају bool ако су успеле, а резултат као ref/out варијаблу.

И то је исто лоша пракса и користи се да надомести недостатке језика. "Модерни" језици (ствар постоји од седамдесетих, али су је у мејнстрим језицима тек скоро открили) имају овако нешто:

 

enum Optional<T> {

        case Some(T)

        case None

}

 

У суштини strongly typed null. 

Link to comment
Подели на овим сајтовима

пре 5 минута, Juanito рече

У суштини strongly typed null. 

Да, има и C# nullable types - на пример само ставиш:

int? x;

Само што null није false... :)

У таквим случајевима ја опет избегавам ref/out већ преферирам да направим помоћну класу типа:

class ParseResult{

public bool Success;
public int Result;

}

па онда то вратим из функције. Што је сличније твојем примеру.

  • Волим 1

ΜΟΛΩΝ ΛΑΒΕ

Link to comment
Подели на овим сајтовима

пре 10 минута, Grizzly Adams рече

Да, тако је.

Зато што је TryParse фунцкија направљена тако да прво "провери" да ли је у питању број, па тек онда конвертује. Ако пробаш то како си навео компајлер одмах види да није исправно. Ако пробаш само int.Parse("abc"); добићеш грешку (Exception) при извршавању програма зато што није "проверено" да ли је број, а функција Parse подразумева да јесте.

Сад мож да измениш регистар касу да прима само бројеве за цену и количину... ;)

Aha, dakle int.TryParse() uopste ni ne dodeli varijabli int broj "abc" nego cim vidi da "abc" nije int preskace "out broj" dodelu. Kapiram, fala Grizli :)

Link to comment
Подели на овим сајтовима

пре 2 минута, Grizzly Adams рече

У таквим случајевима ја опет избегавам ref/out већ преферирам да направим помоћну класу типа:

class ParseResult{

public bool Success;
public int Result;

}

па онда то вратим из функције.

То је свакако боље, али и даље није идеално јер може да има вредности (true, ђубре) или (false, broj).  

Link to comment
Подели на овим сајтовима

Само да се јавим.

1. Kasnim

2. Čitam i probam iz tutorijala

3. Mlogo mi se svidža mi se logika C#-a...

Коначно капирам да ово није ДОС, него мирише на "интернет ДОС" :) 

"Христос васкрсе, радости моја!"

 

Link to comment
Подели на овим сајтовима

пре 6 часа, Јанко рече

Коначно капирам да ово није ДОС, него мирише на "интернет ДОС" :) 

Да, ово је на корак од интернет програмирања, у суштини само замениш онај Console са другим улаз-излазом и све остало је исто.

То је добра ствар са C#/.NET.

ΜΟΛΩΝ ΛΑΒΕ

Link to comment
Подели на овим сајтовима

×
×
  • Креирај ново...