webForumDet fria alternativet

C# Effektiv kod

5 svar · 481 visningar · startad av jabbalizer

jabbalizerMedlem sedan jan. 2001229 inlägg
#1

Vilket är effektivast av följande?

try
{
    foreach (TextBox tb in row._boxArray)
        if (tb.Enabled)
        {
            int originalValue = int.Parse(tb.Text);
            tb.Text = random.Next(row._lowerLimit, row._higherLimit + 1).ToString();

        }
}catch (FormatException){}

eller

foreach (TextBox tb in row._boxArray)
    if (tb.Enabled)
    {
        try
        {
            int originalValue = int.Parse(tb.Text);
            tb.Text = random.Next(row._lowerLimit, row._higherLimit + 1).ToString();
        }catch (FormatException){}
     }

Alltså:

Bör man lägga try-catch så nära det farliga området som möjligt, eller kräver det kanske mindre resurser om man gör try-catch en enda gång i stället för 10 eller 100?

NickemannenMedlem sedan aug. 20003 575 inlägg
#2

Jag tycker du skall välja alternativ 1. Sålänge som du inte vill att den skall kunna köra vidare foreach-loopen och bara spara ner exceptionet som kastas.

cokMedlem sedan dec. 2005664 inlägg
#3

Vad använder du originalvalue till? Är det endast för att validera input i textboxen? Isf kanske det är ide att skapa en class som ärver av textbox och hantera detta där istället? Bara en fundering.. :)

Isf kan du hantera det redan när du lämnar textboxen, hantera olika typera av data (datetime, double text etc.).

PhorpherMedlem sedan feb. 20002 300 inlägg
#4

Generellt vill man nog hantera fel så nära felkällan som möjligt men i det här fallet så kan det vara bättre att köra med alt. 1. Try/Catch suger rejält med prestanda.

Om du använder framework 2.0 och vill undvika exceptions helt så kan du i det här fallet använda metoden TryParse(string str, out intVal) som returnerar true om konverteringen lyckades och false om den misslyckades.

jabbalizerMedlem sedan jan. 2001229 inlägg
#5

Tack för de svaren =)

Nickemannen: Nej jag har inget behov av att fortsätta foreach. =)

cok: Koden var inte färdig när jag hindrades av min fundering. Såhär ser det ut nu:

int originalValue = int.Parse(tb.Text);
tb.Text = random.Next(Math.Max((originalValue - originalValue/10 -1 ),row._lowerLimit), Math.Min((originalValue + originalValue/10 +1 ),row._higherLimit) + 1).ToString();

Jag slumpar helt enkelt ett nytt värde till textfältet som avviker max 10%av ursprungsvärdet plus/minus 1. Plus/minus är med för att 1-9 ska kunna bli mindre, och för att 0-9 ska kunna bli större. Endast positiva värden används.

Phorpher: Det låter ju som en bra grej. Om inte annat så blir det kanske mindre kod.

Nu ligger ju denna kod i ett användargränssnitt, så det är ju lite att skjuta flugor med elefantbössan. Men man är ju nyfiken!

GladhMedlem sedan maj 20012 812 inlägg
#6

phorper skrev:

Try/Catch suger rejält med prestanda.

Det har inte jag läst, däremot så suger en exception som kastas rejält med prestanda, medans en try/catch inte tar speciellt mycket prestanda, knappt märkbar.

Men eftersom en exception suger prestanda, så skall man precis som du säger göra en TryParse istället för en try/catch om det nu är där som man kan få felet. Generellt kan man säga att alla fel som du kan förvänta dig, skall du lösa utan en try/catch, och detta är ett typ exempel på ett sådant fel, likadant med filer som inte finns...

- M

135 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)