C# Struct Pas De Constructeur Sans Paramètre? Voir ce dont j'ai besoin pour accomplir
Je suis en utilisant une structure de passer à un non géré DLL en tant que
[StructLayout(LayoutKind.Sequential)]
public struct valTable
{
public byte type;
public byte map;
public byte spare1;
public byte spare2;
public int par;
public int min;
public byte[] name;
public valTable()
{
name = new byte[24];
}
}
Le code ci-dessus ne compile pas car VS 2005 va se plaindre que "les Structures ne peuvent pas contenir explicite sans paramètre constructeurs". Dans le but de réussir cette structure de ma DLL, j'ai passer un tableau de struct est comme pour l' valTable[] val = new valTable[281];
Ce que j'aimerais faire, c'est quand je dis new
, le constructeur est appelé et il crée un tableau d'octets, comme je suis en train de manifester parce que la DLL est à la recherche pour que le tableau d'octets de taille 24 dans chaque dimension.
Comment puis-je y arriver?
OriginalL'auteur | 2010-03-03
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser un fixe la taille de la mémoire tampon - dont je soupçonne que vous voulez vraiment, de toute façon, de manière à obtenir les données "en ligne" dans la structure (plutôt qu'une référence à un tableau d'ailleurs).
Vous aurez besoin de déclarer la struct aussi dangereux que bien.
Noter que toute "solution" qui nécessite l'appel d'une méthode statique ou de fournir tout type de constructeur personnalisé échouera avec votre objectif explicite est d'être capable de créer un tableau de ces structures.
msdn.microsoft.com/en-us/library/zycewsya(SV.80).aspx
Je n'avais aucune idée que le
fixed
mot-clé peut être utilisé comme cela, et j'ai voulu quelque chose comme cela à plusieurs reprises. J'....J'....I love you, man!Ne peut pas dire que je n'ai jamais utilisé moi-même, mais que je devais écrire à ce sujet pour le C# en Profondeur 🙂
être prudent avec elle. Il est facile de se tromper. Voir blogs.msdn.com/ericlippert/archive/2009/08/27/... pour quelques réflexions sur le sujet. Franchement, la plupart du temps, je serais probablement aller avec votre neuf-solution entière. 🙂
OriginalL'auteur Jon Skeet
Je vous recommande d'écrire ce code.
OriginalL'auteur Andrey
Struct constructeurs sont similaires pour les constructeurs de classe, sauf pour les différences suivantes:
sans paramètre constructeurs. Struct
les membres sont automatiquement initialisés
à leurs valeurs par défaut.
dans la forme de base (liste d'arguments).
Cela signifie que
Typique de la façon d'obtenir autour de ce scénario est de créer une méthode statique
qui permettra de créer votre nouvelle instance, initialiser la manière que vous voulez, et
le retourner. C'est la manière dont c'est fait .NET pour obtenir des structures initialisé
avec des valeurs spécifiques.
ref;
les Structures ne peuvent pas contenir explicite sans paramètre constructeurs. POURQUOI?
OriginalL'auteur Asad Butt
Bâtiment sur Asad bout de réponse, vous pouvez créer une méthode statique pour effectuer le travail de votre constructeur comme suit:
Vous verrez classes dans le .NET Framework suivant ce motif déjà.
Guid.NewGuid()
immédiatement vient à l'esprit. Il y a peut être d'autres.Pourquoi avez-vous
public valTable()
là?OriginalL'auteur Paul Turner
Pas la plus propre de le fixer, mais vous pouvez simplement ajouter un paramètre et ne jamais l'utiliser?
Contrecarré les -1 vote. Mannequin paramètres sont un peu ennuyeux, mais à peine inconnue. La normale IDisposable modèle a un paramètre fictif, par exemple (si une classe n'est pas un finaliseur, sa méthode dispose ne doit jamais être appelée avec une valeur 'false').
D'accord avec contrarié. les travaux de contournement de produire d'autres problèmes, par exemple de la mémoire tampon.blockcopy et byte[].copyto permettra à la fois d'échouer sur les champs fixes. La restriction de langue est préférable d'éviter les erreurs les plus fréquentes, mais le " bon " chemin ne devrait pas nécessiter la rédaction d'une charge de bateau de travail autour de code.
OriginalL'auteur jonnystoten
Pour ce que vous devez faire vous vraiment besoin d'une classe je pense. Une struct implémente déjà un constructeur sans paramètre par défaut, ce qui est pourquoi vous ne pouvez pas définir un autre.
C'est une mauvaise réponse.. il devrait être supprimé.
OriginalL'auteur pierre