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.
Tvůrce
Zobrazeno 10 zpráv z 10.
//= 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.
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.