Diskuze: Mazání Pole objektu
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Neregistrovaný
Zobrazeno 39 zpráv z 39.
//= 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.
Zkus prosím upřesnit co myslíš tím : nevím jak toto pole nastavit pak zpět do puvodniho stavu tudiž prázdné
ano víme, dej si par facek a nebuď líný. Nicméně je fakt že jsem taky takový.
Prostě projedeš celé pole cyklem a nastavíš ho na null nebo Nothing, podle toho jestli píšeš v c# nebo VB.NET. Pak bude prázdné.
No cyklus jsem zrovna použít nechtěl, ale asi budu muset
ono když si dám par facek, tak to s tou leností moc nepomáhá.
object[] poleSobjekty = new object[1000];
public void addObj(object send){
int i=poleSobjekty.Length();
poleSobjekty[i]= send;
}
tak ještě skus
poleSobjekty = new object[1000];
Jinak proč je tam statických 1000? Co když prvků bude 1001? Dále ty nevíš předem datový typ, že je Object?
To mě nenapdalo,
statických 1000 je tam proto že jich víc jak 200 asi nebude, ale jen pro
jistotu, navíc mám nebo měl jsem že pole se musí definovat přesně.
Datový typ je právě object.
Pole složí jen jako seznam odkazu na dané objekty.
Jestli je to dynamické pole, použí List ...
Pozn.: Zbytečně pak alokuješ 800 objektů, které nevyužíváš
"Pole složí jen jako seznam odkazu na dané objekty."
Právě jsi napsal, že je to seznam . Použij tedy kolekci List.
Typ object se v praxi příliš nepoužívá, programuješ nějakou hloupost.
Třeba ten typ Object chce použít jen jako interface. Pokud jen chce překrýt metodu ToString, tak nic "lepšího" ani nepotřebuje.
Pochybuju, že člověk co neumí pracovat s Listem ví naco je interface (jestli ano, tak se omlouvám, že ti křivdím )
Typ object se v praxi nepoužívá?
Nevím nejsem programátor, byl bych rád ale mám do tho daleko,
Ale logicky to vyplívá z toho, že dynamicky vytvářím objecty pomocí
třídy, které musím někam přiřadit, nebo na ně vytvořit odkaz bych se k
nim pak dostal.
poučil bych se,kdyby jsi mi poradil jak vytvářet dynamicky objekty.
nevím jaký má význam jestli použiji string nebo object či int na pole s
objecty.
Použití typu má význam už jen proto, že programuješ ve staticky typovaném jazyce. Nějak se mi tu nechce vysvětlovat první lekci C#, když tu je napsaná.
V tom případě si založ seznam s typem té třídy a ne obecným typem Object
Například tohle je v C# naprosto korektní:
Object str = "Nazdar";
Console.WriteLine(str);
Object se zde používá jako interface. Ve skutečnosti je v str objekt typu string.
No nevím co jsem napsal špatně,
že pracuji ve statciky typovém jazyce vím.
Object chápu jako object (který má svoje methody, a paramtry atd.)
když však potřebuju vytvořit "n" objectu, tak jak mám tomu mám asi
přistupovat, když data v objectu jsou smíšená (počty kusu, jejich názvy
atp.)
hrrr... trošku jste mě .... , až jsem se hecl a přepasl to vše do objectu.
Ale díky za váš čas.
Počet kusů a název objektu jsou přece vlastnosti jednoho objektu. Proč to drobíš? Nebo máš každý kus pojmenovaný zvlášť?
Nevím co je na tomhle špatného.
class objekty
{
private int cislo { get; set; }
public int idCard { get; set; }
public string jmeno { get; set; }
public string prijmeni { get; set; }
public string email { get; set; }
public string slozka { get; set; }
public string sifrovat()
{
/*"code"*/
string sifra = "sdad";
return sifra;
}
object[] gangstery = new object[100];
objekty novy = new objekty();
novy.jmeno = "sdadasd";
novy.idCard= 123456789;
gangstery[gangstery.Length + 1] = novy;
Hm.
Dobrá rada, takže hážu C# do koše.
doufám, že myslíte to, že mi tam chybí jedna složená závorka?
Al epřiřazování objectu do pole,
Tak by mě zajímalo jak by jste to teda řešil.
Nebo se běžně řeší, jen já nejsem osvícem touto znalostí.
class Gangster // nebo člověk či co to má být
{
private int cislo; //není zrovna nejlepší název proměnné
public int idCard;
public string jmeno, prijmeni, email, slozka; //případně ještě lépe get; private set;
public Gangster(string jmeno, int idCard, ...)
{
this.jmeno = jmeno ...
}
public string Sifrovat()
{
string sifra = "sdad";
return sifra;
}
}
//předpokládám Main
List<Gangster> gangsteri = new List<Gangster>();
Gangster gangster = new Gangster("sdadasd", 123456789, ...);
gangsteri.Add(gangster);
Ta chybějící závorka je jen prkotina.
Jednak je silně zavádějící název třídy "objekty". Už to svědčí o neznalosti OOP. Třída je třída, objekt je objekt. Kdybys třídu pojmenoval "Gangster" a kolekci (seznam objektů) pojmenoval "gangsteri", byl bych daleko spokojenější.
gangstery[gangstery.Length + 1] se odkazuje na neexistující položku pole. Je to chyba. Nemá to však být pole gangsteri, ale seznam gangsteri.
Nikde nevidím konstruktor. Proč neuděláš
Gangster novy = new Gangster("sdadasd", 123456789);
gangsteri.Add(novy);
Bude ti to automaticky udržovat délku, ať jich tam bude 5 nebo 5000.
Koukám, že jsme zcela nezávisle na sobě použili stejné názvy tříd i objektů. Viva OOP.
Dík.
šlo mi o ten list,
použít na to pole nebylo zrovna moudré, ale nevěděl jsem co jinak.
V případě použití pole místo listu by jste mi asi neporadil?
Nevím co tím totiž myslel sdraco že typ object se v praxi nepoužívá.
Myslel tím, to, že se v praxi nepoužívá Ano, poslal jsi link na manuál, je tam. Co s tím máme dělat? Mohl bych ti tu vysvětlit něco o genericitě a hierarchii tříd, možná trochu rozhraní. Ale stejně by jsi to teď nepochopil. Začni hezky od začátku místním seriálem o OOP.
Gangster[] gangsteri
(pole gangsterů)
Problém se statickou velikostí by ovšem zůstal a tudíž to není nejlepší
řešení.
Objekt se používá na boxing a unboxing (viz třeba serial tady o OOP), typ objekt ti vrací každý eventhandler z knihoven, abys mohl zjistit co kdo ten event vyvolal (třeba). Využití je mnoho. Sdraco tím myslel, že se nepoužívá takhle přímo, že bys ho používal ty a psal ho přímo. Vždy by jsi měl vědět, co za objekt ti přijde a podle toho se zachovat.
Proč chceš pořád používat pole ? Toto je jasný příklad, kdy nevíš kolik jich tam bude a musíš s velikostí dynamicky pohybovat = je to list
Mockrát děkuji za vysvětlení.
už jsem to přepsal,
pole již používat nechci, o listu jsem nevěděl, moje chyba, s C# začínám
OOP znám z jiného jazyka.
Krom toho vím že pole nebude mít víc jak 200-max 300 (1000 jsem tam dal jen
tak od boku, přiznávám).
Ani boxing a unboxing se příliš nedělá, je to spíše teoretická záležitost. C# má nullovatelné typy, dělá ho na pozadí.
Kdybys znal OOP z jiného jazyka, tak bys nepojmenoval třídu objekty a nesnažil se použít pole místo seznamu. To jsou úplné základy.
Ale jo, boxing občas člověk využije, já ho teď používám třeba u extensions ke třídě Stream - mám funkci write, které předhodím object a ona uvnitř zjistí, co je to za typ (string, int, datetime, byte[], ...) a podle toho zapíše.
V OOP se tohle přece děje zcela automaticky. O to se vůbec starat nemusím.
Nemusíš, ale je dobré o tom vědět, boxing/unboxing má režii, pamatuju
si, že v nějakých DirectX ukázkách běžela managed verze asi o 50%
pomaleji než unmanaged právě kvůli boxingu, kterému se dalo vyhnout.
Navíc to generovalo každou sekundu navíc několik desítek-stovek MB
nepořádku pro GC.
Většinou mají spíše oddělené metody, jako WriteInt, WriteString a podobně. Má to tak .NET řeba na třídě XmlWriter. Ten object je totiž docela zavádějící, v .NET jsem ho viděl jen ve starých kolekcích před genericitou.
To tam mám taky, ale kvůli pohodlí jsem si ještě napsat obecnou write, která je volá automaticky a když narazí na něco co nezná, tak vyhodí výjimku. Dokonce můžu zavolat stream.WriteAll(nejakyInt, nejakyString, nejakeBajtovePole, nejakyDateTime, nejakyFloat, nejakyInt, nejakyInt) a ono mi to všechny v uvedeném pořadí zapíše.
Teoreticky se to tady hodí. Prakticky si stejně nějak neumím představit kde bych to použil. Soubory mají většinou nějakou pevnou strukturu, ne že to do nich sypu Leda že by to byly binárky.
Jj, mapy do Volfijroku máme uložené binárně
Zobrazeno 39 zpráv z 39.