mercoledì 19 dicembre 2012

How to : implement Internal property

Giusto per non perdere il vizio di scrivere due righe di codice ecco che mi capita sotto mano, una di quelle "non troppo" rare occasioni per cui implementare una proprietà Ineternal.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace propTest
{
    public class entityTest
    {
        public int id { get; private set; }
        public string Name { get; set; }
        public DateTime Timestamp { get; internal set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            entityTest et = new entityTest();
            /* 
             * The property or indexer 'propTest.entityTest.id' 
             * cannot be used in this context because the set accessor is inaccessible    
             */ 

            et.id = 30;
            et.Name = "Fabio";
            et.Timestamp = DateTime.Now;
        }
    }
}

et.id = 30 non è fattibile perchè la proprietà è privata e quindi di pertinenza di entityTest, il suo scope ( in valorizzazione ) è soltanto nella classe.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace propTest
{
    public class entityTest
    {
        public virtual int id { get; set; }
        public virtual string Name { get; set; }
        public virtual DateTime Timestamp { get; internal set; }
    }

    public class entityTestWrapper : entityTest 
    {
        public new int id { get; private set; }
        public override string Name { get; set; }
        public override DateTime Timestamp { get; internal set; }

        public entityTestWrapper(int newId)
        {
            id = newId;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            entityTestWrapper et = new entityTestWrapper(30);

            et.Name = "Fabio";
            et.Timestamp = DateTime.Now;

            entityTest etx = new entityTest();
            etx.id = 31;
            etx.Name = "Fabio";
            etx.Timestamp = DateTime.Now;

        }
    }
}

E in questo esempio ci inventiamo come valorizzare l'id privato wrappando l'originale. Ora come otteniamo la valorizzazione di un internal da un name space diverso ?? Semplice non si può...

Seguendo l'esempio è necessario creare un secondo progetto e referenziarlo dal primo  e poi provare a scrivere quanto segue:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace propTestA
{
    public class entityTest
    {
        public virtual int id { get; private set; }
        public virtual string Name { get; set; }
        public virtual DateTime Timestamp { get; internal set; }
    }
}

e quindi:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace propTest
{
    using propTestA;
    class Program
    {        
        static void Main(string[] args)
        {
            entityTest etx = new entityTest();        
            etx.Name = "Fabio";

            /*
             * Property or indexer 'propTestA.entityTest.Timestamp' cannot be assigned to -- 
             * it is read only    
             */

            etx.Timestamp = DateTime.Now;

        }
    }
}

Morale ... le proprietà internal sono tali per namespace e progetto...

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace propTestA
{
    public class entityTest
    {
        public virtual int id { get; private set; }
        public virtual string Name { get; set; }
        public virtual DateTime Timestamp { get; internal set; }
    }
}

namespace propTest
{
    using propTestA;
    class Program
    {        
        static void Main(string[] args)
        {
            entityTest etx = new entityTest();        
            etx.Name = "Fabio";
            etx.Timestamp = DateTime.Now;
        }
    }
}
In questo modo funziona anche se il namespace è differente, vince il fatto che appartengono allo stesso progetto.

martedì 18 dicembre 2012

Merry 250 BYTE !!!

Siamo a Natale e perchè non dimostrare ancora una volta quanto siamo forti e creativi ???

Nella precedente edizione ci siamo divertiti a scrivere codice in modo "quasi roccambolesco" questa volta secondo me arriviamo a scriverlo in modo ancora più fantasioso.

Ricodo Simone che al tempo era stato uno dei più forti interpreti delle sfida. ma questa volta spero di raccogliere molte più partecipazioni.

Come al solito si scrive nei commenti il numero di byte, e si manda via mail il sorgente...

E andiamo a cominciare...


SFIDA HTML A 250 byte...

A) l'applicazione deve mostrare una pagina web renderizzata *
B) la pagina web deve essere scritta dall'applicazione **
C) la pagina web deve contenere il testo "POI"
D) la pagina web deve contenere e applicare  lo stile font-size:30

L'applicazione deve essere fatta con o VB.NET o in C# ...


Vale più o meno tutto ...
Gli editor di http://csharplight.blogspot.it/ potranno partecipare e vagliare eventualmene la soluzione...

* Libera intrepretazione si può scegliere di utillizzare un browswer interno oppure richiamare uno esterno..

** L'applicazione scrive il codice html, in un file.


La sfida termina venrdì 21 / 12/ 2012 ( pena la fine del mondo ) !!!


Ed ecco il primo .. naturalmente .. io ...

241.. so che si può fare di meglio !!

Qualche tiratina d'orecchie a me stesso ma ecco .. che arriva già la seconda release...

ops.. ( qualcuno ha già detto che me la meno ... ) VERISSIMO !!!


216 sempre io .. !!

Ed ecco Simone.. che stacca un 188... da paura...

Simone.. corregge il tiro !!! 160 ...

Tiziano (purpleDev) mi ha inviato il suo sorgente e si scende a 150 ... ( motivo per cui nelle proprietà c'è il mio stesso path ...)


Marco alisa Zocram arriva a 131 e come per Tiziano ho preso il sorgente e l'ho inserito nella mia soluzione..



giovedì 13 dicembre 2012

Workflow Foundation

Ammetto che non mi sono mai affacciato a questo argomento, ma avendo qualche attimo libero ho provato a comprenderne qualcosa in più.
Probabilmente più per curiosità che per altro. Ma ammetto che una volta che si entra nell'ottica, lascia spazio a tante iniziative divertenti ed edificanti.

Ammetto c'e'  parecchia letteratura sull'argomento, ma ad oggi mi sembra  una pratica poco diffusa, o per quanto ne so io l'impiego tradizionale del codice è sicuramente più efficace o più ... piacevole.

"De facto" si tratta della classica implementazione a Flowchart, ( già proprio quella che ci hanno insegnato quei dinosauri di professori negli anni 80... ) che parrebbe ritornare in voga per concretizzarsi e rendere un filo più visuale la programmazione.

Volte sapere quanto ?  tanto così:




"evito" di spiegarvi che cosa fa questo branetto di codice... ma di suo mi ha permesso di comprendere come avviene lo scambio di informazioni fra classi all'interno di una sequence.

In breve questo è il contenuto delle due classi ( BaseActivity e NextActivity ) ...


BaseActivity
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Activities;

namespace WF.FirstActivity
{
    public sealed class BaseActivity : CodeActivity
    {

        public InArgument<string> Input { get; set; }

        public OutArgument<string> Output { get; set; }


        protected override void Execute(CodeActivityContext context)
        {
            if (Input.Get(context) == "Step1")
            {
                Output.Set(context, "Step2");
                return;
            }
            Output.Set(context, "Nop");
        }
    }
}


NextActivity
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Activities;

namespace WF.FirstActivity
{
    public sealed class NextActivity : CodeActivity
    {

        public InArgument<string> Input { get; set; }

        public OutArgument<string> Output { get; set; }


        protected override void Execute(CodeActivityContext context)
        {
            if (Input.Get(context) == "Step2")
            {
                Output.Set(context, "Step3");
                return;
            }
            Output.Set(context, "Nop");
        }
    }
}

Il cui scopo è di "portare avanti un attività".

Tutto il resto è "imputato" manualmente da proprietà o impostazioni.


Ammetto per il momento la cosa è divertente.. ma dove mi porterà tutto questo ..