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

Signaler
Messages postés
714
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
19 janvier 2017
-
Messages postés
714
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
19 janvier 2017
-
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

Messages postés
2368
Date d'inscription
mardi 17 avril 2001
Statut
Modérateur
Dernière intervention
26 décembre 2007
20
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
Messages postés
714
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
19 janvier 2017

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
Messages postés
2368
Date d'inscription
mardi 17 avril 2001
Statut
Modérateur
Dernière intervention
26 décembre 2007
20
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
Messages postés
714
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
19 janvier 2017

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
Messages postés
714
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
19 janvier 2017

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