Gå til innhold

C#: Sende array som parameter i en metode


Anbefalte innlegg

Får ikke helt dette til å fungere, har prøvd på flere måter, og søkt på enda flere.

 

Det jeg ønsker er å lage en array med string-verdier i en klasse, sende denne som parameter til en metode i en annen klasse og så kunne lese innholdet av arrayen der.

 

Noen som skjønner spørsmålet? :)

Lenke til kommentar
Videoannonse
Annonse

public class Foo

{

public function MyMethod(IList<string> array)

{

// gjør det du vil med den her

}

}

 

----------------------------------------------------

 

 

IList<string> array = new List<string>();

array.Add("string1");

array.Add("string2");

Foo myClass = new Foo();

myClass.MyMethod(array);

Endret av The Jackal
Lenke til kommentar

Hvorfor i all verden definerer du den som

 

IList<string> og ikke bare List<string>??

 

 

 

Det er vel strengt tatt ingenting i veien for å sende med en "vanlig" array heller.

 

private void myFunc(string[] s)

{

}

 

string[] s = new string[2];

s[0] = "tekst1";

s[1] = "tekst2";

 

myFunc(s);

Lenke til kommentar
Hvorfor i all verden definerer du den som

 

IList<string> og ikke bare List<string>??

 

 

 

Det er vel strengt tatt ingenting i veien for å sende med en "vanlig" array heller.

 

private void myFunc(string[] s)

{

}

 

string[] s = new string[2];

s[0] = "tekst1";

s[1] = "tekst2";

 

myFunc(s);

 

Med IList kan du enklere bytte den underliggende implementasjonen av arrayet. Det er mer enn List som implementerer IList, så litt avhengig av bruken (som selvfølgelig kan endre seg over tid) så mener jeg det gir den beste koden som tillater endring over tid. Om ikke annet, så er det uansett en grei introduksjon til generics.

 

Angående ditt eksempel så fungerer naturligvis det også, men da må du vite antall strenger på forhånd så det er jo på langt nær like fleksibelt. Selv om dette sannsynligvis er på nybegynnerstadiet, så er det ingen grunn til å ikke bruke de mekanismer som ligger i språket og skape gode programmeringsvaner med en gang :)

Lenke til kommentar

Mange ganger vet man antallet man trenger i en array også. Vet man dette er faste arrayer mye mer effektivt enn generics.

 

...ja, så himla ofte man trenger noen andre implementasjoner av en liste av stringer...

 

ulempen er jo at da må du hele tiden fortelle hva slags implementasjon det er, og hvilke funksjoner som skal kalles.

 

IList<string> s = new List<s>();

 

(s as List<string>).funksjon();

Endret av Manfred
Lenke til kommentar

Dere roter mellom interface og generics her, Interface IList er en generic, men det du mener Manfred, er å bruke klassen List fremfor interfacet IList.

 

Fordelen med IList, er at da vil funksjonen fungere på mange fler objekter, som Collection og lignende, ulempen er at et interface kall krever ørlite grann mer CPU en et virtual kall, som igjen krever litt mer en et statisk kall.

 

Men stort sett er fordelen såpass stor, og ytelsen såpass mye mindre at man kan ignorere det.

 

Jeg ville brukt IList, men på en annen side tror jeg aldri jeg har skrevet en funksjon som tar en liste som parameter, da arver jeg heller fra List<T> fremfor å skrive slike funksjoner.

Lenke til kommentar
Poenget mitt er at dersom man f.eks lager en egen klasse som arver av IList, hvor man definerer egne funksjoner, så vil vel ikke disse spesifikke kallene kunne kalles fra et IList<string> objekt?

 

Generelt sett synes jeg uansett det er rotete å blande slik...

 

Man arver ikke fra et interface som IList, men man sier at klassen implementerer interfacet. Man arver jo ikke noe funksjonalitet, men sier at denne klassen skal ha et spesielt sett med metoder osv. Tingen er jo at siden dette er et array av et eller annet slag, så har IList gjerne alle de metodene du trenger for å behandle arrayet uavhengig av implementasjonen. Det er akkurat dette som gir den gode fleksibiliteten ved å bruke interfacer, og i de aller fleste tilfeller trenger du ikke caste objektet til noe som helst. Det er dessuten sett på som programmeringsskikk og bruke interfacer der du kan. Så selv om du synes det er rotete så er det en annen verden der ute ;)

Endret av The Jackal
Lenke til kommentar

The Jackal: alle her vet hva som menes med "implementering" og "arv"

Det er dårlig skikk å angripe folks kunnskaper eller evner for å fremme egen sak.

 

Nok om det, tilbake til saken:

Jeg mener at man her ikke burde lage en funksjon som tar imot noe som helst, men at det er en enklere, og mer effektiv løsning og heller arve fra collection eller list.

Selv bruker jeg arrays enten til statiske lister, eller objekter som brukes i unsafe kontekst, men i utgangspunktet er array et referanseobjekt, og kan gis som parameter i en funksjon uten at innholdet blir kopiert.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...