[C#] Costruttori e campi di visibilità

venerdì 27 marzo 2009 - 19.36

Allison Profilo | Newbie

Ritorno con i miei problemi con C#, dopo il problema delle direttive.

Leggendo un libro su C#, mi sono soffermato sulle differenze tra C++ e C# nel definire i costruttori.

Se in C++, scrivo:

class NomeClasse { public: // Costruttori con overloading NomeClasse(); NomeClasse(char c); NomeClasse(char c, int i); NomeClasse(const char *c); ... };

In C#:

1. Devo specificare, per ogni costruttore, il campo di visibilità? Oppure c'è un'alternativa più comoda, come in C++?

2. Ho notato che esistono i tipi "String" e "string", "Char" e "char". Quelli scritti con la lettera maiuscola
dovrebbero essere appartenenti ad una classe, infatti VS me li evidenzia in verde, come fa per le classi... ma qual'è la differenza sostanziale?

3. Vale l'overloading?

E' giusto scrivere nel seguente modo?

class NomeClasse { // Costruttori con overloading public NomeClasse(); public NomeClasse(char c); public NomeClasse(char c, int i); public NomeClasse(const string); ... };

Grazie mille.

aiedail92 Profilo | Expert

Ciao

Per quanto rigarda la prima domanda, in C# devi ripetere la parola chiave per la visibilità ad ogni dichiarazione di una funzione, in quanto se non viene specificata, viene assunta come private di default.

La differenza sostanziale fra string, String e char, Char invece non è nessuna: char e string sono solo dei placeholder per System.Char e System.String

Infine, l'ultimo codice che hai scritto non è corretto (così come quello in c++) per due motivi: innanzitutto non hai definito dei costruttori (che devono avere lo stesso nome della classe) ma delle funzioni, delle quali non hai però scritto il valore di ritorno. In secondo luogo in C#, a differenza dal c++, non è possibile separare la dichiarazione di una funzione dalla sua implementazione.

Inoltre ti faccio notare che in C# l'uso dei puntatori è possibile solo abilitando il codice unsafe, e che comunque non potrai usare puntatori a classi, ma solo a strutture (anche se pare che il .Net faccia di tutto per scoraggiarti ad usarli). Se il tuo char* indicava una stringa, devi invece sostituirlo con String (o string)

Luca

Allison Profilo | Newbie

Ops, l'errore sui costruttori è stata una mia distrazione. Comunque sapevo che devono aver lo stesso nome della classe che li contiene, altrimenti non avrebbero senso. Ho corretto il codice: adesso dovrebbe essere esatto.

Per quanto riguarda la differenza tra "String" e "string", non ho ben capito...

Perché mai C# ostacola i puntatori? Per questione di sicurezza o per altro motivo? In C++ non se ne può fare a meno.
L'overload in C# esiste?

Il passaggio al C# sta diventando più ostico del previsto... ci sono tante cose che sono differenti... anche le keyword "explicit", "inline", "extern"... tutte cose che forse non sono supportate dal C#... o magari si ottengono gli stessi risultati in un altro modo...

aiedail92 Profilo | Expert

Riguardo ai costruttori avevo capito che era una distrazione

Quello che intendevo dire è che fra string e String non c'è nessuna differenza, nel senso che string è una parola chiave del C#, ma è solo un alias per la classe System.String (System è il namespace, la sintassi è la corrispondente di System::String del c++)

Questione puntatori: in C# l'uso dei puntatori non è più necessario proprio per la nuova struttura del framework. Quello che in c++ sono i puntatori sono stati traslati nel "tipo riferimento" del .Net. In sostanza, una struttura del C# corrisponde ad una struttura (o ad una classe) del c++, mentre una classe del C# corrisponde ad un puntatore ad una struttura (o ad una classe) del c++.

Per l'overload delle funzioni non ci sono problemi, esiste e non richiede nessun accorgimento rispetto al c++

La parola chiave explicit non viene più usata sul costruttore (il costruttore con un argomento non funziona più da conversione implicita), ma sull'override dell'operatore di cast, per specificare che il cast verso il tipo deve essere eseguito esplicitamente. Al contrario per lasciarlo implicito si usa la parola chiave implicit.

La keyword inline invece non è più supportata dal C#, mentre la parola chiave extern si usa come modificatore delle funzioni per indicare che la loro implementazione è esterna al codice C# (ad esempio in una dll)

Luca

Allison Profilo | Newbie

Ho le idee più chiare adesso. La nebbia sta svanendo, anche se ancora ne rimane un bel po'...

Grazie per la disponibilità
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5