9
votes

Utilisations pour [Obsolète (String, Bool)] Attribut pour .NET

Remarque: j'ai déjà vérifié MSDN, cela ne concerne pas ma question actuelle, voir ci-dessous.

J'essaie d'utiliser l'attribut obsolète sur un constructeur (évidemment obsolète) dans l'une de mes classes. Voici le scénario: p>

Je souhaite pouvoir forcer le développeur à mettre à jour le nouveau constructeur sans affecter le code déjà existant et déployé. De cette façon, je peux déployer mon code à la production tout à fait, mais d'un point de vue des développeurs, chaque fois qu'ils vont dans leur code, au lieu de simplement obtenir un "avertissement" que je suis sûr qu'ils vont simplement ignorer, je veux qu'ils obtiennent une Compiler une erreur parce que le statu quo n'est plus OK. P>

Donc, ma question est, cela n'affectera-t-il que les développeurs ou toutes les applications d'appel, ou est-ce que je suis tout faux? P>

Code exemple: p>

public class MyClass
{
   private string _userID; //new code

   [Obsolete("This constructor is obsolete, please use other constructor.", true)]
   public MyClass()
   {
      _userID = ""; //defaulting to empty string for all those using this constructor
   }

   public MyClass(string userID)
   {
      _userID = userID; //this is why they need to use this constructor
   }
}


3 commentaires

C'est vraiment une bonne question. Mais franchement, pourquoi ne pas l'essayer simplement? Un test ne semble pas être si difficile. Pas d'infraction cependant.


Je crois que cela affirmera quiconque compilair à la référence de l'assemblée.


La seule raison pour laquelle je n'essaie pas de le tester parce que je suis extrêmement crunchée pendant le temps et j'ai compris si quelqu'un savait déjà alors je tricherais :)


4 Réponses :


3
votes

L'attribut n'est qu'une instruction au compilateur. Les fichiers binaires existants peuvent toujours utiliser le constructeur.


0 commentaires

2
votes

Donc, ma question est, cela n'affectera-t-il que les développeurs ou toutes les applications d'appel, ou est-ce que je faisais tout ce qui est faux?

Cela ne sera utilisé que lors de la compilation, par le compilateur. Cela n'affectera pas les applications qui ont déjà été déployées.

En tant que tel, cela aura le comportement que vous essayez d'accomplir.


0 commentaires

11
votes

Oui, cela affecte principalement le compilateur - tout code pré-construit ne sera pas affecté ... sauf si ce code vérifie explicitement cet attribut. Par exemple, un code de sérialisation (XMLSerializer, IIRC) vérifie pour cela - il pourrait donc ne pas être entièrement sans effet secondaire ... mais en principal le code existant ne sera pas généralement être affectés jusqu'à ce qu'ils essaient de compiler ensuite.

Bien sûr, si vous utilisez ce code à partir de quelque chose qui utilise une compilation dynamique (par exemple ASP.NET sans pré-compiler), alors Tous les paris sont désactivés . .


0 commentaires

2
votes

C'est ce que [obsolète] déjà, aucune aide supplémentaire n'est nécessaire. Ce n'est pas un avertissement de temps de compilation, il génère une erreur:

Erreur CS0619: 'ConsoleApplication1.myclass.myclass ()' est obsolète: 'Ce constructeur est obsolète, veuillez utiliser un autre constructeur.'


3 commentaires

Je sais de cette classe très la question est de savoir que la simple présentation de l'obsolète ne donne que l'utilisateur un avertissement. Si vous utilisez l'attribut surchargé pour effectuer l'affichage d'erreur, une erreur apparaît, je veux juste m'assurer que cela n'affecte pas nos utilisateurs à l'aide de code préexistant.


Pour être précis, uniquement lorsque le deuxième paramètre à l'obsolèteattribute est vrai, le compilateur émettra une erreur. Sinon et par défaut, le compilateur n'émettra qu'un avertissement (sauf si vous compilez également avec les avertissements-as-erreurs activés).


Ce n'est pas un avertissement lorsque vous utilisez la surcharge de constructeur qui prend l'argument Erreur BOOL true . C'est ce que vous faites. Aucun code existant n'est affecté, seul le compilateur vérifie l'attribut.