DOMANDA [C#] Istanziamento classi

KaT_624

Utente Attivo
126
20
[RISOLTO][C#] Istanziamento classi

Salve, da poco mi sono interessato alla programmazione (nello specifico nel linguaggio C#) e sto leggendo un sacco di roba trovata sparsa per la rete (compreso l'ottimo volume nel Thread fisso).
Mi è oscuro però un dettaglio sull'utilizzo degli oggetti, cioè:
io creo una classe con i suoi campi, metodi e proprietà; poi la istanzio generando un oggetto appartenente a quella classe e fin qui tutto bene, durante le mie prove sull'IDE (visual studio express della microsoft) ho provato a generare l'oggetto all'interno di un loop "for" e noto che, seppur i valori vengono passati correttamente al costruttore e (è una applicazione console) stampo a riga di comando i vari dati dell'oggetto dopo la sua creazione e trattandosi di un ciclo che si ripete "n" volte non riesco a capire come posso gestire questi oggetti successivamente alla loro creazione.

Per essere preciso ho creato una classe che contiene i vari dati numerici degli indirizzi delle schede di rete con le relative proprietà; poi in un loop "for" per ogni scheda di rete immetto nell'oggetto nome e indirizzi vari e ne stampo i valori (i valori dell'oggetto non della scheda di rete); i valori escono tutti e in maniera corretta ma non capisco come faccia il programma a creare un oggetto X "n" volte con lo stesso nome.
Lo sovrascrive?
In realtà a programma eseguito ho in memoria "n" oggetti con lo stesso nome? E se si come faccio a gestire oggetti con lo stesso nome, non è un'ambiguità?

il listato del mio programma:
Codice:
using System;using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.NetworkInformation;
using System.Collections;


namespace testconsolegetsetip
{




    class Program
    {
        public class Adapters
        {
            string nome;
            string ip;
            string subnet;
            string gateway;
            string dns;


            public Adapters(string name, string ipv4, string sub, string gatew, string dnsv4)
            {
                nome = name;
                ip = ipv4;
                subnet = sub;
                gateway = gatew;
                dns = dnsv4;
            }


            public string name
            {
                set{nome = value;}
                get { return nome; }
            }
            public string ipv4
            {
                set{ip = value;}
                get { return ip; }
            }
            public string sub
            {
                set{subnet = value;}
                get { return subnet; }
            }
            public string gatew
            {
                set{gateway = value;}
                get { return gateway; }
            }
            public string dnsv4
            {
                set{dns = value;}
                get { return dns; }
            }
        }


        static void Main(string[] args)
        {
            ArrayList lista = new ArrayList();
            foreach (NetworkInterface Nic in NetworkInterface.GetAllNetworkInterfaces())
            {
                IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName());
                if (Nic.NetworkInterfaceType == NetworkInterfaceType.Wireless80211 || Nic.NetworkInterfaceType == NetworkInterfaceType.Ethernet)
                {
                    Adapters interfaccia = new Adapters(Nic.Name, "Indirizzo IP", "Subnet Mask", "Gateway", "Server DNS");
                    Console.WriteLine("Interfaccia aggiunta:" +interfaccia.name);
                    Console.WriteLine("Ha indirizzo IP:" + interfaccia.ipv4);
                    Console.WriteLine("Ha Subnet Mask:" + interfaccia.sub);
                    Console.WriteLine("Ha Gateway:" + interfaccia.gatew);
                    Console.WriteLine("Ha Server DNS:" + interfaccia.dnsv4);
                    Console.WriteLine();


                }


            }
            Console.WriteLine();
            Console.ReadLine();
        }
    }
}
 
Ultima modifica:

Tinwor

Utente Attivo
932
143
1)Non è un for loop ma un foreach ovverco è un for che ciclo ogni singolo oggetto presente nella collection(in questo caso NetworkInterface.GetAllNetworkInterfaces())
2)La classeviene istanziata all' interno della if, nel momento in cui termina l' istruzione tutti gli oggetti vengono "eliminati"(anche se per essere precisi non passa il gc)
3)Per quanto mi sforzi non riesco proprio a capire l' utilizzo di questa classe, istanzi l' oggetto solo per poter stampare dei numeri... In questo modo dopo il foreach non puoi accedere a nessuna classe io avrei fatto qualcosa del genere per poter(eventualmente riutilizzare) i dati che hai estrapolato:
Codice:
Codice:
using System;using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.NetworkInformation;
using System.Collections;


namespace testconsolegetsetip
{




    class Program
    {
        public class Adapters
        {
            string nome;
            string ip;
            string subnet;
            string gateway;
            string dns;


            public Adapters(string name, string ipv4, string sub, string gatew, string dnsv4)
            {
                nome = name;
                ip = ipv4;
                subnet = sub;
                gateway = gatew;
                dns = dnsv4;
            }


            public string name
            {
                set{nome = value;}
                get { return nome; }
            }
            public string ipv4
            {
                set{ip = value;}
                get { return ip; }
            }
            public string sub
            {
                set{subnet = value;}
                get { return subnet; }
            }
            public string gatew
            {
                set{gateway = value;}
                get { return gateway; }
            }
            public string dnsv4
            {
                set{dns = value;}
                get { return dns; }
            }
        }


