2010-06-08 6 views
2

Dans l'extrait de code suivant, si j'omets la ligne de code entourée par /////, j'obtiens une erreur qui se lit comme suit: "Utilisation de la variable locale non affectée CurrentDate". Il me semble un peu idiot de donner juste une valeur arbitraire à CurrentDate, y a-t-il un meilleur moyen de contourner cela?Variable Context Question

DateTime CurrentDate; 

/////////////////////////// 
CurrentDate = DateTime.Now; 
/////////////////////////// 

if(1==1) 
{ 
CurrentDate = DateTime.Now.AddDays(1); 
} 

if(CurrentDate == DateTime.Now) 
{ 
... 
} 
+0

Quel compilateur utilisez-vous? –

Répondre

3

Ne pas faire if (1 == 1)? Sérieusement si le compilateur vous donne cette erreur c'est soit parce que votre code est faux, soit parce que c'est trop complexe et pourrait être mieux exprimé d'une autre manière où vous n'avez pas besoin d'accéder à des variables non assignées.

Pouvez-vous trouver un exemple réel où vous obtenez cette erreur où il n'y a pas de solution évidente en faisant un simple refactoring? Cela rendrait votre question plus responsable.

Cela dit que si vous ne courez dans une de ces situations, il y a quelques autres approches que vous pouvez utiliser:

DateTime CurrentDate = DateTime.MaxValue; 
DateTime CurrentDate = default(DateTime); 
DateTime? CurrentDate = null; 

J'aime la dernière option, car elle exprime ce que vous voulez dire - que vous ne connaître la valeur. Cela rend le code un peu plus détaillé, car vous disposez d'un niveau de redirection supplémentaire chaque fois que vous souhaitez accéder à une valeur. Vous pouvez utiliser le temps passé à taper .Value pour déterminer si vous avez correctement géré la situation où elle pourrait être nulle.

Également: Avez-vous considéré que la valeur de DateTime.Now pouvait changer entre le premier et le deuxième appel? Cette déclaration finale if semble ne pas faire ce que vous vouliez.

+0

@Byers La valeur par défaut de DateTime est DateTime.MinValue donc au lieu d'utiliser DateTime.MinValue, vous avez affecté DateTime.MaxValue dans votre exemple, ce qui est faux – Adeel

+0

err 'Utilisation de la variable locale non affectée' a besoin de cela, pas complexe ou horriblement mal code - le message peut être recréé en quelques lignes simples de code. –

+0

@jdk: Cette erreur de compilation se produit dans deux situations: 1) votre code est erroné. 2) votre code est "correct" mais le compilateur n'est pas capable de le prouver (par exemple ici il manque que 1 == 1 soit toujours vrai) et donc il donne une erreur. Dans la situation 1), vous devez corriger le code. Dans la situation 2), vous devez soit a) refactoriser votre code pour que vous puissiez prouver au compilateur que vous n'accédez jamais à une variable non assignée, soit b) contourner la vérification du compilateur en assignant une valeur fictive à la variable non assignée. J'ai interprété la question comme voulant connaître la solution pour la situation 2b. –

1

Vous pouvez le faire:

DateTime CurrentDate; 


if(1==1) 
{ 
CurrentDate = DateTime.Now.AddDays(1); 
} 
else 
{ 
/////////////////////////// 
CurrentDate = DateTime.Now; 
/////////////////////////// 
} 

if(CurrentDate == DateTime.Now) 
{ 
... 
} 

Cela permettra d'éliminer l'erreur du compilateur.

NOTE: dans ce VS2008 sera compilation:

if(1==1) 
{ 
CurrentDate = DateTime.Now.AddDays(1); 
} 
//else 
//{ 
///////////////////////////// 
//CurrentDate = DateTime.Now; 
///////////////////////////// 
//} 

if(CurrentDate == DateTime.Now) 
{ 
// 
} 
+0

Le if (1 == 1) donne l'impression d'avoir un bloc else, mais c'est ainsi que fonctionne le compilateur C#, man ...! – code4life

+0

+1 pour avoir remarqué que le code dans la question ** compile **, au moins dans VS 2008. Je me demande quel compilateur il utilise alors ... J'ai posé une question de clarification. –

0

pourquoi ne pas simplement affecté directement

DateTime CurrentDate = DateTime.Now; 
0

L'exemple est un peu alambiquée, mais, non, il n'y a pas un meilleur moyen de contourner cela.

Vous devez attribuer une valeur à une position variable dans un bloc conditionnel, même si vous êtes sûr que le bloc exécutera toujours (le 1 = 1 dans votre exemple)

Cependant, je recommanderais contre DateTime Maintenant que la valeur d'initialisation, parce que par un certain mirracle, le bloc ne s'exécute pas, la situation devrait être facilement détectable, et DateTime.Now est bien plus réel que DateTime.MinValue

0

J'ai toujours mis mes objets à zéro qu'il lève une exception de référence nulle si une valeur n'est pas créée. Cependant, comme Hans a souligné que null ne fonctionne pas dans cette situation, Microsoft a décidé de rendre DateTime nullable dans leur sagesse infinie. En tant que tel, j'utilise normalement DateTime.MinValue, car il me donne une valeur spécifique à vérifier et autre que le temps de voyager sera toujours dans le passé, contrairement DateTime.MaxValue qui vient ici pour certains d'entre vous archaïque 32bit peeps.

Exemple

DateTime CurrentDate; 

/////////////////////////// 
CurrentDate = DateTime.MinValue; 
/////////////////////////// 

if(1==1) 
{ 
CurrentDate = DateTime.Now.AddDays(1); 
} 

if(CurrentDate == DateTime.Now) 
{ 
... 
} 
+0

Indice: compilez en premier, postez plus tard. –

+0

Good Point Hans, Edité avec ce que je fais d'habitude avec datetime. –