---
title: "deklarera functions som publika"
type: "forum-thread"
url: "https://www.webforum.nu/amne/dotnet/168808-deklarera-functions-som-publika"
topic: ".NET"
topic_url: "https://www.webforum.nu/amne/dotnet"
author: "ekenman"
published: "2008-02-07T17:04:23.000Z"
updated: "2008-02-14T13:05:42.000Z"
replies: 22
views: 1150
page: 1
pages: 2
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/dotnet/168808-deklarera-functions-som-publika"
---

# deklarera functions som publika

_Sida 1 av 2._

## #1 — ekenman, 2008-02-07T17:04Z

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.

Permalänk: https://www.webforum.nu/p/168808

## #2 — freguz, 2008-02-07T17:21Z

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);
```

Permalänk: https://www.webforum.nu/p/2078222

## #3 — ekenman, 2008-02-11T14:43Z

Man tackar!

Permalänk: https://www.webforum.nu/p/2078999

## #4 — freguz, 2008-02-11T14:49Z

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);
```

Permalänk: https://www.webforum.nu/p/2079001

## #5 — erka, 2008-02-11T15:16Z

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

Permalänk: https://www.webforum.nu/p/2079004

## #6 — spango, 2008-02-11T15:32Z

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

Permalänk: https://www.webforum.nu/p/2079009

## #7 — Nickemannen, 2008-02-11T15:45Z

Kika på Extensions :D

Permalänk: https://www.webforum.nu/p/2079019

## #8 — inspiro, 2008-02-12T07:20Z

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

Permalänk: https://www.webforum.nu/p/2079123

## #9 — freguz, 2008-02-12T07:25Z

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

Permalänk: https://www.webforum.nu/p/2079124

## #10 — Gladh, 2008-02-12T07:31Z

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

Permalänk: https://www.webforum.nu/p/2079126

## #11 — freguz, 2008-02-12T07:55Z

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

Permalänk: https://www.webforum.nu/p/2079133

## #12 — ekenman, 2008-02-12T23:22Z

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

Permalänk: https://www.webforum.nu/p/2079307

## #13 — CatZ, 2008-02-13T06:18Z

Jo det kan du visst göra

```
public [b]shared[/b] function dostuff
(
  'Do stuff
)
```

Permalänk: https://www.webforum.nu/p/2079327

## #14 — spango, 2008-02-13T09:03Z

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

Permalänk: https://www.webforum.nu/p/2079349

## #15 — inspiro, 2008-02-13T10:07Z

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?

Permalänk: https://www.webforum.nu/p/2079358

## #16 — ekenman, 2008-02-13T11:33Z

Tack för hjälpen

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

Permalänk: https://www.webforum.nu/p/2079376

## #17 — spango, 2008-02-13T12:30Z

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

Permalänk: https://www.webforum.nu/p/2079398

## #18 — inspiro, 2008-02-13T12:54Z

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

Permalänk: https://www.webforum.nu/p/2079414

## #19 — spango, 2008-02-13T13:01Z

> **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?

Permalänk: https://www.webforum.nu/p/2079419

## #20 — inspiro, 2008-02-13T13:13Z

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

Permalänk: https://www.webforum.nu/p/2079425

---

Tråden på webben: https://www.webforum.nu/amne/dotnet/168808-deklarera-functions-som-publika  
Nästa sida: https://www.webforum.nu/amne/dotnet/168808-deklarera-functions-som-publika/page2.md