        static void Main(string[] args)
        {
            ArrayList lista = new ArrayList();//A cosa serve?!?
            List<Adapters>adapters=new List<Adapters>();
            foreach (NetworkInterface Nic in NetworkInterface.GetAllNetworkInterfaces())
            {
                IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName());
                if (Nic.NetworkInterfaceType == NetworkInterfaceType.Wireless80211 || Nic.NetworkInterfaceType == NetworkInterfaceType.Ethernet)
                {
                     Adapters interfaccia = new Adapters(Nic.Name, "Indirizzo IP", "Subnet Mask", "Gateway", "Server DNS");// Utilizzare il nome interfaccia è sbagliato in quanto come studierai le interfacce sono delle classi particolari di c#
                    adapters.Add(interfaccia);
                    Console.WriteLine("Interfaccia aggiunta:" +interfaccia.name);
                    Console.WriteLine("Ha indirizzo IP:" + interfaccia.ipv4);
                    Console.WriteLine("Ha Subnet Mask:" + interfaccia.sub);
                    Console.WriteLine("Ha Gateway:" + interfaccia.gatew);
                    Console.WriteLine("Ha Server DNS:" + interfaccia.dnsv4);
                    Console.WriteLine();


                }


            }
            Console.WriteLine();
            Console.ReadLine();
        }
    }
}
 
  • Mi piace
Reazioni: KaT_624

KaT_624

Utente Attivo
126
20
Innanzitutto grazie per le risposte e perdonatemi per gli errori, il c# e la sua struttura di programmazione ad oggetti mi porta a dover pensare in maniera astratta e molto più complessa rispetto a qualcosa di più semplice come la programmazione procedurale del Visual Basic e quindi ho dei punti oscuri ancora non molto chiari.

1)Non è un for loop ma un foreach ovvero è un for che cicla ogni singolo oggetto presente nella collection(in questo caso NetworkInterface.GetAllNetworkInterfaces())


prendo atto del mio errore descrittivo :P

2)La classe viene istanziata all'interno della if, nel momento in cui termina l' istruzione tutti gli oggetti vengono "eliminati"(anche se per essere precisi non passa il gc)


ok quindi gli oggetti creati durante l' "if" vengono rimossi dalla memoria al termine dell'istruzione;
cosa è il gc? è un check di qualche tipo? l'IDE non mi segnala nessun errore e lancia il tutto tranquillamente.

3)Per quanto mi sforzi non riesco proprio a capire l' utilizzo di questa classe, istanzi l' oggetto solo per poter stampare dei numeri... In questo modo dopo il foreach non puoi accedere a nessuna classe

io voglio creare un oggetto per ogni adattatore di rete presente sul pc e riempirne i campi con i relativi indirizzi che al momento mi limito a stampare a schermo ma quando avrò più conoscenze implementerò tutto quanto per gestire gli indirizzi delle periferiche stesse.

io avrei fatto qualcosa del genere per poter(eventualmente riutilizzare) i dati che hai estrapolato

cosa scusa?
------------------------
l'ArrayList lista è stato già eliminato (residuato di prove precedenti)(chiedo scusa per non averlo notato).

1)se gli oggetti vengono eliminati alla fine dell'istruzione "If" come faccio ad evitare che questo avvenga in modo da poterli riutilizzare in altre parti del programma?

2)come faccio a istanziare diversi oggetti della stessa classe in maniera automatica, cioè io voglio che per ogni interfaccia ci sia un oggetto di classe Adapters ma siccome è un dato che varia da computer a computer come faccio a gestire questa "variabile"?
 

Tinwor

Utente Attivo
932
143
gc=garbace collcetor--> un' applicazione che "pulisce" la memoria da oggetti de istanziati

Risposte alle domande:
1)Devi utilizzare un oggetto chiamato List(per maggiori informazioni guarda sulla guida mdsn) e per ovviare al problema la dichiarazione di variabile falla all' inizio del programma(sotto il main). Questo è uno standard comune ed evita in questo modo eventuali conflitti di variaibili
2)Non ho capito: il programma che hai creato funziona su tutti i pc con installato un sistema operativo win e che supportino il framework
 

KaT_624

Utente Attivo
126
20
gc=garbace collcetor--> un' applicazione che "pulisce" la memoria da oggetti de istanziati

da quello che ho studiato il GC raccoglie ogni oggetto che non abbia più nulla che lo punti e quindi gli oggetti che creo nel ciclo perchè non passano da li?

1)Devi utilizzare un oggetto chiamato List(per maggiori informazioni guarda sulla guida mdsn) e per ovviare al problema la dichiarazione di variabile falla all' inizio del programma(sotto il main). Questo è uno standard comune ed evita in questo modo eventuali conflitti di variaibili

il mio problema non è nella dichiarazione della variabile, è creare diversi oggetti di una classe cambiandone il nome dentro un loop e il nome (ovviamente) deve essere variabile.

potrei usare una list esterna che compilo da loop inserendo gli elementi degli oggetti che creo in modo da avere una tabella con le informazioni che mi interessano, ma a questo punto non so a cosa possa servire l'oggetto.

2)Non ho capito: il programma che hai creato funziona su tutti i pc con installato un sistema operativo win e che supportino il framework

si esatto.
 
Ultima modifica:

KaT_624

Utente Attivo
126
20
Ok ho risolto (sono andato avanti con lo studio xP);
è stato sufficiente creare un array di oggetti e infilarci dentro gli oggetti creati dal loop.

Si può chiudere.
 

Tinwor

Utente Attivo
932
143
Non si chiama loop :P
P.S. quando vuoi chiudere modifica il titolo del thread anteponendo [RISOLTO]
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!