Diskuze: C# - automatické dosazování do špatného pole
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 10 zpráv z 10.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
No jasně, protože map[x, y] = mapObject; ti udělá to,
že do pole map uloží referenci na mapObject. Jinými slovy máš pořád
jeden mapObject ale máš na něj reference v obou polích. A tedy pokud
změniš hodnotu v jednom poli, ukáže se ti nový hodnota i ve druhém
poli.
Řešením je nepř. vytořit nový objekt MapObject a naplnit ho daty z
kontrolního pole. Ale celkově ta implementace mi příjde trochu divoká.
Navíc nevím jak je přesně myšlený řádek map[x, y] == mapThatWas[x, y] Pokud to má být kontrola toho zda se rovnají např. souřadnice v mapObject tak to ti fungovat nebude. Tak jak to máš napsané projde jen v případě, že obě pole ukazují na stejný objekt v paměti, ale neporovnáváš jejich hodnoty.
Ok, dik. V podstate chci zjistit, jestli se ten dany radek v poli zmenil,
nebo ne, abych ho znovu nevykresloval zbytecne. Neporadil bys mi, jak to co
nejlepe udelat? 
Nebylo by nejjednodussi si udelat pole integeru, do ktereho jenom budu
ukladat souradnice pri kazde zmene pole a po vykresleni to pole promazu? Nebo
mas jiny napad? 
No ono záleží na tom co si představuješ pod pojmem
chci zjistit, jestli se ten dany radek v poli zmenil
Znamená to že je v obou polích uložena jiná instance proměnné a
shodují se nějaké souřadnice na mapě, nebo chceš kontrolovat že obě pole
ukazují na ten samý objekt? 
Chci zjistit, na kterých souřadnicích jsou v polích různé objekty a na kterých jsou stejné.
Taky mě napadlo, že bych si při každé úpravě pole někam uložil souřadnice, kde bylo něco upraveno. Ke konci bych projel ty souřadnice a vypsal. Myslíš, že je to dobré řešení?
V okamžiku, kdy chceš trackovat efektivně změny, bys měl zapřemýšlet nad "identitou objektu" .. třeba takovým typickým příkladem je Bod v 2D prostoru (v 2D poli).. pokud tomu bodu zmenim souradnici, uz to neni ten samy bod...
Ty chceš možná něco podobného? V tom okamžiku bys měl přemýšlet o Immutable objektu..
To ti zaručí právě to, že pokud bys chtěl editovat objekt, tak musíš vytvořit nový.. Díky tomudle se ti zmení ta reference... jinak to ani nejde. Udělej si tedy ten prvek toho pole immutable.. jsi schopný tedy před každým "tickem" udělat kopii předešlého pole a pak po "ticku" (po provedených změnách) projet to nové pole a porovnat jen reference.. pokud zjistis ze se zmeni, tak zaneses zmeny.. pseudo kod:
List<ImmtableObject> oldList = ....
tick() {
List <ImmutableObject> newList = oldList.Copy();
DoChanges(newList);
for(int i=0; i<newList.Count; i++) {
if (newList[i] != oldList[i]) // doslo k nejake zmene, prekreslit
{
redraw(newList[i]);
}
}
oldList = newList;
}
Místo classy pro reprezentaci MapObjectu můžeš použít struct, takže se ti to bude chovat tak, jak čekáš - kdykoliv někam pošleš MapObject, pošle se tam kopie jeho hodnoty a ne reference.
A když už používáš struct, tak VŽDY ho udělej immutable, jinak se
střelíš do nohy 
Zobrazeno 10 zpráv z 10.
