Magazine Internet

[Vs] Impossible de créer une valeur constante de type clôture

Publié le 20 mai 2009 par Jeremy.jeanson

Le Famework .net regorge de petites subtilités. L’une d’entre elles est de ne pas autorisé la création de constantes de type référence hors mis String. Dans Visual Studio cela se traduit par le fameux message :

Impossible de créer une valeur constante de “type clôture”…

Pour palier à ce soucis bon nombre de développeurs foncerons tout droit vers un déclaration de la forme (exemple avec deux types : un objet est une couleur :

Vb
Public Class Class1
	Private _objectConstant As New Object()
	Private _couleurConstante As Color = Color.FromArgb(255, 200, 180, 0)
End Class
C#
public class Class1
{
	private Object _objectConstant = new Object();
	private Color _couleurConstante = Color.FromArgb(255, 200, 180, 0);
}

... C'est moche, très moche. Chaque classe vas alors se retrouver avec une instance privée de la variable que l’on voudrait constante... on est bien loin de ce qu’est semblé être une constante.

Une solution propre dans un premier temps est de corriger la déclaration en répondant aux besoin d’une constante :

  • être unique (tiens statique semblerait être un bon chois).
  • n’être instancié que dans la classe l’utilisant (ça sent le ReadOnly ça)

Ensuite il y a le souci de l’instanciation où la contrainte est la suivante:

  • être instancié quand on a besoin d’utiliser notre classe (variable statique?… et le constructeur statique dans tout ça?)

Donc un développeur qui s’est poser ce genre de question finira par avoir une solution du style :

Vb
Public Class Class1
	Private Shared ReadOnly _objectConstant As Object
	Private Shared ReadOnly _couleurConstante As Color

	Shared Sub New()
		_objectConstant = New Object()
		_couleurConstante = Color.FromArgb(255, 200, 180, 0)
	End Sub
End Class
C#
public class Class1
{
	private static readonly Object _objectConstant;
	private static readonly Color _couleurConstante;

	static Class1()
	{
		_objectConstant = new Object();
		_couleurConstante = Color.FromArgb(255, 200, 180, 0);
	}
}

Le gros avantage de cette solution est d’avoir un zone dédiée à l’instanciation de ces variables et donc un structure relativement propre.


Retour à La Une de Logo Paperblog

A propos de l’auteur


Jeremy.jeanson 1573 partages Voir son profil
Voir son blog

l'auteur n'a pas encore renseigné son compte l'auteur n'a pas encore renseigné son compte