Avatar billede karl-koder Nybegynder
09. oktober 2007 - 20:34 Der er 16 kommentarer og
1 løsning

c# static

Jeg kunne godt tænke mig hvis der sidder en der på forståeligt dansk kan forklare mig forskellen på :

public static bool IsOnline()
{
}

og

public bool IsOnline()
{
}

altså en forklaring på hvornår static skal bruges og ikke bruges.
Avatar billede arne_v Ekspert
09. oktober 2007 - 20:38 #1
med static = metode som kaldes paa klassen

uden static = metode som kaldes paa en instans (et objekt) af klassen
Avatar billede kalp Novice
09. oktober 2007 - 20:38 #2
Hvis du laver en test klasse og starter med, at tilføje metoden
public static bool IsOnline()
{
}

og vi antager, at du bare har kaldt din klasse for "Test" så kan du kalde metoden på følgende måde.

Test.IsOnline();

Dvs. direkte uden at oprette et objekt af klassen.

Hvis du så prøver med den anden metode istedet.. dvs. fjerner "static"
så vil din compiller brokker sig over den linje.
Så skal koden se sådan ud:

Test etObjekt = new Test();
etObjekt.IsOnline();

Det er forskellen på de 2..

Du finder mange klasser i .NET som har metoder som er static.. f.eks kan du jo skrive
string.Format();

uden først at skulle oprette en instans af String.
Avatar billede nielle Nybegynder
09. oktober 2007 - 20:40 #3
static br4uge til at marekere en egeneskal eller funktion som er "fælles" for samtlige objekter (instanser) af klassen - så de så at sige deler den.
Avatar billede nielle Nybegynder
09. oktober 2007 - 20:53 #4
Static bruges på ting som i en vis forstand er unikke - der er kun den ene af dem selv om man skulle finde på at oprette flere instanser af klassen.

Tag f.eks. Math klassen. Denne indeholder matematiske funktioner. Hvis man nu kunne oprette instanser af Math klassen (det kan man nu íkke), ville det så give mening at disseb objekter havde f.,eks. hver sin "kvadratrod funktion"?


class Math
{
    public double Sqrt(double number)
    {
        ...
    }
}

Math matematikObj1 = new Math();
Math matematikObj2 = new Math();

Console.WriteLine(matematikObj1.Sqrt(4));
Console.WriteLine(matematikObj2.Sqrt(2));


Nej, der er kun den ene kvadratrod, og derfor giver det mere mening at markere dette tydeligt ved at erklære den static:

class Math
{
    static public double Sqrt(double number)
    {
        ...
    }
}

Console.WriteLine(Math.Sqrt(4));
Console.WriteLine(Math.Sqrt(2));
Avatar billede karl-koder Nybegynder
09. oktober 2007 - 21:14 #5
Hold da en masse svar, tak for det. Altså virker det som om at static svare til shared i VB ?

Grunden til spørgsmålet er at jeg kigger på provider modellen og har downloadet starter kittet Small business site fra asp.net's hjemmeside.

I alle access filer imellem datalag og web har man valgt at lave alt med static, se eksempel :

public static class News
{

    private static bool _isInitialized = false;
    private static NewsProvider _provider;
    private static SmallBusinessDataProvidersSection _providersSection;
   
   
    public static NewsProvider Provider
    {
        get
        {
            Initialize();
            return _provider;
        }
    }

    public static List<NewsItem> GetAllNews()
    {
        return Provider.GetAllNews();
    }

    public static NewsItem GetNewsItem(string newsItemId)
    {
        return Provider.GetNewsItem(newsItemId);
    }
   
    private static void Initialize()
    {
        if (!_isInitialized)
        {
            _providersSection = (ConfigurationManager.GetSection("SmallBusinessDataProviders")) as SmallBusinessDataProvidersSection;
            if (_providersSection == null)
            {
                throw new InvalidOperationException(Messages.NewsConfigSectionNotFound);
            }

            _provider = ProvidersHelper.InstantiateProvider(_providersSection.NewsProviders[_providersSection.NewsProviderName],
                typeof(NewsProvider)) as NewsProvider;

            if (_provider == null)
            {
                throw new InvalidOperationException(Messages.NewsProviderInstantiationError);
            }
            _isInitialized = true;
        }
    }
}

Er der nogen logisk forklaring på hvorfor man gør det ?
Avatar billede nielle Nybegynder
09. oktober 2007 - 21:20 #6
Ja:

static i C# = Shared i VB.Net
Avatar billede kalp Novice
09. oktober 2007 - 21:21 #7
for at opnå singleton effekt vil jeg mene.
Avatar billede karl-koder Nybegynder
09. oktober 2007 - 21:27 #8
nielle >> Super tak for det ;o)

kalp >> Og hvad er singleton ?
Avatar billede kalp Novice
09. oktober 2007 - 21:37 #9
karl-koder >> Det er når der kun kan eksisterer én instans af en klasse.

Det kan være smart i en situation hvor man f.eks ikke ønsker, at der skal kunne oprettes mange forbindelser til en database.
Hvis man sørger for, at database laget (klassen) er singleton så kan der kun være en enkelt forbindelse til database på alle tidspunkter.

Dvs. alle peger på samme instans af det oprettede objekt.
Avatar billede karl-koder Nybegynder
09. oktober 2007 - 21:50 #10
Det vil sige at når der er oprettet et object af ovenstående klasse News så sker det ikke igne før objectet ikke længere benyttes ?
Avatar billede kalp Novice
09. oktober 2007 - 21:56 #11
Ja, men det er nok mere klassen "NewsProvider" som er interessant.. sådan set det i hvertfald ud for mig.

Men News klassen er den som opretter instansen og holder styr på der kun findes én af den.
Avatar billede karl-koder Nybegynder
09. oktober 2007 - 22:02 #12
Den virker da kun som abstract klasse for Sql/XmlNewsProviderne ellers har jeg ikke fanget ideen med det hele ?

/// <summary>
/// base data access class
/// </summary>
public abstract class NewsProvider : ProviderBase
{
    public abstract List<NewsItem> GetAllNews();
    public abstract NewsItem GetNewsItem(string newsItemId);
}
Avatar billede kalp Novice
09. oktober 2007 - 22:06 #13
Indholdet af klassen kunne jeg ikke se:)
men en abstrakt klasse kan man ikke lave en instans af
Avatar billede kalp Novice
09. oktober 2007 - 22:21 #14
nåh den fik ikke sendt min besked før.

forklaringen lægger nok i koden her:

_provider = ProvidersHelper.InstantiateProvider(_providersSection.NewsProviders[_providersSection.NewsProviderName],
                typeof(NewsProvider)) as NewsProvider;


men selve koden kan kun du se.

Du kan også se på brugen af variablen "_isInitialized" at netop den kodestump ikke bliver kaldt mere end én gang.
Avatar billede karl-koder Nybegynder
09. oktober 2007 - 22:43 #15
Super, jeg takker for hjælpen og forklaringerne, så smid et ;o)
Avatar billede kalp Novice
09. oktober 2007 - 22:44 #16
mit svar kommer her:)
Avatar billede nielle Nybegynder
10. oktober 2007 - 17:16 #17
Springer over på denne her :^)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester