Testade lite med skillnad mellan C# och VB.Net och skrev då följande kod som fick ödesdigra testresultat: >Det intressanta är att i bara blir 0 i första For-loopen sedan behåller den sitt värde... >>Men block begränsar bara åtkomsten till en variabel (du kan inte använda i utanför yttre For loopen), inte livslängden. Detsamma gäller för övrigt C#. >är du helt säker på detta hehe..jaja, där ser man...Tur att man inte pysslar med VB.Net så mycket mao...Intressant...
Dim j As Integer = 100000
Dim list(,) As String = New String(10, j) {}
Dim tot As Double = 0
Dim k As Integer
For k = 0 To 10 - 1 Step k + 1
Dim i As Integer
For i = 0 To j - 1 Step i + 1
list(k, i) = k.ToString() + i.ToString()
Next
Next
Det intressanta är att i bara blir 0 i första For-loopen sedan behåller den sitt värde...Nåja, intressant och intressant men om man är van att skriva i språk där en For-loop är ett block så kan ju detta vara ett hål att trilla ner i.
Lärdom skriv i så fall: Dim i As Integer=0 eller Dimma den högst upp och sätt i=0 i varje runda....
/JohanSv: Intressant...
Att i behåller sitt värde är egentligen inget problem, det är bara indirekt orsak till det som händer. Det egentliga problemet är att du använder den något udda konstruktionen
Step i + 1
för att sätta steglängden. Eftersom i efter första loopen är 9 så blir steglängden 10 i fortsättningen och därför körs loopen bara med i = 0.
>Nåja, intressant och intressant men om man är van att skriva i språk där en For-loop är ett block
For...Next är ett block i VB.NET också. Men block begränsar bara åtkomsten till en variabel (du kan inte använda i utanför yttre For loopen), inte livslängden. Detsamma gäller för övrigt C#.
I v1.1 har kan man begränsa åtkomsten till loopvariabeln till det For(Each) block den används i med syntaxen
For i As Integer = 0 To j - 1
>Dimma den högst upp och sätt i=0 i varje runda....
Du behöver inte nödvändigtvis flytta deklarationen, att sätta tillbaka till 0 skulle räcka.
MSSv: Intressant...
är du helt säker på detta, koden som jag körde i C# ser ut på exakt samma sätt...rent strukturmässigt men där initieras variablen till 0 vilket den uppenbarligen inte gör i VB.Net. Alltså när jag testar i andra gången har den redan maxvärdet (100000) i VB.Net men inte i C#...
Hur blir i=9 i första for-loopen?
----
Körde lit test på morgonen och mina farhågor besannades. Följande kod körs i C#:
int j=100000;
string[,] list=new string[10,j];
int k=0;
for(;k<10;k++)
{
int i;
for(i=0;i<j;i++)
{
list[k,i]=k.ToString() + i.ToString();
}
Console.Out.WriteLine(i.ToString());
}
Console.In.ReadLine();
}
resultatet blir:
100000
100000
100000
100000
100000
etc...
Fölajnde kod körs i VB.Net:
Dim j As Integer = 100000
Dim list(,) As String = New String(10, j) {}
Dim k As Integer
For k = 0 To 10 - 1 Step k + 1
Dim i As Integer
For i = 0 To j - 1 Step i + 1
list(k, i) = k.ToString() + i.ToString()
Next
Console.Out.WriteLine(i.ToString())
Next
Console.In.ReadLine()
vilket gav resultatet:
100000
100001
100002
100003
etc..
---EDIT 08:51------
Fast nu har jag tänkt lite och skillnaden ligger förmodligen i att VB.Net har sin for sats deklaration som i=0 To X vilket alltså då borde motsvaras av for(;i<x;i++) i C#...dvs den sätter inte i=0 första gången...eller???
/Johan
För övrigt var koden genererad av en C# --> VB.Net konverterare så jag tar inget ansvar för den exakta översättningenSv: Intressant...
Ja
>men där initieras variablen till 0 vilket den uppenbarligen inte gör i VB.Net.
Joo, det gör den även i VB.NET. Som jag försökte säga tidigare så är problemet inte initieringen, utan att steglängden du anger beror på nuvarande värdet på i.
>Alltså när jag testar i andra gången har den redan maxvärdet (100000) i VB.Net men inte i C#...
Just det. I VB.NET sker utvärderingen av steglängdsuttrycket (i + 1) innan i på nytt tilldelas startvärdet för loopen. Därför blir steglängden för lång andra rundan.
>Hur blir i=9 i första for-loopen?
Oops. Borde sagt att den blir (j-1) efter första loopen. Jag minskade i till 10 för att få lite rimligare utskrifter att glo på, därav nian.
>För övrigt var koden genererad av en C# --> VB.Net konverterare så jag tar inget ansvar för den exakta översättningen
Jaha, det var ju ännu en utmärkt anledning att inte förlita sig på sådana. Den här gör ju uppenbarligen ett rätt dåligt jobb. Bättre att lära sig språken ordentligt själv, och göra eventuell konvertering manuellt.
MSSv: Intressant...
Jag trodde att Step i+1 egentligen var en onödig grej att skriva ut eftersom den körde det "by default".Jaja, man lär sig något nytt varje dag och tur är väl det.
Tack MS för svaren iallafall. Trots att jag tvivlade..
/Johan