Voilà la question. Y at-il quelque chose que vous pouvez faire avec les syndicats C++ que vous ne pouvez pas avec C# Structures explicites?(.net) Y a-t-il une différence intrinsèque entre les structures explicites .net et les unions C++?
(.net) Y a-t-il une différence intrinsèque entre les structures explicites .net et les unions C++?
Répondre
Les structures explicites C# ont des problèmes en ce qui concerne les références/membres de taille pointeur. Parce que vous devez spécifier explicitement l'emplacement, mais "sizeof (IntPtr)" n'est pas une constante de compilation (contrairement à C++ sizeof), il est impossible d'utiliser des membres de taille pointeur dans des structures explicites lorsque votre assembly doit être utilisable dans les deux processus 32 bits et 64 bits.
En outre, il est possible d'utiliser struct explicites de « convertir » entre les références et pointeurs:
[StructLayout(LayoutKind.Explicit)]
struct Test
{
[FieldOffset(0)]
public IntPtr ptr;
[FieldOffset(0)]
public string str;
}
Lorsque vous faites cela, votre Assemblée doivent obtenir l'autorisation de code non sécurisé; et il y a le problème que le GC ne saura pas quoi faire avec le contenu struct - est-ce un pointeur que le GC devrait suivre, ou est-ce juste un nombre entier?
Donc, pour répondre à votre question: "Y a-t-il quelque chose que vous pouvez faire avec les unions C++ que vous ne pouvez pas faire avec C# Structures explicites?"
Oui, il est parfois utile en C++ de presser deux bits de données dans les bits inférieurs d'un pointeur. Cela est possible car les deux bits de pointeur les plus bas seront toujours 0 lorsque le pointeur est aligné. Heck, si vous écrivez une liste doublement liée d'entiers de deux bits, vous pourriez même stocker les deux pointeurs et les données dans 32 bits! ("prev^next^data", voir XOR linked list)
Cependant, vous ne pouvez rien faire de semblable en C#, car vous confondriez le GC.
Non, pas vraiment. L'attribut LayoutKind est un moyen de transmettre des données Marshall dans des unions C++ dans interop. C'est en fait beaucoup plus flexible que le mot-clé union en C++, puisque vous avez un contrôle complet sur la disposition en C# avec les structures.
-1 Ceci est complètement faux. Explicit est conçu pour vous donner plus de flexibilité pour contrôler les décalages exacts. Le support syndical n'était pas une préoccupation majeure, et beaucoup de choses (comme les tableaux qui se chevauchent et d'autres types de non-tableaux) ne fonctionnent pas du tout. –
Vous ne pouvez pas superposer un tableau d'un autre type sur des données. Par exemple, vous ne pouvez pas superposer les octets [4] et int16, int16. Il va planter au moment de l'exécution.
- 1. .NET Le choix entre les structures et les classes
- 2. différence fondamentale entre .net 3.5 et 4.0
- 3. différence entre les expressions lambda et les méthodes anonymes - C#
- 4. Y a-t-il une différence entre DataTable.Clear et DataTable.Rows.Clear?
- 5. .net - Comment utiliser les attributs et y compris les arguments?
- 6. Différences entre Java et C# et .NET
- 7. Différence entre aide conceptuelle et aide API dans .NET?
- 8. Quelle est la différence entre X509Certificate2 et X509Certificate in .NET?
- 9. Y a-t-il une différence entre une "fonction" et une "macro" dans Objective-C?
- 10. Différence dans les hachages SHA entre ruby et C#
- 11. Pourquoi il y a une différence entre "importation" et "importation *"?
- 12. Différence entre les méthodes PrintWriter.printf et PrintWriter.format
- 13. Quelle est la différence entre les fichiers .resx et .config dans .NET?
- 14. Quelle est la différence entre les propriétés CurrentCulture et CurrentUICulture de CultureInfo dans .NET?
- 15. Y a-t-il des changements significatifs dans les fonctionnalités de localisation entre VS2005/.NET 2.0 et VS2008/.NET 3.5?
- 16. Différence entre les codes d'état et les codes d'erreur
- 17. Y a-t-il une différence spéciale entre un exe et un dll du point de vue .net?
- 18. Valeurs entre les formulaires Windows en C# .NET
- 19. Dans .NET, Quelle est la différence entre une ressource intégrée et une ressource?
- 20. Différence entre les opérations et les threads dans Cocoa
- 21. Y at-il une différence entre foo (void) et foo() en C++ ou C?
- 22. Différence entre les surcharges Expression.Call?
- 23. Différence entre "\ n" et Environment.NewLine
- 24. Quelle est la différence entre les méthodes anonymes (C# 2.0) et les expressions lambda (C# 3.0)?
- 25. Différence C++ entre 0 et 0,0
- 26. Différence entre les métadonnées personnalisées et les fonctions statiques?
- 27. Quelle est la différence entre les compléments et les macros?
- 28. La différence entre les logiciels libres et les logiciels libres
- 29. Y a-t-il une différence entre SqlConnection.CreateCommand et new SqlCommand?
- 30. Différence entre les délégués application
Marshaling a à voir avec la mise en page une fois qu'il devient des données natives. L'IntPtr est toujours un type C#. Jusqu'à ce qu'il soit rassemblé dans une zone de données, il existe en tant que membre sous la plate-forme gérée. –