Diskuze: vracení více hodnot jednou metodou
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 33 zpráv z 33.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
můžeš si napsat vlastni třídu a předávat tu:
class Neco {
public int neco1;
public int neco2;
}
... neboli Messenger.
Pojem Tabulka v DB je vlastně ekvivalentem pro seznam n-tic s nedefinovaným pořadím. Původně jsem chtěl napsat množina, ale to by vylučovalo duplicitní záznamy.
Jen se ještě zeptám, protože Tuple jsem použil poprvé... jsou nějaké zásadní nevýhody tohoto použití? např. zbytečně velké nároky na paměť, citelná ztráta výkonu atd... máte někdo nějaké špatné zkušenosti s Tuple? Kdy ho není třeba vhodné používat? předem díky za vaše názory
Tuple je trieda, takze ma vsetky nevyhody a vyhody tried (relativne velka pametova rezia, GC, ...). Ak je pre teba velmi dvolezita rychlost tak radsej pouzi ref/out alebo vrat strukturu ktora bude obsahovat data. Ak nie je rychlost prvorada tak kludne pouzi Tuple, bude to prehladnejsie.
Kdyby sis to vyzkoušel, tak bys zjistil, že rychlost je stejná. Proto je lepší udělat return Tuple, protože je přehlednější. Zároveň umožňuje tuto přepravku ihned použít, což ref neumí.
Navíc při vyvolání výjimky v metodě se return chová mnohem lépe - návratový objekt se vůbec nevytváří.
To jsi měřil nebo hádáš? Je přece výkonově jedno jestli instanci té přepravky dělám vně nebo uvnitř metody. Když ji udělám uvnitř, tak je to objektově čisté.
Ak pouzies ref/out tak nepotrebujes prepravku, ak pouzies strukturu ako prepravku tak sa prepravka alokuje na stacku, ak pouzies tuple tak je alokovana prepravka na heape. Kazda moznost ma ine vyhody/nevyhody. Tuple je navyse readonly.
Z DB potřebuji načíst řádky údajů (neměnný formát tabulky--- nemůžu upravit tabulku, že bych do ni přidal jeden sloupec pro tuto vypočtenou hodnotu) a k nim dopočítat hodnotu a tohle vrátit do hlavního programu, kde tyto údaje vypíšu na obrazovku.
Tohle běžně dělám. Přidám si do tabulky virtuální sloupec, který vznikne jako výsledek výrazu. Odpadne tím zmíněný mezičlánek a dostanu jen údaje, které skutečně potřebuji. Tabulka se tím vůbec nezmění.
To je přece dobře, že je tuple readonly. Je to immutable objekt a je to žádoucí vlastnost. Přece ho nebudu modifikovat.
Tuple je implementací přepravky.
http://www.itnetwork.cz/…ash/test.png bude ti stačit tohle ? Testováno 108 vrácení přes struct, class, tuple a 2x out.
No jo, stejně však ten out musíš zabalit do struct, class nebo tuple, abys ho mohl dál použít k požadovanému účelu. Takže tím nic nezískáš.
To už závisí na daném problému, ale tady vidíš že je to cca 5x rychlejší
Je to rychlejší, protože jsi to vytrhl z kontextu programu. Když to pak použiješ ve skutečném programu, výsledek bude podobný. Ale to už asi měřit nebudeš, protože v tomhle testu jsi získal sice zajímavý, ale nepoužitelný výsledek.
Hádám, ale je to logické, vytvoření instance třídy zabere přece mnohem víc než jen uložení hodnoty na stack/do registru.
Jsi hrozný demagog.
Píšeš, že rychlost je stejná, někdo ti dokáže opak, tak napíšeš, že to vlastně nevadí.
Už mě to začíná trochu unavovat, děláš to často a často u věcí, kterým evidentně moc nerozumíš.
Vyšel jsi z předpokladu, že dál budeme používat tyto dvě proměnné primitivního datového typu samostatně. V tom případě to v daném místě skutečně rychlejší bude. Ale stejně ty dvě proměnné budeš muset do něčeho zabalit, abys to mohl dál použít. Proč si to nenechat zabalit rovnou v té metodě, která ta data poskytuje?
"Tak se neunavuj "
Možná umíš databáze a lepíš do sebe knihovny (aby jsi nemusel používat algoritmy), ale co se týče některých věcí, tak jsi dost mimo.
Proč by měl mít někdo chybu v návrhu aplikace jenom proto že použije dvě samostatné proměnné? Co když to tak udělá jen proto aby šetřil výkonem?
Metoda, která vrací dvě nezávislé hodnoty, u kterých potřebuji každou jinde, je přinejmenším podivná.
V tomto vlákne bolo spomenutých niekoľko spôsobov ako vrátiť jednou metódou viacej hodnôt.
Mám prosbu.
Mohli by ste sem dať jednoduché príklady?
Úloha: vrátiť lokalizáciu bodu hodnotou x, y.
Mne sa páčilo, čo napísal Misaz, predstavujem si to asi takto:
(dúfam, že správne)
class Neco {
public int neco1;
public int neco2;
}
class Pozicia
{
Neco neco = new Neco();
public Neco VratXaY(int x, int y)
{
neco.X = x;
neco.Y = y;
return neco;
}
}
Môže niekto doplniť príklad na Tuple<>, ref / out, struct?
Obdivuji tvoji schopnost neustále vyhledávat podivná řešení.
public struct Pair<T1, T2>
{
public T1 first;
public T2 second;
public Pair(T1 f, T2 s)
{
first = f;
second = s;
}
}
public abstract struct Pair
{
public static Pair<T1, T2> Create<T1, T2>(T1 f, T2 s)
{
return new Pair<T1, T2>(f, s);
}
}
public Pair<int, int> VratStruct(int x, int y)
{
return Pair.Create(x, y);
}
public Tuple<int, int> VratTuple(int x, int y)
{
return Tuple.Create(x, y);
}
public void VratByRef(ref int x, ref int y)
{
x = 45;
y = 13;
}
Kdyby se místo těch blbostí ptal na správné řešení, tak bych mu poradil Point.
Ďakujem.
@sdraco, ďakujem aj tebe za radu.
Zobrazeno 33 zpráv z 33.