Programiranje

C# - Problemi i rješenja

woodgamesfx uto 13.3.2012 14:29
royalhero kaže...

Ne znam što je sporno oko Close metode, evo sada sam probao meni radi, ma to je on nešto zeznuo.

 

Close se više odnosi na objekt forme, ako u aplikaciji ima jednu formu to bi kako ti kažeš trebalo raditi.

Bitanga uto 13.3.2012 19:16

Pod Linq vjerojatno misliš na LinqToSQL, jer Linq sam po sebi ima još funkcionalnosti (LinqToObjects, LinqToXml...)

 

EF je moćniji od LinqToSQL, ali je i kompliciraniji za održavanje zbog održavanja modela baze i domain modela.

Za većinu potreba je LinqToSQL, tj SQLMetal dovoljan gdje se oboje automatski generira iz modela baze.

 

Sve ovisi naravno što ti treba.

LinqToSQL je po meni dovoljno dobar za ozbiljne business projekte.

r0b3rt uto 13.3.2012 20:53

I Close() i Application.Exit() bi trebali raditi, no vjerojatno nije registriran event handler.

 

this.button2.Click += new System.EventHandler(this.button2_Click);

 

Ovo se može napraviti ili u Visual Studio dizajneru (double click na button, registracija handlera je kreirana u *.Designer.cs) ili ručno napisati to u konstruktoru forme, poslije InitializeComponent();

Friday uto 13.3.2012 21:31
r0b3rt kaže...

 

I Close() i Application.Exit() bi trebali raditi, no vjerojatno nije registriran event handler.

 

this.button2.Click += new System.EventHandler(this.button2_Click);

 

Ovo se može napraviti ili u Visual Studio dizajneru (double click na button, registracija handlera je kreirana u *.Designer.cs) ili ručno napisati to u konstruktoru forme, poslije InitializeComponent();

 

Pod određenim okolnostima (nisam posve siguran kada, da budem iskren), win 7 zna izbaciti onu famoznu poruku tipa "This program might not have installed correctly".

Kao lijek preporučam koristiti Environment.Exit(0) jer na taj način jasno daješ do znanja OS-u da je proces ugašen normalno. Neka me netko ispravi ako griješim.

royalhero uto 13.3.2012 21:36
Friday kaže...
 Environment.Exit(0) jer na taj način jasno daješ do znanja OS-u da je proces ugašen normalno. Neka me netko ispravi ako griješim.

Da, neovisno o broju Formi, za razliku od this.Close, koji će samo izaći iz te Forme.

Friday uto 13.3.2012 21:44
royalhero kaže...
Friday kaže...
 Environment.Exit(0) jer na taj način jasno daješ do znanja OS-u da je proces ugašen normalno. Neka me netko ispravi ako griješim.

Da, neovisno o broju Formi, za razliku od this.Close, koji će samo izaći iz te Forme.

 

Ma napisao sam to zato što je naveden Application.Exit pa se vjerojatno i this.Close() odnosi na main form...

Friday uto 13.3.2012 21:52
Bitanga kaže...

Pod Linq vjerojatno misliš na LinqToSQL, jer Linq sam po sebi ima još funkcionalnosti (LinqToObjects, LinqToXml...)

 

EF je moćniji od LinqToSQL, ali je i kompliciraniji za održavanje zbog održavanja modela baze i domain modela.

Za većinu potreba je LinqToSQL, tj SQLMetal dovoljan gdje se oboje automatski generira iz modela baze.

 

Sve ovisi naravno što ti treba.

LinqToSQL je po meni dovoljno dobar za ozbiljne business projekte.

Mi koristimo LinqToSql za poprilično velik projekt. I sve radi bez problema. Nudi nevjerojatnu lakoću korištenja i običnim ljudima bez gotovo ikakvog znanja o sql-u daje CRUD na pladnju. Za neke intenzivne stvari gdje su performanse iznimno bitne koristimo ADO ali to je možda 1% ukupnog "posla" sa bazom. Svakako preporuka za LinqToSql bez obzira na veličinu projekta...

