webForumDet fria alternativet

deklarera functions som publika

.NET

22 svar · 1 145 visningar · startad av ekenman

Medlem sedan apr. 200712 inlägg
Frågan#1

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.

Tack på förhand.

Medlem sedan feb. 2005280 inlägg
#2

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;
}

anropa med

string t = Utils.MyFunction(t);
Medlem sedan apr. 200712 inlägg
#3

Man tackar!

Medlem sedan feb. 2005280 inlägg
#4

Tänk bara på trådsäkerheten.

jag föreslår en lite jobbigare men säkrare väg

public class Util
{

        public static Util CreateInstance()
        {
            return new Util();
        }
        public string MyFunction(string text)
        {
            ....
            return text;
        }
}

som då anropas

string MyText = Util.CreateInstance().MyFunction(MyText);
Medlem sedan dec. 19996 522 inlägg
#5

Det första exemplet vad lika säkert som ditt andra

Medlem sedan juni 20008 205 inlägg
#6

freguz skrev:

Tänk bara på trådsäkerheten.

*** snip

som då anropas

string MyText = Util.CreateInstance().MyFunction(MyText);

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 :) )

Medlem sedan aug. 20003 575 inlägg
#7

Kika på Extensions :D

Medlem sedan sep. 2005673 inlägg
#8

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...

Medlem sedan feb. 2005280 inlägg
#9

erka skrev:

Det första exemplet vad lika säkert som ditt andra

Jag tänkte mig mer vidlyftig statisk metod som har referenser utanför metoden, då borde väl den CreateInstance() vara trådsäkrare? :OO

Medlem sedan maj 20012 812 inlägg
#10

inspiro skrev:

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.

- M

Medlem sedan feb. 2005280 inlägg
#11

Gladh skrev:

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)

Medlem sedan apr. 200712 inlägg
#12

Jag kanske var lite snabb att tacka eftersom jag nu är än mer förvirrad. Kanske för att jag skriver VB och inte har koll på C#.

Jag får inte deklarera en klass som statisk i VB :(

Medlem sedan jan. 20022 440 inlägg
#13

Jo det kan du visst göra

public [b]shared[/b] function dostuff
(
  'Do stuff
)
Medlem sedan juni 20008 205 inlägg
#14

freguz skrev:

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.

Medlem sedan sep. 2005673 inlägg
#15

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:

Istället för att skriva så här varje gång:

ClientScript.RegisterStartupScript(typeof(Page), "Namn", "<script language='javascript'>alert('Mitt meddelande')");

Så tänkte jag göra en statisk metod:

public static void JavaAlert(string Name, string Message)
    {
        System.Web.UI.Page Page = new Page();
        Page.ClientScript.RegisterStartupScript(typeof(Page), Name, "<script language='javascript'>alert('" + Message + "')");
    }

...som man kan anropa så här:

StaticMethods.JavaAlert("Namn", "Mitt meddelande");

Får inget fel men det fungerar inte. Och är det trådsäkert?

Medlem sedan apr. 200712 inlägg
#16

Tack för hjälpen

Nu är jag med! Det funkar!!! Tack alla för hjälpen och ert tålamod. (y)

Medlem sedan juni 20008 205 inlägg
#17

inspiro skrev:

public static void JavaAlert(string Name, string Message)
    {
        System.Web.UI.Page Page = new Page();
        Page.ClientScript.RegisterStartupScript(typeof(Page), Name, "<script language='javascript'>alert('" + Message + "')");
    }

...som man kan anropa så här:

StaticMethods.JavaAlert("Namn", "Mitt meddelande");

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:

public static void RegisterJavascriptAlert(Page page, string Name, string Message)

{
    page.ClientScript.RegisterStartupScript(page.GetType(), Name, "<script language='javascript'>alert('" + Message + "')");
}
...
DinKlass.RegisterJavascriptAlert(page, "namn", "meddelande");

(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).

Medlem sedan sep. 2005673 inlägg
#18

spango skrev:

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. :)

Medlem sedan juni 20008 205 inlägg
#19

inspiro skrev:

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?

Medlem sedan sep. 2005673 inlägg
#20

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
128 ms — deklarationer (db)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)
121 ms — ändringar (db)