Domanda

Voglio sapere Typecasting in C # .Net, ho sotto le linee di codice.

int i=4
object o = i // This works properly without any typecasting becausing boxing takes place automatically
string s= i // This does not work, even when the string is also reference type?
string s=(string)i //This also does not work even if i try to typecast the int to string.
string s= Convert.ToString(i); // this works.
.

Quindi voglio sapere perché string s = i and string s = (string)i non funziona e qual è la differenza nell'uso dell'utilizzo di (string)i, i.ToString(), and Convert.ToString(i).

È stato utile?

Soluzione

Quando si tratta di boxe e unboxing, i tipi hanno espressione esplicita e implicita.Quindi, in alcune circostanze, è abbastanza facile per il runtime per consentire la conversione implicita tra due tipi supportati, dire un INT32 a un doppio.Tuttavia, non vi è alcuna conversione implicita o esplicita tra un intero e una stringa, perché ovviamente, una stringa non è un intero (nonostante il fatto che una stringa può contenere caratteri per un numero intero).

string s = i; // attempt at implicit cast from Int32 to String, error
object o = i; // all types inherit from Object, so you may implicitly or explicitly cast from Int32 to Object.
s = (string)i; // attempt at explicit cast from Int32 to string, error
s = i.ToString(); // conversion
s = Convert.ToString(i); // conversion
.

È qui che viene visualizzato Convert.Convert contiene supporto per il tentativo di convertire primitivi noti (e tipi che supportano IConvertable) a un altro.Quindi, ToString o Convert.ToString sarebbero i metodi preferiti (Tostring e Convert.Tostring sono virtualmente sinonimo, tranne che la tostring ti offre alcune opzioni di formattazione).

Altri suggerimenti

Bene, string e object - entrambi sono tipi di riferimento.Tuttavia, object è un tipo di root per tutti i tipi .NET.

Quando si utilizza tale sintassi come (string)i, si sta tentando di utilizzare i tipi di conversione esplicita dei tipi di conversione.Ma questo tipo di conversione richiede la classe string per conoscere tutti i tipi di argomenti possibili.

Quindi abbiamo il metodo .ToString(), che può essere sovrascritto in qualsiasi classe e il suo valore di ritorno viene utilizzato come rappresentante di stringa di qualsiasi oggetto.

.

string s= i e string s= (stringa) non funziona

Poiché non sono una stringa, e digita il casting è un cast del tipo, non una conversione.Funziona solo se contiene una stringa o una sottoclasse di stringa (che non è possibile per le stringhe, ma potrebbe essere per altre classi).

.

Qual è la differenza nell'uso dell'utilizzo (stringa) I, i.tostring () e convertire.Tostring (I).

    .
  • (stringa) I: il cast Io a una stringa, deve essere assegnabile.

  • i.tostring (): chiama il metodo di lancio, che è restituito su sistema.Object, quindi disponibile su tutte le classi e struttura - ma restituisce alcun contenuto ragionevole se non sovrascritto.

  • Convert.tostring (i): Coonverts I in una stringa.Ciò include la chiamata di un convertitore che probabilmente chiama la tostring su questo caso raro.

    Alla fine, la fusione non è Aconversion.Per (stringa) I per lavorare devo essere una stringa, mentre converti i tentativi per renderlo una stringa.

È possibile specificare conversioni implicite ed esplicite in .NET, il motivo per cui la stringa S= fallisce è che non vi sia alcuna operazione di fusione integrata per un numero intero a una stringa.

Vedi questo MSDN Articolo Sul fusione per ulteriori informazioni

string s= i non funziona perché i tipi non corrispondono, int non andrà in una stringa.

string s=(string)i non funziona perché non può asumerà quale tipo di conversione deve essere utilizzata (I.e quale base)

Qualcosa come s = ""+i funzionerebbe d'altra parte in quanto asumenda la conversione di base 10.

.

Quindi voglio sapere perché string s = i e string s = (string)i non funzionano

La risposta breve è che non vi è alcuna impliet (primo esempio sopra) né esplicito (secondo esempio sopra) cast da int a string definito. Risposta leggermente più lunga; Quando si esegue l'esecuzione della struttura Int32 in C # Nessun comportamento di casting è stato programmato per abilitare lo sviluppatore di lanciare automaticamente da un int a una stringa

.

Qual è la differenza nell'uso dell'utilizzo di (string)i, i.ToString() e Convert.ToString(i)

Bene, il primo non funziona come hai detto, e come spiegato sopra. La seconda chiama il metodo ToString sul Int32 strutturaGode, che restituisce (come suggerisce il nome) una rappresentazione di stringa dell'oggetto. Va notato che questa è una stringa nuova di zecca, non in alcun modo relativa al valore originale. Il terzo esempio Convert.ToString sarà, sotto il cofano, chiamare qualunque sia il modo più appropriato per trasformare il parametro su una stringa - molto probabilmente chiamano il metodo ToString - così praticamente molto identico ad esempio 2.

Il metodo ToString() è sovrascritto da ciascun riferimento che è il metodo vitale nella classe dell'oggetto.String Calss Sostituisci quel metodo e fornisci un valore di stringa da questo.

L'implementazione predefinita del metodo di tostring restituisce il nome completo del tipo di oggetto, poiché mostra l'esempio seguente.

 Object obj = new Object();
      Console.WriteLine(obj.ToString());

// The example displays the following output:
//      System.Object
.

Questo comportamento è ereditato dai tipi di riferimento che non sovrascrivono il metodo della tostring.

Typecasting in C # funziona solo sulle linee di eredità di classe.L'oggetto è la radice di tutti i tipi in c # e quindi tutti i valori possono essere typecast ad esso.

string e int non condividono lo stesso ramo di ereditarietà e quindi non può essere lanciato direttamente da uno all'altro.

Convert.ToString() è un metodo progettato per convertire un numero intero su una stringa - non c'è da typecasting in corso, è solo eseguendo un metodo progettato per convertire un numero intero su una rappresentazione di stringa.

i.ToString() esegue la funzionalità equivalente a Convert.ToString(), tranne che i.ToString() ha sovraccarichi che consentono una maggiore flessibilità sulla rappresentazione del numero in formato stringa.

Un'ultima nota, le eccezioni alle regole di typecasting possono essere incluse dallo sviluppatore utilizzando un metodo public static explicit operator che consente allo sviluppatore di convertire un valore in un altro poiché vedono in forma.

La prima cosa da notare è che ogni classe deriva dall'oggetto.

La fusione INT a Object utilizza un INT32.

La stringa di fusione all'oggetto utilizza una stringa.

Non vi è un cast implicito da un numero intero a una stringa perché sono in diverse parti della gerarchia della classe - uno non si riferisce in alcun modo con un altro.Tuttavia, poiché la stringa viene utilizzata così spesso per l'oggetto di output (e quindi tutti i suoi figli) hanno un metodo Tostring () per comodità.

Comunque convert è scritto specificamente per essere in grado di convertire da un tipo a un altro, ad esempio convert.tobool (x) può analizzare "true" o "false" per booleano, e come mostrato può convertire un numero interoUna stringa - di nuovo questa è davvero una comodità che probabilmente basta chiamare int32.tostring () sotto il cofano.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top