Avatar billede CodingJoe Nybegynder
28. november 2012 - 15:59 Der er 12 kommentarer og
1 løsning

C# Generics spørgsmål

Jeg leger med en lille stump generic kode:

public T Instance<T>() where T : class, new()
{
    return new T();
}

Når jeg så bruger den fx.

Instance<Bil>().Add...bla...bla..bla

Er der nogen måde, jeg kan bruge den oprettede instance på? Jeg ved ikke hvordan, jeg tilgår min instantierede objekt.

Når jeg skriver this. så havde jeg regnet med, jeg kunne se mit instantierede objekt, men jeg får blot mulighed for at lave en ny Instance<>.

Kan det lade sig gøre at mit instantierede objekt er tilgængeligt?
Avatar billede janus_007 Nybegynder
28. november 2012 - 19:01 #1
Du skal jo have en variabel at tilgå:


var instance = Instance<Bil>();
instance.Add(...
Avatar billede CodingJoe Nybegynder
28. november 2012 - 19:27 #2
Det behøver jeg jo ikk, når jeg laver en Instance<Bil>().Add. Spørgsmålet er bare hvordan det objekt, der bliver instantieret i den generiske del dvs.

public T Instance<T>() where T : class, new()
{
    return new T();
}

her returnerer jeg en new T(). Hvordan kan jeg tilgå den...
hvad hedder den reference, der peger på i heap'en?
Avatar billede arne_v Ekspert
28. november 2012 - 19:41 #3
Din kode virker fint.

Hvis Bil har en Add metode.

Hvis du vil gemme en ref til det createde objekt skal du goere som angivet i #1.
Avatar billede CodingJoe Nybegynder
28. november 2012 - 20:12 #4
Jeps, den har en add metode, som jeg bruger inline...tænkte om jeg kune (gen)bruge mit objekt, nu da det jo var instantieret i baggrunden...

Havde faktisk laven en variable var x = Instance<Bil>();

..men tænkte jeg kunne tilgå det direkte...
Avatar billede arne_v Ekspert
28. november 2012 - 20:33 #5
Saa skulle du modificere Instance metode til at gemme og returnere det samme objekt igen.

Lyder ikke rigtigt.
Avatar billede CodingJoe Nybegynder
28. november 2012 - 20:45 #6
Hmmm kan jeg ikke la'

public T Instance<T>() where T : class, new()
{
    return new T();
}

om at returnere mig et objekt? Denne metode ligger i en abstract klasse som min anden klasse nedarver / implementerer.
Avatar billede arne_v Ekspert
28. november 2012 - 20:55 #7
Jo. Men saa faar du et forskelligt objekt ved hvert kald. Og deraf foelger at hvis du skal bruge det objekt mere end en gang er du noedt til at gemme en ref til det.
Avatar billede CodingJoe Nybegynder
28. november 2012 - 20:59 #8
Hmmm....
Avatar billede CodingJoe Nybegynder
29. november 2012 - 18:59 #9
Jeg afgiver svar, selvom jeg har har gjort som angivet i svar eksemplet, inden jeg oprettede et spørgsmål her.
Avatar billede Syska Mester
01. december 2012 - 19:32 #10
Det du leder efter er nok "Fluent Interface" ... jeg har kun indsat et link til en google søgning da der findes utrolig meget information om det.

https://www.google.dk/#hl=da&safe=off&tbo=d&sclient=psy-ab&q=fluent+interface+C%23&oq=fluent+interface+C%23&gs_l=hp.3..0j0i30l3.1943.2834.1.3123.3.3.0.0.0.0.74.211.3.3.0.ernk_timediscounta..0.0...1c.1.ZDfmsuDg9wA&pbx=1&bav=on.2,or.r_gc.r_pw.r_cp.r_qf.&fp=84bf07388fb30a14&bpcl=39314241&biw=1366&bih=667
Avatar billede arne_v Ekspert
02. december 2012 - 02:37 #11
Du taenker paa noget a la:

using System;

namespace E
{
    public class MySingleton
    {
        private static MySingleton _instance = null;
        private static object mylock = new object();
        private MySingleton()
        {
        }
        public static MySingleton Instance
        {
            get
            {
                lock(mylock)
                {
                    if(_instance == null)
                    {
                        _instance = new MySingleton();
                    }
                }
                return _instance;
            }
        }
        public void DoInt(int v)
        {
            Console.WriteLine("DoInt: " + v);
        }
        public void DoDouble(double v)
        {
            Console.WriteLine("DoDouble: " + v);
        }
        public void DoString(string v)
        {
            Console.WriteLine("DoString: " + v);
        }
    }
    public class MyFluentSingleton
    {
        private static MyFluentSingleton _instance = null;
        private static object mylock = new object();
        private MyFluentSingleton()
        {
        }
        public static MyFluentSingleton Instance
        {
            get
            {
                lock(mylock)
                {
                    if(_instance == null)
                    {
                        _instance = new MyFluentSingleton();
                    }
                }
                return _instance;
            }
        }
        public MyFluentSingleton DoInt(int v)
        {
            Console.WriteLine("DoInt: " + v);
            return this;
        }
        public MyFluentSingleton DoDouble(double v)
        {
            Console.WriteLine("DoDouble: " + v);
            return this;
        }
        public MyFluentSingleton DoString(string v)
        {
            Console.WriteLine("DoString: " + v);
            return this;
        }
    }
    public class Program
    {
        public static void Main(string[] args)
        {
            // refer every time
            MySingleton.Instance.DoInt(123);
            MySingleton.Instance.DoDouble(123.456);
            MySingleton.Instance.DoString("ABC");
            // save ref
            MySingleton ms = MySingleton.Instance;
            ms.DoInt(123);
            ms.DoDouble(123.456);
            ms.DoString("ABC");
            // fluent
            MyFluentSingleton.Instance.DoInt(123).DoDouble(123.456).DoString("ABC");
            //
            Console.ReadKey();
        }
    }
}

?

Det er ikke helt aabenlyst at fluent syntaxen er mere laesbar.

Jeg tror at jeg ville vaelge den foerste loesning (bruge Instance property hver gang).
Avatar billede arne_v Ekspert
02. december 2012 - 03:43 #12
Endvidere er fluent god til mange metoder som aendrer state og faa metoder som returnerer data men ikke naer saa god til mange metoder som returnerer data.
Avatar billede Syska Mester
02. december 2012 - 13:48 #13
Helt enig Arne_v ... men Fluent Interface lyder til at være hvad han efterspørger siden han ville kunne:

var obj = new Some().Add(10).Add(20).Add(30);

At jeg så også synes det lugter mærkeligt er en helt anden ting.

Det gør det i hvert fald som du selv siger mere besværligt at læse.

Men et Fluent Configuration API er top dollar i min verden.
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