Friday uto 13.3.2012 22:25
woodgamesfx kaže...
royalhero kaže...

Baze i VB6, ja sam radio ne tako davno, VB6+Access, užas, ali ADO je druga priča.

 

Tip Variant, sam Bog ge je izmislil za neke stvari {#}

 

Istina, ponekad je bio melem na ranu.

Iskreno, danas sam prvi puta imao stvarnu potrebu za dynamic tipom u C# i stvarno mi je uljepšao dan. (sjetio se sada kad sam vidio Variant iako nije baš potpuna analogija).

athlon64 uto 13.3.2012 22:29

Ucim delegate preko pluralsighta trenutno,ako sam dobro shvatia koncept je da se napravi delegat koji ima određene osobine,npr vraća void a uzima string varijablu onda ja mogu radit varijable u koje cu stavit taj delegat a kroz njega proslijedit jednu ili više metoda koje odgovaraju njegovim osobinama, i onda koristeci tu varijablu mogu pozvat sve te metode na neki objekt u isto vrijeme, jesam promašia nešto?

hudo sri 14.3.2012 13:45
athlon64 kaže...

Ucim delegate preko pluralsighta trenutno,ako sam dobro shvatia koncept je da se napravi delegat koji ima određene osobine,npr vraća void a uzima string varijablu onda ja mogu radit varijable u koje cu stavit taj delegat a kroz njega proslijedit jednu ili više metoda koje odgovaraju njegovim osobinama, i onda koristeci tu varijablu mogu pozvat sve te metode na neki objekt u isto vrijeme, jesam promašia nešto?

delegat je referenca na funkciju. i c# ga gleda kao zasebni tip. U .NET 1 i 2 si ga morao definirati kao posebnog clana klase (iako je .net 2 mislim uveo aninimne delegate), ali sa C# 3 i su dosli lambda izrazi, koji prakticki kreiraju istu stvar u compile time-u, u laksi su za koristiti (kod je pregledan).

Npr:

 

Func<string,bool> provjera = s=> return s == "Bug";

bool rez = provjera("Mreza");

 

Func delegatu pozes prosljediti vise parametra, i uvijek vraca nesto, bool u ovom primjeru. Ako ne zelis da vrati nista, znaci void, onda koristis Action<T> (Action<T1,T2,...> ovisno i broju parametra). Ima jos i Predicate<T>, sto je isto kao i Func<T,bool> - znaci predicate vraca uvijek bool. 

 

Inace, kada ovako definiras delegat, odnosno neku "inline" metodu unutar druge metode, to je closure, cesto spominjan termin u (funkcionalnim) programskim jezicima. 

hudo sri 14.3.2012 13:57

Glede EF vs L2S, imajte na umu da se L2S vise ne razvija, iako ce biti i u narednim verzijama .NET frameworka. Ne bi preporucio koristenje L2S za bilo sta kompleksnije, odnosno uopce ga ne bi preporucio, jer u biti nema nikakve prednosti u odnosu na EF. EF je jednostavan za koristiti, podrzava nekoliko nacina rada - kreiranja potrebnih klasa, od drag-drop baze u EF designer, sto je prakticki isto kao L2S, do code-first pristupa (sve se rucno pise u kodu). Takodjer, EF dataContext (Unit of Work) ima vise mogucnosti od L2S, kao Include, detached entities, POCO, laksi mocking (za unit testing) ...

Svi oni u pozadini koriste ADO.NET, sto je low-level API za rad sa DBMS. 

 

Postoji i opcija koristenja lightweight ORM alata, kao sto su Simple.Data, Massive, ili ono nesto sta dolazi sa WebMatrixom :) Njih ne treba konfigurirati (osim conn stringa na bazu naravno), podrzavaju pisanje upita u SQL-u ili nekom svom query/fluent api nacinu, i naravno mapiranje rezultata upita na objekte. Brzi su, trose malo memorije, i jednostavni su za koristiti, sto su im glavne prednosti. Jako se naslanjaju na dynamic mogucnosti .NET 4. 

Naprimjer, u Simple.Data se moze ovo, bez ikakvog konfiguriranja, kreiranja klasa, bilo cega:

 

dynamic product = Database.Open().Products.FindById(5);

Console.Write(product.Name);

 

ili ako se zeli mapirati rezultate upita na objekt:

 

Product product = Database.Open().Products.FindById(5);

 

athlon64 sri 14.3.2012 14:30
hudo kaže...
athlon64 kaže...

Ucim delegate preko pluralsighta trenutno,ako sam dobro shvatia koncept je da se napravi delegat koji ima određene osobine,npr vraća void a uzima string varijablu onda ja mogu radit varijable u koje cu stavit taj delegat a kroz njega proslijedit jednu ili više metoda koje odgovaraju njegovim osobinama, i onda koristeci tu varijablu mogu pozvat sve te metode na neki objekt u isto vrijeme, jesam promašia nešto?

delegat je referenca na funkciju. i c# ga gleda kao zasebni tip. U .NET 1 i 2 si ga morao definirati kao posebnog clana klase (iako je .net 2 mislim uveo aninimne delegate), ali sa C# 3 i su dosli lambda izrazi, koji prakticki kreiraju istu stvar u compile time-u, u laksi su za koristiti (kod je pregledan).

Npr:

 

Func<string,bool> provjera = s=> return s == "Bug";

bool rez = provjera("Mreza");

 

Func delegatu pozes prosljediti vise parametra, i uvijek vraca nesto, bool u ovom primjeru. Ako ne zelis da vrati nista, znaci void, onda koristis Action<T> (Action<T1,T2,...> ovisno i broju parametra). Ima jos i Predicate<T>, sto je isto kao i Func<T,bool> - znaci predicate vraca uvijek bool. 

 

Inace, kada ovako definiras delegat, odnosno neku "inline" metodu unutar druge metode, to je closure, cesto spominjan termin u (funkcionalnim) programskim jezicima. 

hvala na objašnjenju ali mi neke stvari još uvjek nisu sjele,dakle ja napravim delegat i dam mu neke osobina, npr vrača void a uzima string, ja onda tom delegatu mogu prosljedit određene metode? drugim riječima učinit da on referencira jednu  ili više metoda i onda kasnije ako želim pozvat sve te metode na neki objekt,samo pozovem delegat koji referencira sve te metode? pokušavam shvatit funkcjonalnost delegata u kratkim crtama,onda ču ja lako pogledat kako ih se koristi.

Friday sri 14.3.2012 14:41
hudo kaže...

 

dynamic product = Database.Open().Products.FindById(5);

Console.Write(product.Name);

 

ili ako se zeli mapirati rezultate upita na objekt:

 

Product product = Database.Open().Products.FindById(5);

 

 

Isto i sa L2S:

 

            var usdc = new UsersDataContext();
            dynamic usr = usdc.Users.FirstOrDefault(p => p.Id == 200);

            MessageBox.Show(usr.Naziv);

hudo sri 14.3.2012 14:59
athlon64 kaže...

hvala na objašnjenju ali mi neke stvari još uvjek nisu sjele,dakle ja napravim delegat i dam mu neke osobina, npr vrača void a uzima string, ja onda tom delegatu mogu prosljedit određene metode? drugim riječima učinit da on referencira jednu  ili više metoda i onda kasnije ako želim pozvat sve te metode na neki objekt,samo pozovem delegat koji referencira sve te metode? pokušavam shvatit funkcjonalnost delegata u kratkim crtama,onda ču ja lako pogledat kako ih se koristi.

 

Da, delegat moze primiti vise referenci. Evo primjer koda, natipkan ovako nabrzaka:

 

class Program

{

 static void Main(string[] args)

 {

 Klasa objekt = new Klasa();

 Klasa.CalcHandler handler = null;

 handler += Zbroj;

 handler += Mnozi;

 

 objekt.Start(handler);

 

 Console.ReadKey();

 }

 

 static void Zbroj(int a, int b)

 {

 Console.WriteLine(a + b);

 }

 

 static void Mnozi(int a, int b)

 {

 Console.WriteLine(a * b);

 }

 

 

 

 private class Klasa

 {

 public delegate void CalcHandler(int a, int b);

 

 public void Start(CalcHandler calcHandler)

 {

   if (calcHandler != null)

    calcHandler(2, 4);

 }

 }

 

}

 

to je multicast delegate, i u biti jedino se koristi (sto sam ja vidio) kod evenata - na jedan event mozes pretplatiti vise metoda, a kod definiranja eventa uvijek kazes kakav je potpis eventa, tako da definiras delegat.

hudo sri 14.3.2012 15:00
Friday kaže...
hudo kaže...

 

dynamic product = Database.Open().Products.FindById(5);

Console.Write(product.Name);

 

ili ako se zeli mapirati rezultate upita na objekt:

 

Product product = Database.Open().Products.FindById(5);

 

 

Isto i sa L2S:

 

            var usdc = new UsersDataContext();
            dynamic usr = usdc.Users.FirstOrDefault(p => p.Id == 200);

            MessageBox.Show(usr.Naziv);

od kuda je ovaj usdc.Users? Moras ga kreirati putem designera ili nekako. U simple.data niti to nemoras, jerbo je sve dynamic. 

Znaci, file/new project, je sve sta moras napraviti. Dodas DLL od simple.data i conn string u config, i mozes upisati ovu liniju koju sam napisao!

athlon64 sri 14.3.2012 15:19
hudo kaže...

 

Da, delegat moze primiti vise referenci. Evo primjer koda, natipkan ovako nabrzaka:

 

 

 

malo mi je jasnije sad,sta se tice ovoga sta sam citira valjda si mislia delegat može primiti više metoda koje če referencirati,a ne primiti više referenci jer bi on sam trebao bit referenca? kad smo več kod toga, objekti stoje na heap-u kojeg ima dosta al je spor, a reference stoje na stacku koji je dosta brži jel? naravno reference opet pokazuju na neki objekt koji je na heapu?

Friday sri 14.3.2012 15:28
hudo kaže...
Friday kaže...
hudo kaže...

 

dynamic product = Database.Open().Products.FindById(5);

Console.Write(product.Name);

 

ili ako se zeli mapirati rezultate upita na objekt:

 

Product product = Database.Open().Products.FindById(5);

 

 

Isto i sa L2S:

 

            var usdc = new UsersDataContext();
            dynamic usr = usdc.Users.FirstOrDefault(p => p.Id == 200);

            MessageBox.Show(usr.Naziv);

od kuda je ovaj usdc.Users? Moras ga kreirati putem designera ili nekako. U simple.data niti to nemoras, jerbo je sve dynamic. 

Znaci, file/new project, je sve sta moras napraviti. Dodas DLL od simple.data i conn string u config, i mozes upisati ovu liniju koju sam napisao!

 

Uh, to ne volim. To me nekako podsjeća na NOSQL/Ruby fore... i ovo gore što sam ja napisao mi je pretjerano. Više volim strongly-typed pristup...

FireMan97 sri 14.3.2012 21:42

Imam problem,ja pretvorim string to int i dobijem error.

private void button1_Click(object sender, RoutedEventArgs e)
{
int input1 = Convert.ToInt32(textBox1.Text);
int input2 = Convert.ToInt32(textBox2.Text);
MessageBox.Show("input1" * "input2");
}

To je jednostavna kaklulator aplikacija koja samo mnozi tako da je ocekivani unos u textbox int ali error je:

Error 1 Operator '*' cannot be applied to operands of type 'string' and 'string' C:\Users\David\AppData\Local\Temporary Projects\Kalkulator\MainWindow.xaml.cs 41 29 Kalkulator

woodgamesfx sri 14.3.2012 21:59
FireMan97 kaže...
Imam problem,ja pretvorim string to int i dobijem error.

private void button1_Click(object sender, RoutedEventArgs e)
{
int input1 = Convert.ToInt32(textBox1.Text);
int input2 = Convert.ToInt32(textBox2.Text);
MessageBox.Show("input1" * "input2");
}

To je jednostavna kaklulator aplikacija koja samo mnozi tako da je ocekivani unos u textbox int ali error je:

Error 1 Operator '*' cannot be applied to operands of type 'string' and 'string' C:\Users\David\AppData\Local\Temporary Projects\Kalkulator\MainWindow.xaml.cs 41 29 Kalkulator

 

 

Probaj ovo izmjeniti:

 

int input1 = Convert.ToInt32(textBox1.Text.ToString());

int input2 = Convert.ToInt32(textBox2.Text.ToString());

 

EDIT :

i ovo u poruci

int rezultat = input1 * input2;

MessageBox.Show(rezultat.ToString());

 

jer koliko vidim ti u poruci množiš dva stringa znaći sve unutar znakova " se tretira kao string, a operator množenja ne radi nad stringovima ( što bi bilo fora da radi LOL )

 

FireMan97 sri 14.3.2012 22:05

Napravio sam ovako:

private void button1_Click(object sender, RoutedEventArgs e)
{
//int input1 = Convert.ToInt32(textBox1.Text);
//int input2 = Convert.ToInt32(textBox2.Text);
int input1 = Convert.ToInt32(textBox1.Text.ToString());
int input2 = Convert.ToInt32(textBox2.Text.ToString());
MessageBox.Show(input1 * input2);
}

Errori:

Error 1 The best overloaded method match for 'System.Windows.MessageBox.Show(string)' has some invalid arguments C:\Users\David\AppData\Local\Temporary Projects\Kalkulator\MainWindow.xaml.cs 43 13 Kalkulator
Error 2 Argument 1: cannot convert from 'int' to 'string' C:\Users\David\AppData\Local\Temporary Projects\Kalkulator\MainWindow.xaml.cs 43 29 Kalkulator

woodgamesfx sri 14.3.2012 22:07

Jedna napomena :

 

kada radiš s neformatiranim unosima u tvom slučaju preko kontrole textbox tada obavezno kod koji prima unos ugnijezdi unutar try - catch bloka, npr. što ako netko umjesto broja ubaci niz alfabeta ili npr u tvom slučaju broj sa pomičnim zarezom. OK C3 je moderan jezik i vrlo vjerojatno će eliminitari dio iza decimalne točke i uzet u obzir samo cjei dio broja, ali opet postoji velika vjerojatnost da se program sruši.

 

Kod programiranja moraš uzimat u obzir sve možebitne situacije i pravino doskočit svim mogučim scenarijima.

woodgamesfx sri 14.3.2012 22:08
FireMan97 kaže...
Napravio sam ovako:

private void button1_Click(object sender, RoutedEventArgs e)
{
//int input1 = Convert.ToInt32(textBox1.Text);
//int input2 = Convert.ToInt32(textBox2.Text);
int input1 = Convert.ToInt32(textBox1.Text.ToString());
int input2 = Convert.ToInt32(textBox2.Text.ToString());
MessageBox.Show(input1 * input2);
}

Errori:

Error 1 The best overloaded method match for 'System.Windows.MessageBox.Show(string)' has some invalid arguments C:\Users\David\AppData\Local\Temporary Projects\Kalkulator\MainWindow.xaml.cs 43 13 Kalkulator
Error 2 Argument 1: cannot convert from 'int' to 'string' C:\Users\David\AppData\Local\Temporary Projects\Kalkulator\MainWindow.xaml.cs 43 29 Kalkulator

 

 

Ubaci i ovo :

 

EDIT :

i ovo u poruci

int rezultat = input1 * input2;

MessageBox.Show(rezultat.ToString());