[C#] comment tester si une variable est initialisée ?

comment tester si une variable est initialisée ? [C#] - C#/.NET managed - Programmation

Marsh Posté le 21-03-2007 à 14:22:10    

Bonjour,
 
je cherche la commande qui permet de tester qu'une variable est bien initialisée
 
par exemple une classe Compte :
 

Code :
  1. public class Compte{
  2.  
  3.   // date d'activation du compte
  4.   private DateTime _dateActivation;
  5.   public DateTime dateActivation{
  6.     get{ return _dateActivation; }
  7.     // pas de set public
  8.   }
  9.   // numero du compte
  10.   private int _numeroDeCompte;
  11.   public int _numeroDeCompte{
  12.     get{ return _numeroDeCompte; }
  13.     // pas de set public
  14.   }
  15.   // constructeur : un compte non-activé par défaut
  16.   public Compte(int numeroDeCompte){
  17.     this._numeroDeCompte = numeroDeCompte;
  18.   }
  19.   // activer un compte
  20.   public void activer(){
  21.     // tester si le compte n'est pas déja activé
  22.     if( estActive() )
  23.       throw new Exception("Le compte "+_numeroDeCompte +" a déja été activé le "+_dateActivation);
  24.     // enregistrer la date d'activation
  25.     _dateActivation = DateTime.now;
  26.   }
  27.   // tester si le compte est activé
  28.   public bool estActive(){
  29.    return _dateActivation == null;  // <=================    ce test ne compile pas =========================
  30.   }
  31. } // Fin class Test


 
Quel test test ou fonction faut-il utiliser dans la methode estActive() pour controler que l'attribut _dateActivation  n'a pas été déclarée ?


Message édité par nemohp le 21-03-2007 à 14:23:14
Reply

Marsh Posté le 21-03-2007 à 14:22:10   

Reply

Marsh Posté le 21-03-2007 à 15:07:04    

utiliser _dateActivation.Equals(null) semble être accepté

Reply

Marsh Posté le 21-03-2007 à 15:26:14    

Les DateTime sont des types valeur, c'est non nullable en 1.1.
 
Par défaut ça vaut DateTime.MinValue, tu peux donc tester si différent de cette valeur.

Reply

Marsh Posté le 21-03-2007 à 15:38:07    

arf... ça craint dotnet parfois ...

Reply

Marsh Posté le 23-03-2007 à 16:29:09    

nemohp a écrit :

arf... ça craint dotnet parfois ...

La vieille remarque complètement gratos.
Surtout venant d'un mec qui ne sais pas coder correctement.
 
La solution à ton pb n'est pas lié au langage, mais à ta façon de coder.
Pour savoir si c'est initialisé, il suffit de mettre une valeur par défaut non utilisée (ex : DateTime.MinValue), et de vérifier au moment où tu le veux que cette valeur a changé.
L'avantage c'est que ça marche pour tout (types référence ou valeur), et que si jamais dans les version ultérieur du framework, la valeur par défaut change, tu es assuré de la compatibilité ascendante.
 
Note : ca marche aussi en Java, C++, C, et j'en passe.

Reply

Marsh Posté le 23-03-2007 à 17:06:07    

je vois pas en quoi c'est mal codé... et ta remarque est également "gratos"
 
Ta technique, même si elle marche, n'est pas plus logique que mon idée. Instancier cette date mini, c'est du bricolage.
 
De nombreux languages permettent de tester si un object déclaré a bien été instancié.
D'ailleurs en C#2, ça a été implanté avec les nullables. Donc ma question est loin d'être celle d'un mauvais codeur...

Message cité 1 fois
Message édité par nemohp le 23-03-2007 à 17:06:46
Reply

Marsh Posté le 23-03-2007 à 18:27:03    

nemohp a écrit :

De nombreux languages permettent de tester si un object déclaré a bien été instancié.


Tu fais la différence entre un type valeur et un type référence ?
Ca veut dire quoi "instancier" un type valeur, stp ?
 
Plutôt que de cracher dans la soupe gratuitement, tu ferais mieux de garder ton énergie pour apprendre, ça te permettra de faire des critiques constructives.

Reply

Marsh Posté le 05-03-2008 à 18:27:33    

Salut (au cas ou tu serais de passage et que tu verrais ma réponse),
 
Je trouve intérescente ta solution, mais comme la valeur min d'une DateTime est 01/01/01 00:00 ... Il n'est pas impossible qu'une telle date soit présente, non ? Voila par curiosité.  
 
Est ce que tu es sure de ne jamais avoir à faire à cette date ?

Reply

Marsh Posté le 06-03-2008 à 08:23:12    

Je rejoins _Mose_. D'apres moi, la logique de ton programme ne devrait pas reposer sur le fait que les variables possedent l'etat "non initialise".
 

Reply

Marsh Posté le 21-04-2008 à 20:49:44    

Dans .NET 2.0, il y a une classe Nullable qui permet de gérer ce genre de problème.
Il suffit simplement d'écrire un truc du genre:
 
Nullable<DateTime> myDate;
 
if (myDate == null)
{
  /* non initialisé */
}
else
{
  Console.WriteLine(myDate.Value);
}


---------------
Distributeurs automatiques à proximité | Jupiteo - Création et optimisation d'application web
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed