BrimbaMedlem sedan dec. 19995 875 inlägg Hej!
Har lite problem...
string msgBody;
foreach (DataRow dr in dt.Rows)
{
msgBody = msgBody + "username: " + dr["name"] + "<br>password: " + dr["psw"];
}
Response.Write(msgBody);
Följande felmeddelande:
Description: An error occurred during the compilation of a resource required to service this request. Please review the following specific error details and modify your source code appropriately.
Compiler Error Message: CS0165: Use of unassigned local variable 'msgBody'
Source Error:
Line 44: msgBody = msgBody + "username: " + dr["name"] + "<br>password: " + dr["psw"];
Line 45: }
Line 46: Response.Write(msgBody);
Line 47: %>
Line 48:
tips?
------------------
Mvh
Patrik aka Brimba
[Redigerat av Brimba den 03 jan 2002]
BrimbaMedlem sedan dec. 19995 875 inlägg Tydligen var man tvungen att deklarera den såhär:
string msgBody = "";
För då fungerade det perfekt...
------------------
Mvh
Patrik aka Brimba
"string" (som i C# är samma sak som "System.String") är en "reference type" (till skillnad från en "value type". Det är A och O att förstå skillnaden på dessa två. Exempelvis kan du skriva "int i" och använda i direkt efteråt, eftersom i är en value type som initieras till 0 (på stacken).
"Tydligen var man tvungen att deklarera den såhär" är således inte korrekt. Felet var att du aldrig skapat en sträng-instans men ändå försökte använda den (första gång försöker du lägga till saker till msgBody som ju inte är instansierad). Genom att göra tilldelningen till en tom sträng gör du egentligen:
System.String s = new System.String("");
Jag rekommenderar starkt att du skaffar dig en förståelse för detta, det kommer hjälpa dig i framtiden (att inte förstå det kommer ge dig onödiga problem). En mycket bra artikel som beskriver detta är: http://msdn.microsoft.com/msdnmag/issues/1200/dotnet/dotnet1200.asp
NETworkMedlem sedan juni 20011 732 inlägg Med andra ord så kan (ska?) man skriva:
foreach (DataRow dr in dt.Rows)
{
string msgBody = msgBody + "username: " + dr["name"] + "<br>password: " + dr["psw"];
}
Response.Write(msgBody);
Eller tänker jag fel? För man behöver väl inte skapa en instans av en sträng varje gång?
------------------
Jag kan inte komma på någon signatur.
[Redigerat av NETwork den 05 jan 2002]
NETwork: Nej, du måste instansiera msgBody innan du börjar använda den.
Har du inte instansierat strängen när du kör
string msgBody = msgBody + "username: " + dr["name"] + "<br>password: " + dr["psw"];
så får du fortfarande fel, du försöker ju fortfarande lägga till värden till en icke-instansierad variabel.
------------------
det finns ingen.info tillgänglig.
"inside every human being there's an american trying to get out".
BrimbaMedlem sedan dec. 19995 875 inlägg developer eller sgtpepper.
Hur hade ni skrivit den koden?
------------------
Mvh
Patrik aka Brimba
SPiNMedlem sedan mars 20007 896 inlägg Jag är inte schassen eller developer, men jag skulle skrivit koden som du gjort. Tror inte att det går att göra på något annat sätt, om man inte använder new, som developer visade. Strängen måste ju nämligen vara tom från början, den kan inte vara null - eftersom att du vill bygga på den.
New-operatorn, fungerar den likadant som i C++ eller Java i C#? I C++ används den för att dynamiskt allokera minne, och i Java för att skapa instanser av klasser. Men i C#?!
Red.} Sådärja, nu var det ändrat. Schassen != developer. ;)
------------------
SPiN, bjorne.w@telia.com
-- En ask vet jag stånda - den Yggdrasil heter, ett väldigt träd överöst av vita sanden. --
[Redigerat av SPiN den 06 jan 2002]
NETworkMedlem sedan juni 20011 732 inlägg Ursäkta min amatörmässighet, men jag måste fråga. :)
Detta
System.String msgBody = new System.String(msgBody + "username: " + dr["name"] + "<br>password: " + dr["psw"]);
och detta
string msgBody = msgBody + "username: " + dr["name"] + "<br>password: " + dr["psw"];
är samma sak? För om jag fattade det rätt så instansieras ju en sträng automatiskt om jag tilldelar den ett värde, precis som när du skriver:
string MinString = "";
------------------
Jag kan inte komma på någon signatur.
SPiNMedlem sedan mars 20007 896 inlägg Jag tror inte att något av dina exempel fungerar, därför att i exempel två finns ju inte msgBody när du försöker konkatetera den med strängen första gången.
string msgBody = [b]msgBody[/b] + "username: " + dr["name"] + "<br>password: " + dr["psw"];
Du är tvungen att göra så här:
string msgBody = "";
...
msgBody = msgBody + "username"...
// msgBody += "username"... Går ju snabbare att skriva :)
Eller:
System.String msgBody = new System.String ( "" );
...
msgBody += "username"...
Ditt första exempel kommer inte heller att fungera då msgBody redan är en instans av klassen System.String, och du försöker deklarera en ny med new.
------------------
SPiN, bjorne.w@telia.com
-- En ask vet jag stånda - den Yggdrasil heter, ett väldigt träd överöst av vita sanden. --
Brimba:
Hur hade ni skrivit den koden?
Antagligen precis som du gjorde efter att du rättat dig själv :).
SPiN:
om man inte använder new, som schassen visade
Det var inte jag, det var developer :).
------------------
det finns ingen.info tillgänglig.
"inside every human being there's an american trying to get out".
[Redigerat av sgtpepper den 06 jan 2002]
NETworkMedlem sedan juni 20011 732 inlägg Ops, nej det fungerar ju inte förstås. :) Men jag menar att om man vill instansiera en ny sträng och ge den ett annat värde, exempelvis värdet av två andra _redan instansierade_ strängar så kan man väl skriva:
string NySTring = GammalString1 + GammalString2;
Eller bör man ändå skriva:
string NyString = "";
NyString = GammalString1 + ... ;
Och vad menas med att en int är en "value type" medan en string är en "reference type"? För developer skrev att man kan skriva "int i" och sedan använda den direkt, men jag vill påstå att jag även kan göra det med en sträng. Är ganska säker på att jag har skrivit så som jag skrev ovan och att det fungerar bra (kan tyvärr inte prova själv för jag sitter med en .net-lös dator för tillfället).
------------------
Jag kan inte komma på någon signatur.
icaaqMedlem sedan okt. 20005 273 inlägg
Mozilla/4.0 (compatible; MSIE 6.0b; Windows NT 5.0; .NET CLR 1.0.2914)
...hmmm :OO
Lite OT men ändå
------------------
kolung.....det tål att tänkas på!
SPiNMedlem sedan mars 20007 896 inlägg Det spelar ingen roll vilket sätt du använder, de funkar likadant båda två.
Ang. att du kan skriva:
int i;
i++;
och inte
string str;
str += "abc";
Kan du endast använda int, double, float, byte, char plus någon jag har glömt på det sättet. Det beror på att string är just en reference type som är en "genväg" till att använda System.String skulle jag gissa på, medan en int kan ha ett värde och inte pekar mot klassen Integer, på det sätt som string gör.
Är inte helt säker dock, så vi ropar på sgtpepper eller developer, så får de sprida lite ljus över frågan. :)
------------------
SPiN, bjorne.w@telia.com
-- En ask vet jag stånda - den Yggdrasil heter, ett väldigt träd överöst av vita sanden. --
SPiN, du är på rätt spår i din senaste förklaring. Jag rekommenderar fortfarande läsning av länken jag skickade tidigare för er som inte förstått skillnaden mellan reference och value types.
Jag skulle möjligtvis skriva:
string msgBody = "";
foreach (/**/)
{
msgBody += "username: " + dr["name"] + "<br>password: " + dr["psw"];
}
men hellre:
StringBuilder msgBody = new StringBuilder();
foreach (/**/)
{
msgBody.Append("username: ");
msgBody.Append(dr["name"]);
msgBody.Append("<br>password: ");
msgBody.Append(dr["psw"]);
}
När man som du gör += massor av gånger, new:as ju en ny sträng varje gång, vilket är helt onödigt och dödar prestanda. Därför finns StringBuilder. Läs på http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndotnet/html/dotnetperftips.asp
BrimbaMedlem sedan dec. 19995 875 inlägg Tack developer och ni andra.
Någon som har en länk till tilldelnings- och jämförelseoperatorer i c#?
------------------
Mvh
Patrik aka Brimba
BrimbaMedlem sedan dec. 19995 875 inlägg Om jag nu använder mig utav StringBuilder(), så undrar jag nu hur jag returnerar värdet ur den, från en funktion.
Förut gjorde jag bara:
return msgBody;
Vilket inte gick så bra nu.
------------------
Mvh
Patrik aka Brimba
BrimbaMedlem sedan dec. 19995 875 inlägg Skulle även vara tacksam för lite allmän information om diverse saker.
Hur tyder man denna sidan: http://www.aspnextgen.com/quickstart/aspplus/samples/classbrowser/cs/classbrowser.aspx?assembly=mscorlib&namespace=System.Text&class=StringBuilder
Även tips på nybörjarfel, även om jag vill göra dom också, är det alltid roligt att veta vad man kan hitta bra information att lära sig osv.
Jag har varken programmerat i c++ eller java.
------------------
Mvh
Patrik aka Brimba
NETworkMedlem sedan juni 20011 732 inlägg icaaq: Hehe, ojdå visste inte att .net var installerat på den datorn jag använde igår. :o Jaja.
Hm, en annan sak som jag ser nu... på den här datorn kör jag win xp, på datorn jag använde igår var w2k installerad. I raden nedan kan jag läsa att winXP = NT 5.1 och w2k = NT 5.0 ...
Bara en OT-reflektion... hm.
[Redigerat av NETwork den 07 jan 2002]
Brimba:
Om jag nu använder mig utav StringBuilder(), så undrar jag nu hur jag returnerar värdet ur den, från en funktion.
Använd metoden ToString(). Den returnerar den sträng som StringBuilder-objektet representerar.
return msgBody.ToString();
Hur tyder man denna sidan:
Det är API-dokumentationen för klasses StringBuilder.
Det som bland annat är intressant i listningen är de olika metoder som klassen har samt metodernas returtyp och parameterlista. I listningen kan du snabbt få en överblick över vilka metoder/fält du har att jobba med på objekt av klassen.
Som du ser så listas en del metoder flera gånger. Det som skiljer de åt är antalet parametrar de tar eller typ på parametrarna, vilket kallas metodöverlagring.
T.ex så finns metoden Append() i en mängd implementationer, det som skiljer de olika implementationerna åt är parameterlistan.
------------------
Peer's Law
The solution to a problem changes the problem.