Classe NetworkInterface

di il
15 risposte

Classe NetworkInterface

Salve a tutti,prima cosa auguri a tutti!
Allora stavo lavorando in C# e avevo intenzione di smanettare un pò sulle interfacce di rete e le varie informazioni(IP,MAC ecc) allora girando su internet ho trovato la classe "NetworkInterface"(http://msdn.microsoft.com/en-us/library/system.net.networkinformation.networkinterface.aspx)
solo che trovo difficoltà nell'usarla essendo una classe astratta.
Poi nella documentazione ci sono due cose che non riesco a capire:

1)Se è una classe astratta perchè c'è un costruttore?
2)Nell'esempio di utilizzo che sta al sito sopra è scritto così

NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
Ma come si fa a usare una classe senza il costruttore?

Ecco ho questi tipi di dubbi se mi potreste dare qualche "dritta" ve ne sarei grato
Grazie mille a tutti e auguri ancora

15 Risposte

  • Re: Classe NetworkInterface


    Uhmmmm qui si sta facendo un pò di confusione.
    Allora, nel tuo esempio di codice, non viene instanziata ma viene dichiarata di tipo array.
    Il codice che hai riportato
    NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
    traducendolo in linguaggio umano sarebbe
    Creao un oggetto di tipo networkinterface di tipo array, ossia n oggetti, che vengono valorizzati dal metodo GetAllNetworkInterfaces.
    A questo punto, avrai una serie di oggetti (dipende dai dati che ci sono) denominati nics di tipo NetWorkInterface.
    Mettendo nics[1] (supponendo che ci sono 2 e più oggetti) hai un oggetto di tipo NetWorkInterface, se metti il punto, in VS ti tira fuori, proprietà, metodi ed eventi per quell'oggetto.
    Spero di aver chiarito ogni tuo dubbio.
    Ciao e buona programmazione.
    Lele
  • Re: Classe NetworkInterface

    Ciao lele,guarda non riesco a capire; anche se dichiaro un array di NetworkInterface comunque sto dichiarando una serie di oggetti di tipo NetworkInterface,però quest'ultima è una classe astratta. questo non riesco a capire
  • Re: Classe NetworkInterface

    Infatti non puoi scrivere

    NetworkInterface iface = new NetworkInterface();

    per creare un oggetto di quella classe, *ma* la classe ti mette a disposizione un suo metodo che crea un vettore di oggetti di quel tipo.
  • Re: Classe NetworkInterface

    Scusate ma non riesco a capire la differenza tra creare un oggetto e creare un'array di quei stessi oggetti.
  • Re: Classe NetworkInterface

    Ho capito cosa intendi ...

    In realtà gli oggetti creati non sono di tipo NetworkInterface ma di tipo SystemNetworkInterface (derivata dalla prima) che ne costituisce una implementazione interna.
  • Re: Classe NetworkInterface

    Ecco questo dettaglio mi sfuge . SystemNetworkInterface cosa sarebbe una classe che deriva da NetworkInterface e si trova all'interno di networkinterface? Mi potresti spiegare meglio questo particolare.
  • Re: Classe NetworkInterface

    Sì ... è una classe interna derivata dalla NetworkInterface. Gli oggetti restituiti nell'array sono di quella classe.
  • Re: Classe NetworkInterface

    A ok, senti ti potrei chiedere un favore: mi potresti fare un esempio con classe a e classe b(i soliti) per chiarire meglio la situazione. Ti ringrazio per la pazienza e disponibilità
  • Re: Classe NetworkInterface

    Ma riguardo a cosa ?
  • Re: Classe NetworkInterface

    Riguardo alle classi astratte. Cioè una classe astratta che viene ereditata da un'altra classe che ha il metodo(cone in questo caso "getallnetworkinterface") che ritorna il valore della classe derivata. Un esempio semplice giusto per capire meglio a livello pratico perchè a livello concettuale l'ho capito
  • Re: Classe NetworkInterface

    Guarda ... per capire meglio, ti posto la classe astratta NetworkInterface
    
    public abstract class NetworkInterface
    {
        // Methods
        protected NetworkInterface();
        public static NetworkInterface[] GetAllNetworkInterfaces();
        public abstract IPInterfaceProperties GetIPProperties();
        public abstract IPv4InterfaceStatistics GetIPv4Statistics();
        public static bool GetIsNetworkAvailable();
        public abstract PhysicalAddress GetPhysicalAddress();
        public abstract bool Supports(NetworkInterfaceComponent networkInterfaceComponent);
    
        // Properties
        public abstract string Description { get; }
        public abstract string Id { get; }
        public abstract bool IsReceiveOnly { get; }
        public static int LoopbackInterfaceIndex { get; }
        public abstract string Name { get; }
        public abstract NetworkInterfaceType NetworkInterfaceType { get; }
        public abstract OperationalStatus OperationalStatus { get; }
        public abstract long Speed { get; }
        public abstract bool SupportsMulticast { get; }
    }
    
    quella interna derivata NetworkInterface
    
    internal class SystemNetworkInterface : NetworkInterface
    {
        // Fields
        private AdapterFlags adapterFlags;
        private uint addressLength;
        private string description;
        private string id;
        internal uint index;
        private SystemIPInterfaceProperties interfaceProperties;
        internal uint ipv6Index;
        private string name;
        private OperationalStatus operStatus;
        private byte[] physicalAddress;
        private long speed;
        private NetworkInterfaceType type;
    
        // Methods
        private SystemNetworkInterface();
        internal SystemNetworkInterface(FixedInfo fixedInfo, IpAdapterAddresses ipAdapterAddresses);
        internal SystemNetworkInterface(FixedInfo fixedInfo, IpAdapterInfo ipAdapterInfo);
        private static SystemNetworkInterface[] GetAdaptersAddresses(AddressFamily family, FixedInfo fixedInfo);
        public override IPInterfaceProperties GetIPProperties();
        public override IPv4InterfaceStatistics GetIPv4Statistics();
        internal static NetworkInterface[] GetNetworkInterfaces();
        private static NetworkInterface[] GetNetworkInterfaces(AddressFamily family);
        public override PhysicalAddress GetPhysicalAddress();
        internal static bool InternalGetIsNetworkAvailable();
        private static SystemNetworkInterface[] PostWin2KGetNetworkInterfaces(AddressFamily family);
        [RegistryPermission(SecurityAction.Assert, Read=@"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}")]
        private string ReadAdapterName(string id);
        public override bool Supports(NetworkInterfaceComponent networkInterfaceComponent);
    
        // Properties
        public override string Description { get; }
        public override string Id { get; }
        internal static int InternalLoopbackInterfaceIndex { get; }
        public override bool IsReceiveOnly { get; }
        public override string Name { get; }
        public override NetworkInterfaceType NetworkInterfaceType { get; }
        public override OperationalStatus OperationalStatus { get; }
        public override long Speed { get; }
        public override bool SupportsMulticast { get; }
    }
    
    e il metodo statico GetAllNetworkInterfaces della NetworkInterface
    
    public static NetworkInterface[] GetAllNetworkInterfaces()
    {
        new NetworkInformationPermission(NetworkInformationAccess.Read).Demand();
        return SystemNetworkInterface.GetNetworkInterfaces();
    }
    
  • Re: Classe NetworkInterface

    Ciao, guarda non riesco a capire due cose: A) l'uso della keyword "internal"
    B) e il senso di dichiarare un metodo statico in una classe astratta
  • Re: Classe NetworkInterface

    l'uso della keyword "internal"
    In che senso, non lo capisci ?

    La classe derivata da quella astratta è internal, ovvero valida solamente all'interno dell'assembly.
    B) e il senso di dichiarare un metodo statico in una classe astratta
    Cioè ? Il metodo è statico perché è a livello di classe e non di istanza.[/quote]
  • Re: Classe NetworkInterface

    Scusa l'ignoranza ma non capisco a cosa ti riferisci per "assembly"? Sarebbe il linguaggio tipo MOV,BX ecc?

    Per quanto riguarda il discorso dello static, si lo sapevo che il modificatore static rende quel metodo valido a livello di classe e non di istanza, quello che non capisco è:poichè viene dichiarato in una classe astratta e quindi sicuramente verrà ereditato in un'altra classe perchè "legarlo" alla classe astratta?Quando poi verrà ereditato in altra classe come faccio a richiamarlo se appartiene a una classe astratta?

    Non so se sono stato chiaro,spero di si.
    Ti ringrazio ancora per la disponibilità
Devi accedere o registrarti per scrivere nel forum
15 risposte