Hej! Du behöver importera Namespacet: Microsoft.VisualBasic Varför det? kodar man i VB tycker jag man gott kan fortsätta använda Left, Right o Mid. Ola, ja, men ArgumentException är väl oftare ett reultat av felaktig programmering än "data som inte riktigt passar in".. Ola, OK, men när frågar ett program efter den negativa positionen i en sträng? Antagligen aldrig, om det inte är nåt fel i programmet. Att däremot generellt vilja ta de första 30 tecknen i en sträng dvs Left(str,30) ger ju klart snyggare kod än Ola, Njae jag tycker fortfarande att negativa positioner för en sträng mycket sällan är ett scenario som inträffar. Om det inträffar är det antagligen ett fel i programmet. Fel kan göras, och man ska ha felhantering för också,naturligtvis. Men det inträffar inte exceptions i normalfallet med Left, Right, Mid. Intresant diskution (Skriver i C# eftersom jag är en C# programmerare, hoppas det är ok!?). Att du får mer kontroll köper jag, Ola: Jodå, det framgick. Ja, du "kan" göra dem säkrare, ibland, Ola, Andreas, Lite mindre Viktigpetter = lite mindre sarkasm! ;) Tyckte iofs att det var ganska relevant i sammanhanget att man inte diskuterade den riktiga koden som en "egen lösning" när det handlade om att man ofta inte kunde skriva lika säker kod på grund av slarv. Den riktiga .net-koden för Left,Mid,Right är samma kod som man vill skriva på egen hand om man inte vill använda VB-namespace. Alltså menade jag att det inte var relevant för diskussionen om koden VAR den faktiska implementationen i VB.Net, eller någons egen implementation. (koden kunde lika gärna vara exempel på någons egna implementation. Det är korrekt att jag hade varit mer korrekt om jag var mycket tydlig med detta, men jag såg ingen poäng med att bli så långrandig, vilket jag nu har blivit i alla fall...) right(), replace() etc fungerar inte
Har precis kommit på hur smart det är att kompilera kod till "affärsobjekt".
Men nu fungerar inte right(), replace() etc längre. Antar att det är ngt Namespace som skall importeras. Har försökt med lite olika utan lyckats.
Någon som har ngt förslag på vad man skall göra?
(Snart semster!!!=)Sv: right(), replace() etc fungerar inte
just replace() funktionen kan du använda så här (för strängar):
<code>
Dim strString As String = "Min fina 'sträng'"
strString = strString.Replace("'","''")
</code>
finn andra lösningar istället för att använda right(), left() osv .... kika på metoden .Substring() och hur den fungerar, hur den är överlagrad osv.
cya,
/PatrikBSv: right(), replace() etc fungerar inte
Fördelen med dessa är att metoden inte kastar exception om de positioner man anger ligger utanför strängen. T.ex. "Ola".Substring(5,1) ger ett exception. Det gör inte Left, Right o Mid. Vill man få exceptions är det ju kanon men oftast vill man väl inte det.
Om man är hundra procent säker på att det aldrig kan bli ett exception, så är väl substring några cykler snabbare och att föredra då. Men "better safe than sorry" anser jag. Substring med try catch bör kosta ungefär lika mycket som Mid().
Vad händer internt i frameworket med Mid()?
Troligen, en str.substring(x,y) inkl try catch, vilket man ändå vill ha i de allra flesta fall.
OlaSv: right(), replace() etc fungerar inte
Mycket riktig så använder <b>Mid</b> ett <b>SubString</b> anrop, samt att den gör lite kontroller att man inte försöker använda en negativ startposition, att man försöker skicka in en längd som är mindre än noll för då kommer man få ett <b>ArgumentException</b>.
Där emot så kastar både <b>Left</b> och <b>Right</b> ett <b>ArgumentException</b> som längden på operationen (andra parametern) är mindre än noll.Sv: right(), replace() etc fungerar inte
OlaSv: right(), replace() etc fungerar inte
<b>Fördelen med dessa är att metoden inte kastar exception om de positioner man anger ligger utanför strängen.</b>
Jag vet inte hur du ser på saken, men jag tycker att ett negativt värde är utan för stängen ? =)Sv: right(), replace() etc fungerar inte
Try
str.substring(0,29)
Catch ex As Exception
'bla bla
End Try
eller håller du inte med om det heller?
OlaSv: right(), replace() etc fungerar inte
Självklart men hur ofta används inte dynamiskt framtagna värden som parametrar till denna typen av funktioner? En miss på ett retur värde eller liknande så råkar man ut för ett exception. Givetvis sker inte detta om man programmerar korrekt, vilket långt ifrån alla gör och även om man kodat rätt så kan andra faktorer spela in som gör att det fel inträffar.
Jag har aldrig sagt att man skall använda <b>Substring</b> istället för <b>Left</b>, <b>Right</b> och <b>Mid</b> om man kodar VB.NET kom bara in i diskussionen för att påpeka att man visst kan råka ut för ett fel och att <b>Mid</b> inte är effektivare, bara lite säkrare (på så sätt att man kan vara lat som programmerare).Sv: right(), replace() etc fungerar inte
Och det där med lat tycker jag är ett fånigt argument.
Då kan man lika gärna dra till med att alla som inte kodar i assembler är lata programmerare som inte kan optimera ordentligt...
SÅ mycket extra kostar det inte i det här fallet.
Slutsats: man ska använda Left, Right Mid. Det är smart. :)
OlaSv: right(), replace() etc fungerar inte
Jag själv skulle först använda Substring före tex Mid, Left etc, men enbart för att använda de funktioner som medföljer i System namespacet. VisualBasic namepspacet är mer eller mindere ett namespace för att göra VB.Net bakåtkompatiblet.
Om vi tar en titt på hur Left är implementerat så använder den sig av Substring:
<code>
public static string Left(string str, int Length)
{
if (Length < 0)
{
...
throw new ArgumentException(....);
}
if ((Length == 0) || (str == null))
{
return "";
}
if (Length >= str.Length)
{
return str;
}
return str.Substring(0, Length);
}
</code>
Så jag som programmerare skulle använt mig av Substring istället för Left, delvis för att Left redan använder Substring själv samt att få mer kontroll på att datan som jag anävnder är verkligen korrekt. Så jag skulle skrivit något likt detta:
<code>
if (Length >= str.Length)
{
return str;
}
return str.Substring(0, Length);
</code>
Alltså gjort en "Replace Exception With Test".
Mid använder sig också av Substring:
<code>
public static string Mid(string str, int Start, int Length)
{
if (Start <= 0)
{
...
throw new ArgumentException(...);
}
if (Length < 0)
{
...
throw new ArgumentException(...);
}
if ((Length == 0) || (str == null))
{
return "";
}
int num1 = str.Length;
if (Start > num1)
{
return "";
}
if ((Start + Length) > num1)
{
return str.Substring((Start - 1));
}
return str.Substring((Start - 1), Length);
}
</code>
Så här skulle jag också använt mig av Substring istället för Mid i min kod. MEN OBS! Endast för att uindvika använda VisualBasic namespacet och använda så mkt som möjligt av System namespacet.
Jag säger inte att det är fel att använda Mid eller att anvönda Substring, det är upp till dig som programmerare att gör det du känner är bäst. Jag själv vill har mer kontroll över hanteringen av min data, detta för att göra koden mer säker.
/Fredrik Normén NSQUARED2
http://normen.mine.nu/myblogSv: right(), replace() etc fungerar inte
och ibland kanske man faktiskt vill ha exception. Dä är ju saken solklar.
ELLER om man eventuellt planerar att porta koden till Mono/Linux..
(men hur ofta görs det?)
Säkrare? Det köper jag inte. Jag är rätt säker på att Mid, Right, Left är 100% buggfria funktioner, och extremt säkra att använda.
Om man skriver funkioner själv som redan finns, ökar risken för fel i programmet.
Även substring/c# kådare har väl sina lata eller slarviga dagar, det är lätt att glömma eller slarva med felhanteringen, och därmed introducera ett fel i programmet.
OlaSv: right(), replace() etc fungerar inte
>Säkrare? Det köper jag inte. Jag är rätt säker på att Mid, Right, Left är 100% buggfria funktioner, och >extremt säkra att använda.
Det som kanske inte framgick så bra i mitt inlägg, var att jag syftade inte enbart på Substring etc utan över huvudtaget. Genom att själv ha kontrollen "kan" göra koden säkrare. Självklart kan jag som alla andra få till en bugg.
>Om man skriver funkioner själv som redan finns, ökar risken för fel i programmet.
>Även substring/c# kådare har väl sina lata eller slarviga dagar, det är lätt att glömma eller slarva med >felhanteringen, och därmed introducera ett fel i programmet.
Självklart, men det är därför man har enhets-testning ;)
Som jag nämnde tidigare så är jag inte en VB.Net kodare, har aldrig gillat VB även om jag har programmerat i det i över 7 år. Jag föredrar C# och varför behöver jag inte gå in på, för jag vet att ALLA tycker olika. Men om jag skulle använda VB.Net så skulle jag inte använda mig av Microsoft.VisualBasic namespacet. Det namespacet introducerades för att få VB programmerare att inte förlora tidigare VB funktionalliteter när de kodar i VB.Net. Om jag inte har fel så när pre-alphan av .Net 1.0 kom, så fanns inte Microsoft.VisualBasic namespacet, det kom till senare för att många VB programmerare ville fortfarande kunna använda metoder som just Mid etc.
MEN som du säger Ola, så är risken störtre speciellt för "nybörjare" att få buggar i sin kod om de använder Substring, eftersom det kräver mer av programmeraren att hantera fel och valideringar (med validaeringar menat jag kontroll av ländg på strängen etc) etc. Och då tycker jag att Mid etc ska användas för att minimera risken för fel.
/Fredrik Normén NSQUARED2
http://normen.mine.nu/myblogSv: right(), replace() etc fungerar inte
men sannolikheten att du gör t.ex. Mid, Left, Right eller liknande standardfunktioner "säkrare" är inte så stor. Sannolikheten att du introducerar en bugg är större :)
Enhetstestning i all ära, men oavsett hur man testar är den mänskliga faktorn med i spelet, man kan missa att testa en viss del, och det är lätt hänt att inte testa ordentligt.
Ja, risken är större för "nybörjare", men större risk finns för alla. Programmerare som har jobbat i många år kan missa felhanteringen, det har hänt, jag lovar! :)
(en del konsulter som jag stött på är rent av notoriskt slarviga på den punkten, har jag fått erfara. De verkar resonera som så att om det blir fel i programmet så blir det ju fler konsulttimmar senare).
Vill man i C# ha motsvarande Mid, Right, Left tycker jag ett rimligt alternativ är att man skriver dessa funktioner själv, som du visat tidigare. Det går väl bra, och så bygger man in dem i sin egna utility-DLL, i sitt egna namespace. Som man då blir beroende av i stället för VisualBasic. Och som kan innehålla fel :)
Vi behöver inte gå in på VB.NET vs C#, kan bara säga att jag har ingenting emot C# egentligen, föredrar VB mest för att jag är van vid syntaxen och jag ser inte något anledning att byta språk nu
(plus att i vår organisation är det bestämt att vi ska fortsätta med VB så jag har liksom inget val)
OlaSv: right(), replace() etc fungerar inte
<b>Vill man i C# ha motsvarande Mid, Right, Left tycker jag ett rimligt alternativ är att man skriver dessa funktioner själv, som du visat tidigare</b>
Vill bara påpeka att fredriks kod inte var exempel på hur man kan skriva dem själv utan det var den faktiska koden som VB funktionerna bygger på.Sv: right(), replace() etc fungerar inte
Tack för förtydligandet! Utan detta förtydligande hade diskussionen aldrig kunna fortsätta.
Du är en hjälte.
OlaSv: right(), replace() etc fungerar inte
OlaSv: right(), replace() etc fungerar inte
Om man är viktigpetter för man sakligt argumenterar så är jag nog en sådan då, men var passar sarkasemn in i det sammahanget ? He he, nää du har inget otalt med dig men det var inte direkt taktfullt hanterat av dig =)Sv: right(), replace() etc fungerar inte
:)
Ola