2009-05-18 24 views

risposta

20

In C# si utilizzano le strutture per definire i tipi di valore (in contrapposizione ai tipi di riferimento dichiarati da class es).

In C++, una struttura è la stessa cosa di una classe con un livello di accessibilità predefinito di public.

Quindi la domanda dovrebbe essere: sono le strutture in C# diverse dalle classi in C++ e, sì, sono: non è possibile derivare da strutture C#, non è possibile avere funzioni virtuali, non è possibile definire costruttori predefiniti, non si dispone distruttori, ecc.

+1

Il punto di Martin sulle strutture C# essendo i tipi di valore è piuttosto importante per le prestazioni perché devono essere in box e unbox per alcune operazioni. Si prega di leggere su "boxe" se è necessario preoccuparsi delle prestazioni. – dss539

11

Structs in C# molto diverso da classi, vedere Structs vs Classes per ulteriori

Structs in C++ sono identici a classi, eccetto che i membri sono pubblici per impostazione predefinita. Oltre a ciò, una struct C++ può fare tutto ciò che una classe C++ può fare.

+2

Le strutture C# possono avere costruttori: semplicemente non possono avere un costruttore * predefinito *. –

+0

Marc: Hai notato il mio errore intenzionale lì, ben fatto. . . post scriptum L'ho risolto :) –

+0

@Marc: Hanno sempre un costruttore predefinito, non puoi definire il tuo proprio :-) – MartinStettner

0

Sì.

struct in C# sono Plain Old, in valore, i tipi di dati (in contrasto con le classi che sono di riferimento e hanno ll la roba OO)

struct in C++ sono solo di classe che sono pubblici per impostazione predefinita.

0

Stai cercando di interoperare tra C++ gestito e C#? Se è così, ci sono estensioni a C++ per consentire questo: vedere link

0

Una struttura C# è un codice gestito, che verrà liberato dalla spazzatura C# quando nessuno si riferisce ad esso più. Il suo distruttore viene chiamato ogni volta che il garbage collector decide di ripulirlo.

Una struttura C++ è un oggetto non gestito, che è necessario pulire autonomamente. Il distruttore è chiamato in modo prevedibile quando lo elimini, o esce dall'ambito.

+0

Le strutture C# non sono oggetti; non sono * loro * soggetti alla garbage collection (a meno che non siano campi su un tipo che * è * garbage collection, cioè una classe). Le strutture C# non possono definire un finalizzatore: "Errore 1 Solo i tipi di classe possono contenere distruttori" –

+0

Un buon punto sul finalizzatore. Ma le strutture sono oggetti che penso: "MyStruct is object" restituisce true. E qualcuno deve liberare la memoria che la struttura usa; il garbage collector lo farà, se la struttura è nell'heap. – Andomar