Jag har lite problem med att förstå vad New egentligen gör, vad är tex. skillnaden mellan: Nu måste vi gå lite grundläggande :P Oh jävlar!, det var mycket att ta sig igenom :P. Har läst igenom det, förstår dock inte riktigt allting får nog ta o läsa det några gånger till. Tack för hjälpen! värdetyper är structar allihop, varseig microsoft gjort dem och kallat dem int eller du gjort dem själv. > värdetyper är structar allihop, varseig microsoft gjort dem och kallat dem int eller du gjort dem själv. <i>Tja, värdetyper kallas det iaf. i alla andra språk. Och både int och en valfri struct man skapat ärver ju ifrån System.ValueType..? Visst; de har metoder, så på sätt och vis är de strukturer de också, men säger man att man har en struktur så syftar man inte på en int. Men säger man att man har en värdetyp så kan man syfta på både en "normal" värdetyp och en struktur.</i> Tja; lite google: Jag förstår inte riktigt? Dina länkar säger precis samma saker som jag gör? > Vad Eric säger är att de är samma sak (och det här jag dessutom hört honom säga och disskuterat med honom, inte bara läst och själv tolkat), inte att en viss implementation är annorlunda eller olika saker. Att du väljer att använda felaktig terminologi ur ett programspråksperspektiv får stå för dig men faktum kvarsstår. Värdetyper defineras som struct, en strukt kallas värdetyp. > och i IL är det juh ändå klasser allt samman =)Vad gör egentligen new?
Dim i as integer
och
Dim i as New integer
Om jag dimensionerar en class utan New blir det bara en genväg då jag bara kommer åt public shared funktionerna ?. Får inte riktigt rätt på det här :)Sv: Vad gör egentligen new?
Det finns två sorters "saker" i .Net (och de vanligaste språken, på sätt och vis i alla fall), vo har:
a) Valuetypes, dvs. värdetyper. En värdetyp skickar du runt hur som helst, dvs. skickar du runt ditt värde så kopierar du värdet hela tiden. Ett värde är ett värde; t.ex. är ett nummer ett värde, eller en bokstav, eller en storlekr. Ex:
<code>
Dim x as Värdetyp
Dim y as Värdetyp
x = New Värdetyp() 'Kommer fylla x med "standardvärdetypen"
y = x 'Kommer att kopiera hela x och lägga in kopian i y
'y innehåller nu än kopia av x. Eftersom det är en kopia kommer en ändring i x inte resultera i en ändrig i y
</code>
b) Objects, dvs. Objekt. Ett objekt skickar du inte runt. Du skickar runt en pekare till den (fast det är dolt i t.ex. .NET eller java.) Ex:
<code>
Dim x as Objekttyp
Dim y as Objekttyp
x = New Objekttyp() 'Kommer att fylla x med en pekare på ett helt nyskapat objekt
y = x 'Kommer att kopiera pekaren i x till y.
'Pekaren i x och y pekar på samma sak. En ändring i x kommer resultera i en ändring i y då det är samma objekt
</code>
När det gäller värdetyper så kan vi dela in dem i två läger;
a) "vanliga"
De "vanliga" är enkla värdetyper; t.ex. nummer, en bokstav etc.
b) Strukturer
Strukturer är mer avancerade; de är fortfarande värdetyper <b>men</b> de kan man skapa själva. Man kan sätta samman en struktur med valfritt innehåll. T.ex. kan man skapa en struktur som innehåller ett tal, två bokstäver, ett objekt (obs! pekaren, bara pekaren kommer kopieras, inte objektet bakom) och en storlek (system.drawing.size.) Rubber kommer sedan att kopieras ("skickas runt") när man använder det. Se därför till att hålla den här typen av saker så små som möjligt...
Självklart kan man skicka runt pekare till värdetyper om man vill; antingen som del i unsafe-kod (fungerar bara i c#, inte vb.net) eller som byref (här kan .net ha lite special för sig tydligen, kan inte det där till 100%, fungerar så gör det i alla fall när man använder det) istället för byval.
En värdetyp har alltid ett "defaultvärde", och ett objekt har alltid ett "defaultvärde". Observera att "värdet" i ett objekt är en pekare, en pekare med värdet 0. Alltså pekar den på ingenting. Null alltså.
Om vi tar din enkla kod du hade med integer så är ju det en värdetyp. Oavsett om du använder "new" eller inte så kommer du att ha ett nytt värde på din variabel. Den kommer inte vara "null" (även om nullable types tydligen finns i .net 2.0, har inte utforskat) vilket gör att alla eventuella funktioner kommer att fungera. Observera att det <b>inte</b> gäller "shared" funktioner.
"Shared"-funktioner är inte beroende av en instans; och eftersom att de inte är beroende av en instans så måste de användas utan en instans. En "normal" funktion är däremot beroende av en instans. Ex:
<code>
Dim i as integer
i.ToString() 'Den här funktionen är inte shared, den är beroende av en instans
i.Parse() 'Det här går inte, Parse är en shared funktion
Integer.Parse() 'Det här går eftersom att den inte kallas med en instans av någonting
i = null 'Går inte; null är för pekare. Värdetyper är inte pekare!
</code>
När det gäller objekt är det nästan samma sak:
<code>
Dim x as String
x = "min häst är snäll" 'Skapar i bakgrunden en ny instans av klassen "String" och låter x peka på den
x.ToString() 'Värdelöst anrop :) Men, men, den är beroende av en instans, och det har den
x.Compare() 'Går inte, funktionen är shared, är inte beroende av en instans
String.Compare() 'Det går eftersom att funktionen inte är beroende av en instans
x = null 'Det här går, pekaren sätts till 0 ("null") vilket gör att variabeln inte "innehåller" något objekt längre
x.ToString() 'Går inte! Eftersom att x inte innehåller någonting kommer programmet nu att krascha eftersom att funktionen är beroende av en instans av objektet.
</code>
Observera att det inte går att vid kompileringen se om en variabel innehåller ett objekt eller inte vid en viss rad i programmet, därför kommer endast felmeddelanden om att anropa funktioner som är "shared" på variabler resp. anrop av funktioner som är "normala" på typer (t.ex. string, integer etc.) visas vid kompileringen. Om en variabel av objekttyp är tom vid körning kan dock programmet generera felmeddelanden, det upptäcks som sagt inte vid kompileringen
Kort och gått kommer det alltså inte bli någon skillnad mellan följande rader:
<code>
Dim i as integer
'och
Dim i as New integer
</code>
När det gäller "genvägen" så vet jag inte hur det var i .net 1.* men i .net 2.0 så kompilerar programmet inte ens när man försöker anropa en "sharedmetod" på en variabel istället för en typ. Varför? Se förklaringen ovan i inlägget ;)
Hoppas det rätade ut sig lite :)
[edit]
Ber om ursökt för lite stavfel, orkar dock itne försöka redigera en massa i inlägget när man bara ser några få rader på en gång :)
[/edit]Sv:Vad gör egentligen new?
Sv: Vad gör egentligen new?
den andra typen kallas referenstyp inte object.Sv:Vad gör egentligen new?
Tja, värdetyper kallas det iaf. i alla andra språk. Och både int och en valfri struct man skapat ärver ju ifrån System.ValueType..? Visst; de har metoder, så på sätt och vis är de strukturer de också, men säger man att man har en struktur så syftar man inte på en int. Men säger man att man har en värdetyp så kan man syfta på både en "normal" värdetyp och en struktur.
> den andra typen kallas referenstyp inte object.
Stämmer mycket bra, hade dock inte ordet i huvudet när jag kladda ner texten :)Sv: Vad gör egentligen new?
Nej. Struct är konstrukten för att skapa värdetyper, på samma vis som Klass är konstrukten för att skapa referenstyper. Om du tar 2 sekunder och kollar upp din fakta så kommer du se att även int/datetime mm är definerade som struct i ramverket.
Det här skiljer sig inte i "andra språk" heller.
Vad gäller terminologin så kan du inte jämföra att prata om en faktiskt implementation (int) och det abstrakta begreppet man använder för att skapa den faktiska implementationen (struct).
Läs en bok.Sv:Vad gör egentligen new?
http://blogs.msdn.com/ericgu/archive/2004/03/24/95736.aspx (Eric Gunnerson)
>>
We went through a few ideas. One was to have a contraint named “reference-type” and “value-type”, but that seemed to be a very verbose statement, and not really in the spirit of the C# naming. We went through a few sillier options (which have thankfully slipped my mind), and finally settled on our original choice, “class” and “struct”.
Those names aren't perfect, because of what they really mean is “reference type” or “value type”.
<<
http://www.dotnet247.com/247reference/a.aspx?u=http://www.csharp-station.com/Articles/ObjectClass.aspx
http://www.dotnet247.com/247reference/msgs/58/293146.aspx
>>
As another interesting side note, the value types themselves don't
inherit from System.ValueType, either. Instead, their corresponding
boxed types inherit from ValueType, and they don't inherit from
anything.
<<
http://www.jaggersoft.com/csharp_standard/10.4.2.htm
Ja, jag har kollat upp (gjorde det redan förut) hur int är skrivet i .net framework. Saken är att jag inte är beredd att kalla t.ex. int för en struct (även fast det är det i ramverket på sätt och vis) utan en värdetyp; när man pratar om en struktur så syftar man helt enkelt inte på t.ex. en int. Man syftar på någonting lite mer invecklat som t.ex. datetime eller message. Av den enkla anledningen särar jag på begreppen "enkla värdetyper" och strukturer.Sv: Vad gör egentligen new?
<i>Those names aren't perfect, because of what they really mean is “reference type” or “value type"</i>
Vad Eric säger är att de är samma sak (och det här jag dessutom hört honom säga och disskuterat med honom, inte bara läst och själv tolkat), inte att en viss implementation är annorlunda eller olika saker. Att du väljer att använda felaktig terminologi ur ett programspråksperspektiv får stå för dig men faktum kvarsstår. Värdetyper defineras som struct, en strukt kallas värdetyp. Sv:Vad gör egentligen new?
Jag tolkar följande:
<i>Those names aren't perfect, because of what they really mean is “reference type” or “value type"</i>
som:
Referenstyp kallas Object
Värdetyp kallas Struct <b>rent kodmässigt</b>
Förstår inte problemet...Sv: Vad gör egentligen new?
Jo, på den nivån är ju enda skillnaden vad de ärver :)