9
votes

Les structures C # sont-elles sûres?

est un coffre-fort C # struct?

Par exemple s'il ya: P>

class DadData
{
    public Data TheData { get; set; }
}


3 commentaires

Ça dépend. Que faites-vous avec la structure?


En outre, vous ne devriez pas faire une structure mutable. Stackoverflow.com/Questtions/441309/Whay-Aretable -Structs-e vil


Selon ce Stackoverflow.com/Questions/ 2353014 / sont-les-C-Structs-Structs-SAF E / ... Vous devriez.


6 Réponses :


-2
votes

non. Pourquoi serait-il en sécurité? Ce sont juste des données. Ça ne devient pas de fil-coffre-fort par magie.


0 commentaires

1
votes

A struct n'est pas plus sûr du thread-Safe qu'un champ ordinaire ou une variable. Si vous avez au moins un fil le modifiant, et au moins un fil de discussion de plus en touchant de quelque manière que ce soit en même temps, vous risquez de vous retrouver avec un comportement inattendu / indéfini.

En outre, les structures mutables sont des odeurs de code. Y a-t-il une raison particulière dont vous avez besoin pour être un struct au lieu d'une classe ? Avez-vous besoin d'une sémantique de type de valeur pour ces données?


0 commentaires

9
votes

Non, les structures de .NET ne sont pas intrinsèquement sûres.

Cependant, la sémantique de copie-valeur-valeur que les structures ont une grande pertinence pour cette conversion.

Si vous passez vos structures autour de vos structures et que vous les attribuez d'une manière d'une certaine manière pour les variables ou les paramètres de carte de passage (pas de mots-clés REF ou OUT), une copie est utilisée.

Bien sûr, cela signifie que toutes les modifications apportées à la copie ne sont pas reflétées dans la structure d'origine, mais c'est quelque chose à conscience de leur passage.

Si vous accédez directement à la structure de manière à ne pas impliquer une sémantique de copie-valeur-valeur (par exemple, accéder à un champ statique qui est le type de structure, et comme Marc Gravel souligne dans sa réponse , il existe de nombreuses autres manières) sur plusieurs threads, alors vous devez prendre en compte compte le thread-sécurité de l'instance.


2 commentaires

Et pour faire cela pire, cela dépend aussi d'un super de savoir si votre code parle à un champ , une variable variable ou une propriété . Heureusement dans ce cas, la propriété auto-mise en œuvre ( TheData ) supprime la plupart d'entre elles. Donc, je le mentionne simplement pour l'exhaustivité ;-p


Merci Casperone! Merci Marc! Comme la Casperone l'a dit, j'ai pensé "la sémantique de copie-valeur que les structures ont une grande pertinence pour cette conversation"; Pourtant, omis de voir des instructions sur les réfractions. Ce code n'est pas mon code actuel, mais une représentation. J'écris quelques applications multi-filetées; et certains outils de programmation parallèle courants sont C #; Parce que certains modèles retournent fréquemment;) (Sûr je vais chercher des critiques ici quand je suis sorti avec quelque chose de digne).



10
votes

Bien - Meilleure pratique est que les structures devraient toujours (sauf dans quelques scénarios très spécifiques, et même à risque) être immuables. Et les données immuables sont toujours en sécurité. Donc, si vous avez suivi la meilleure pratique et faites ceci:

struct Data
{
    readonly int _number;
    public int Number { get { return _number; } }

    public Data(int number) { _number = number; }
}


0 commentaires

1
votes

Différents threads Lectures directs et écrit de différents membres d'une structure mutable n'interféreront pas les uns avec les autres. Différents threads L'accès au même membre via des méthodes verrouillées se comportera en fonction de la sémantique de ces méthodes. Ces faits peuvent permettre aux structures mutables de permettre un comportement de fil-sécurité.

Emplacements de stockage mutables tenant des structures qui n'offrent aucun moyen de mutation, sauf une offre de remplacement absolue sans thread-sécurité, sauf que dans les cas où une structure détient un seul entiers 32 bits ou une seule référence d'objet, une tentative de lecture Un tel emplacement de stockage de struct (mono-élément) en même temps qu'il est écrit est garanti de lire des données entièrement anciennes ou entièrement de nouvelles données. Notez qu'il n'est pas possible d'utiliser l'une des méthodes verrouillées avec des structures immuables - même des structures contenant uniquement une seule référence entier ou objet.


0 commentaires

0
votes

Non, ils ne sont pas. J'ai créé une application très simple pour voir si les threads producteurs / consommateurs 10/10 accèdent à la même variable de structure. Et éventuellement, vous verrez du débogueur.breake (); sera frappé. La balance des banques ne devrait jamais passer sous la valeur 0. XXX


0 commentaires