Diskuze: this v parametru
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 18 zpráv z 18.
//= 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.
podle mě tam chybí za tím this čárka a pak by to znamenalo, že v parametru posíláš instanci formuláře.
string NejakaFunkce(this, string vstup)
např. zde: http://www.codeproject.com/…ection-for-C
První je signatura klasické instanční metody. Ta druhá je extension metoda (aby fungovala tak jak má, tak musí být v public static třídě a ta extension metoda musí mít access modifier public).
Nestihl jsem edit... Kdyby se někdo nudil, může to smazat tu předchozí zprávu.
První je signatura klasické instanční metody. Ta druhá je extension metoda (aby fungovala tak jak má, tak musí být v static třídě).
Abys chápal k čemu to je. Dostaneš přístup ke třídě, která je už sealed nebo nemáš možnost změnit typ, který využíváš. Prakticky to budou nějaké knihovny třetích stran. Pak si napíšeš extension metodu, která ti rozšíří tu tvojí instanci. Příklad, který bys pochopil může být třeba rozšíření třídy Random o generování booleanu.
internal static class RandomExtensions
{
internal static bool NextBoolean(this Random r)
{
return r.Next(2) % 2 == 0;
}
}
Pak to už můžeš normálně zavolat kdekoliv ve tvojí assembly.
Random r = new Random();
bool b = r.NextBoolean();
Tak by to nebyla extension metoda a musel bys to volat jako
bool b = RandomExtensions.NextBoolean(r);
Takhle tu instanci předáváš, ale v případě extension metody tu metodu voláš jakoby na instanci.
Ahoj, ono je to takové, prostě je to tak vymyšlené.
Tím this říkáš, že rozšiřuješ třídu tohoto prostoru. Vím, že by to Ing. z Microsoftu asi vysvětlil lépe.
Ale s čím já si vystačím je.
public class MojeTrida()
{
}
a teď si řekneš mě tam chybí metoda kterou bych chtěl použít, máš dvě možnosti bud uděláš odvozenou třídu a k potomkovi přidáš metodu, je to tak správně a má se to tak dělat, ale pokud seš línej uděláš tady to.
internal static class ExtensionTrida
{
internal static void NovaMetoda(this MojeTridat mojetrida)
{
//code
}
}
potom když to máš ve stejném namespacu a vytvoříš si instanci MojeTrida tak v ní máš i metodu nová metoda právě díky tomu this, protože bez toho on by jakoby nevěděl, kam to přiřadit. Prostě tady v tom případě to není jenom vstupní parametr té metody, ale přiřazuje mu tu instanci třídy kterou bude rozšiřovat.
Pokud Tě to mate nepoužívej to.
kupodivu mne to nějak nemate, spíš mne překvapuje, na co všechno tvůrci
kompilátoru nemysleli
Ale je fakt, že to čitelnosti kódu zrovna nepřidá.
Namespacy tam nehrají žádnou roli.
Ta metoda v žádném případě nenáleží tomu typu (resp. té instanci).
Jinými slovy, ta metoda se k nikomu nepřiřazuje, pořád patří té static
třídě.
máš pravdu, jsem rád za Tvé příspěvky, protože vím sice jak to funguje, ale neumím pořádně říct proč, protože ten zápis je tak trochu zmatečný..Snad doufám, že alespon pomohl příklad jak to používám.
Někdy jazyk obsahuje syntaktické prvky [syntaxe = způsob zápisu], které
ti mají v určitých případech zjednodušit život.
Pokud takový prvek nemění sémantickou část jazyka [sémantika = význam
zápisu], říká se mu syntaktický cukr.
Extension metoda je úplně obyčejná statická metoda, která se jen jinak
zapisuje.
Syntaktický cukr spočívá v tom, abys místo
ExtensionTrida.NovaMetoda(mojeInstance) mohl napsat
mojeInstance.NovaMetoda()
Významově jsou pak oba zápisy naprosto stejné.
Abych to trošku shrnul - je to syntaktický cukr. Například následující dvě metody jsou použitím naprosto totožné, jde pouze o zápis jejich volání.
internal static class RandomExtensions
{
public static bool NextBoolean(this Random r)
{
return r.Next(2) % 2 == 0;
}
public static bool NextBoolean(Random r)
{
return r.Next(2) % 2 == 0;
}
}
Random r = new Random();
bool b = r.NextBoolean();
bool c = RandomExtensions.NextBoolean(r);
Vidíš, že kód je přehlednější a lée vystihuje význam, ve kterém bylo myšleno metodu použít. IntelliSense ti sám napovídá rozšiřující metody atd. například když používáš List, drtivá většina jeho metod jsou pouze rozšiřující (Aggregate, Sum, atd), sám List moc metod nemá - https://msdn.microsoft.com/….110%29.aspx. Nikde tam metody jako Sum, Any a podobné nenajdeš - ty jsou až rozšiřující.
Co se týče k tomu, co řekl vodslon - rozhodně to není myšleno tak, že se ti nechce odvozovat tříd, tak si radši vytvoříš rozšiřující metodu. Je několik případů, kdy dává použití rozšiřující metody smysl.
Četl jsem prvních pár slov a už je to špatně... Extension metodu můžeš volat i normálně, tak jak to ve skutečnosti udělá kompilátor.
Btw, vůbec nechápu, proč to tu vysvětlujete už potřetí, když to bylo dávno uzavřené ze strany tázajícího.
Ok, už jsem to dočetl, nevím proč do toho taháš ještě LINQ
Zobrazeno 18 zpráv z 18.