[C#] [FxCop] Je l'aurais un jour mon perfect mais j'aurais besoin d'un coup de m

scoubidou944 Messages postés 714 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 19 janvier 2017 - 25 mai 2005 à 01:19
scoubidou944 Messages postés 714 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 19 janvier 2017 - 26 mai 2005 à 00:13
Question 1 :

------------

Il me sort 'OverrideEqualsAndOperatorEqualsOnValueTypes' mais comme il
s'agit d'une structure passé à une DLL système, il refuse le virtual
Equals. Pourquoi a-t-il besoin que je lui implémente Equals ?



[StructLayoutAttribute(LayoutKind.Sequential, CharSet=CharSet.Ansi)]

public struct Win32FindDataAnsi

{

private int dwFileAttributes;

private FILETIME ftCreationTime;

private FILETIME ftLastAccessTime;

private FILETIME ftLastWriteTime;

private int nFileSizeHigh;

private int nFileSizeLow;

private int reserved0;

private int reserved1;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst=DirectoryUtility.MaxPath)]

private string cFileName;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst=14)]

private string cAlternateFileName;



[...] Properties

}


Question 2:

Pour changer, une autre erreur qui revient : 'DoNotIndirectlyExposeMethodsWithLinkDemands' sur cette fonction (simplifiée)



public static void OpenFolder (string path)

{

System.Diagnostics.Process.Start("explorer.exe", path);

}

5 réponses

TheSaib Messages postés 2367 Date d'inscription mardi 17 avril 2001 Statut Membre Dernière intervention 26 décembre 2007 22
25 mai 2005 à 01:32
1.

Le problème dans les comparaer structure c'est que pour les comparer il va utiliser la reflection ce qui est très lent. En implémentant le equals tu permets au runtime de gerer les opérations égalitaires plus rapidement. Cependant dans ton cas ce n'est pas possible et pas logique.

"When to Exclude Warnings :
It is safe to exclude a warning from this rule if instances of the value type will not be compared to each other."

C'est ton cas.

2.

Je pense que ce qu'il ne lui plaît pas c'est que tu fasses un process.start (appel d'un processus exterieur) dans une fonction public en l'occurence accessible partout (dans et en dehors de ton prog). Par soucis de sécurité et de stabilité ce n'est pas super.
Imagine un virus qui te references, il apelle en boucle ta méthode ... tu peux rebooter :)

::|The S@ib|::
MVP C#.NET
scoubidou944 Messages postés 714 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 19 janvier 2017
25 mai 2005 à 11:51
1.

Il est vrai que je n'ai pas besoin de comparer cet objet mais j'vois
pas trop comment faire péter le warning pour cet objet précis.


2.

En effet ca pourrait etre la réponse. Alors si par exemple on veut
lancer le mailer par défaut ou ouvrir un poste de travail sur un folder
précis, y-a-t-il qql chose en interne qui le fasse ?



3.

non y'a pas de 3, c'est juste pour dire merci et franchement, qu'est ce qu'on ferait sans vous tous ;p
----------------------------
C++ forever
C# amateur
TheSaib Messages postés 2367 Date d'inscription mardi 17 avril 2001 Statut Membre Dernière intervention 26 décembre 2007 22
25 mai 2005 à 12:05
Pour la première erreur tu ne pourras pas la faire sauter a mon avis, juste l'exclure.
Tu peux utiliser ta méthode la met simplement pas en public mais en internal.

::|The S@ib|::
MVP C#.NET
scoubidou944 Messages postés 714 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 19 janvier 2017
26 mai 2005 à 00:06
1. voici la solution à rajouter dans la structure :



#region FxCop Warning

public override bool Equals(object firstElement)

{

return base.Equals (firstElement);

}



public override int GetHashCode()

{

return base.GetHashCode();

}

#endregion


----------------------------
C++ forever
C# amateur

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
scoubidou944 Messages postés 714 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 19 janvier 2017
26 mai 2005 à 00:13
pour certaines structures il y a besoin de définir les operateurs == & != :


public static bool operator ==(YourBaseClass obj1, YourBaseClass obj2)

{

return Object.Equals (obj1, obj2);

}



public static bool operator !=(YourBaseClass obj1, YourBaseClass obj2)

{

return !Object.Equals (obj1, obj2);

}

----------------------------
C++ forever
C# amateur
Rejoignez-nous