Jag har ett gammalt bibliotek med stränghantering osv som jag vill använda i .NET. Måste jag lägga dem i en class och skapa ett ny instans varje gång jag ska använda en funktion?
Säkert inte men jag är ny med det här så jag skulle uppskatta lite hjälp.
Nej, jag brukar köra med en sån klass med massa "bra att ha" grejer i, och det är bara att skapa en klass och sen lägga statiska funktioner i den, så blir det bara att anropa rakt av.
om klassen heter Utils tex:
public static string MyFunction(string text)
{
...
return text;
}
Båda är som sagt lika säkra/osäkra, eftersom du kan skicka iväg Utils-objektet till andra trådar, men det tar mer tid och minne att skapa ett nytt objekt bara för att man vill anropa en metod. Ska statiska funktioner manipulera ett delat tillstånd någonstans är ThreadStaticAttribute en höjdare. Anta att vi har en klass Foo som är tämligen dyr att skapa instanser av, så vi vill cacha dem i en dictionary.
public static class Utils
{
[ThreadStatic]
private static IDictionary<string, Foo> fooCache;
private FooCache
{
get
{
if (fooCache == null) fooCache = new Dictionary<string, Foo();
return fooCache;
}
}
public static Foo GetFooByName(string name)
{
Foo f;
if (!FooCache.TryGet(name, out f))
{
f = new Foo(name);
FooCache.Add(name, f);
}
return f;
}
}
fooCache pekar då på olika objekt i alla trådar. (Detta innebär vidare att alla trådar då har varsin uppsättning av Foo-instanser osv, men for exemplets skull kan vi anta att de funkar på ett sånt sätt att det inte gör något :) )
Men om jag gör en statisk metod som exempelvis gör första bokstaven i en sträng versal, övriga gemener... vad är det som kan gå fel? Förstår inte det riktigt...
Men om jag gör en statisk metod som exempelvis gör första bokstaven i en sträng versal, övriga gemener... vad är det som kan gå fel? Förstår inte det riktigt...
Om du menar med trådsäkerhet, så antagligen ingenting.
Så länge du håller dig i din egen metod och inte anropar någon variabel deklarerard i klassen så är du trådsäker i din egen klass. Om du däremot anropar metoder från andra klasser så är det ju inte säkert att du är trådsäker längre, eftersom de metoder som du anropar kanske inte är trådsäkra.
Men om du anropar en metod som tar emot en sträng, och i denna metod så sätter du första bokstaven till versal och övriga till gemener, och allt det sker i den metoden med den sträng som du skickat med, så är du trådsäker, då dessa variabler får en egen minnesrymd och inte delas med någon annan tråd.
Men om du anropar en metod som tar emot en sträng, och i denna metod så sätter du första bokstaven till versal och övriga till gemener, och allt det sker i den metoden med den sträng som du skickat med, så är du trådsäker, då dessa variabler får en egen minnesrymd och inte delas med någon annan tråd.
- M
Ok, en tråd kan inte "stanna upp" lite i en statisk metod och bli "omkörd" av en annan tråd, och därmed få fel värden i sina variabler? (angående exmplet med sträng-versal-gemener)
Ok, en tråd kan inte "stanna upp" lite i en statisk metod och bli "omkörd" av en annan tråd, och därmed få fel värden i sina variabler? (angående exmplet med sträng-versal-gemener)
Nix, varje tråd har sin egen anropsstack, så det är lugnt. Man kan se varje anrop av en metod som en instans av den metoden, och lokala variabler som privata medlemsvariabler.
Jag håller på med en statisk klass nu där jag ska samla små enkla metoder för att förenkla saker jag gör ofta. Nu försöker jag göra en statisk metod som använder metoden RegisterStartupScript men det fungerar inte så bra (man kanske inte ens kan/ska göra det med tanke på det här med trådsäkerhet?). Så här tänkte jag iaf:
Får inget fel men det fungerar inte. Och är det trådsäkert?
Anledningen till att det inte funkar är för att du aldrig använder Page-objektet som du registrerar scriptet på. Du skapar det i metoden, men skickar inte ut några referenser till det, vilket innebär att det kommer försvinna nästa gång GC:n körs. Skicka in Page-objektet som en parameter utifrån istället:
(Tog mig friheten att förbättra namnet. Javascript != Java :) )
Det är trådsäkert (åtminstone så länge inga andra trådar använder Page-objektet), men det kommer paja så snart du skickar in en sträng som har en enkelfnutt i sig (i värsta fall öppna för cross-site scripting som låter folk komma åt dina användares hemligheter).
men det kommer paja så snart du skickar in en sträng som har en enkelfnutt i sig (i värsta fall öppna för cross-site scripting som låter folk komma åt dina användares hemligheter).
Hm, får inte igång det ändå trots att jag skickar in mitt page-object... har försökt med this.Page på aspx-sidan som anropar metoden, är det fel? Får inget felmeddelande men den lägger aldrig till mitt script.
Enkelfnuttar kanske man kan fixa med en replace på Message-strängen.
Nä, java och javascript är förstås inte samma sak, tack för påpekandet, rätt ska vara rätt. :)
har försökt med this.Page på aspx-sidan som anropar metoden, är det fel? Får inget felmeddelande men den lägger aldrig till mitt script.
Jag kan inte asp.net, så jag har ingen aning, men det låter ju onekligen som om det borde vara rätt. Har du dubbelkollat att metoden verkligen anropas?
Jo, metoden körs... ska man returnera något kanske, men i så fall vad? Det borde man ju inte behöva göra? En halvfånig metod kanske, den tillför ju egentligen inte så mycket... men man vill ju få igång den nu ändå. :)
264 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e