Newsgroup: it.comp.programmare
Titolo: C# static approfondimento

Ciao
PREMESSA
da qualche giorno sto' leggendo un libro sul C#, sono arrivato alla OOP, 
ed ho letto fra le tante cose, che un metodo o un campo di classe puo' 
dichiarato 'static', ed essere utilizzato senza istanziare un nuovo 
oggetto per la classe, e che inoltre un metodo static non puo' 
richiamare metodi non static o campi non static proprio perche' essi non 
esistono fino alla creazione di un oggetto.
Inoltre un campo static mantiene in memoria il proprio valore e le 
modifiche ad esso apportate non solo durante la vita del singolo oggetto 
ma ad esso fanno riferimento tutti gli oggetti dello stesso tipo che 
vengono successivamente creati.
quindi
class MiaClasse()
{
	publis static int i = 0;
	public MiaClasse()
	{
		this.i++;
	}	
}
MiaClasse oggetto1 = new MiaClasse();
consolle.write("oggetto1.i vale {0}",oggetto1.i); <-- vale 1
MiaClasse oggetto2 = new MiaClasse();
consolle.write("oggetto1.i vale {0}",oggetto1.i); <-- vale 2
DOMANDA
1 -perche' apporre static al metodo Main()?
Forse perche' va reso disponibile senza appunto istanziare nessun oggetto?
2- nel libro in diversi esempi l'autore utilizza l'applicazione 
consolle, e per tutti i metodi utilizza sempre la parola chiave 
'static', esempio
#region Using directives
using System;
using System.Collections.Generic;
using System.Text;
#endregion
namespace Classes
{
     class Program
     {
         static void Entrance()
         {
             //qui' si riferisce ad una classe
             //dichiarata in un file separato
             Point origin = new Point();
             Point bottomRight = new Point(1024, 1280);
             double distance = origin.DistanceTo(bottomRight);
             Console.WriteLine("Distance is {0}", distance);
             Console.WriteLine("No of Point objects: {0}", 
     	    Point.ObjectCount());
         }
         static void Main(string[] args)
         {
             try
             {
               //chiama il metodo statico entrance
               //e racchiude tutto in un blocco try
                 Entrance();
             }
             catch (Exception ex)
             {
                 Console.WriteLine(ex.Message);
             }
         }
     }
}
grazie per l'attenzione !

 'static', esempio
[snip]
Immagino tu voglia sapere perché.
In realtà ti sei già risposto con quello che hai scritto nella prima 
parte del post e che ti cito: "...e che inoltre un metodo static non 
puo' richiamare metodi non static...".
Il main è statico, quindi se l'altro metodo dell'esempio non fosse 
dichiarato come static, non potrebbe essere chiamato dal main stesso, 
proprio perché la classe Program, anche se sei nel main, non è ancora 
stata istanziata.
S.

stata istanziata.
Per precisione: il fatto che Program non sia ancora stata creata, allo
start-up dell'applicazione, implica solo che main debba essere static.
Poi, ogni metodo static (a prescindere che la classe che gli fa da
namespace sia istanziata 0, 1, ... n volte) può invocare ovviamente
SOLO metodi statici. Non essendo un metodo statico legato ad alcuna
istanza, può invocare solo altri metodi statici.

 istanza, può invocare solo altri metodi statici.
Certo, credevo di aver reso esplicito anche questo, ma rileggendomi mi 
sono reso conto di non averlo fatto.
Grazie per la precisazione.
S.