2017-06-06 1 views
0

Voici mon code:Comment puis-je déclarer une variable vide?

private void button1_Click(object sender, EventArgs e) 
    { 
     var api = RiotApi.GetInstance("KEY"); 


     try 
     { 
      var game = api.GetCurrentGame(RiotSharp.Platform.EUW1, 79200188); 
     } 

     catch (RiotSharpException ex) 
     { 
      throw; 
     } 

     foreach (var player in game.Participants) // Can't find game variable 
     { 

     } 
    } 

Je ne peux pas appeler game.Participants dans ma boucle foreach parce que j'initialiser jeu dans l'instruction try. Je ne peux pas initialiser le jeu en dehors de l'instruction try, bien que parce que pour ce faire, je devrais lui donner une valeur temporaire et je ne sais pas quel type de valeur il sera.

Existe-t-il un moyen de déclarer une variable comme nulle? Ou y a-t-il potentiellement une manière différente de résoudre ceci?

+0

Quelque chose comme 'Game game = null;'? Veuillez noter que vous ne pouvez pas mettre 'var game = null;' et déclarer le type réel. –

+1

Envisager de déplacer la boucle dans l'essai, puisque vous ne voulez pas accéder aux jeux s'ils n'existent pas ou? –

+1

Quel est le problème avec inclure foreach dans le bloc try? –

Répondre

-1

essayer quelque chose comme ceci:

var game = (Object)null; 
+0

jeu est certainement pas la chaîne –

+0

désolé, je l'ai édité ... –

+0

Cela déclare juste 'jeu' comme' Object' et alors vous ne serez pas en mesure de faire 'foreach (var joueur dans le jeu.Participants)'. –

6

Vous annonciez variable avant bloc try-catch, sinon il ne sera pas visible à l'extérieur du try-catch bloc:

TypeOfGame game = null; // declare local variable here 
// note that you should provide initial value as well 

try 
{ 
    // assigne it here 
    game = api.GetCurrentGame(RiotSharp.Platform.EUW1, 79200188); 
} 
catch (RiotSharpException ex) 
{ 
    // I hope you have some real code here 
    throw; 
} 

// now you can use it 
foreach(var player in game.Participants) 
{ 

} 

Notez que votre bloc try-catch actuel n » t attraper quoi que ce soit, sauf RiotSharpException et même pour ce type d'exceptions, vous le retirez simplement. Donc, rien ne changera si vous allez supprimer try-catch complètement ici

var api = RiotApi.GetInstance("KEY"); 
// if api can be null, then you can use null-propagation operation ?. 
var game = api?.GetCurrentGame(RiotSharp.Platform.EUW1, 79200188); 
if (game == null) // consider to add null-check 
    return; 

foreach(var player in game.Participants) 
    // ... 

Pour en savoir plus: 3.7 Scopes de C# spécification

La portée d'un nom est la région du texte du programme dans lequel il est possible de se référer à l'entité déclarée par le nom sans qualification du nom. Scopes peuvent être imbriquées

Et surtout

• La portée d'une variable locale déclarée dans un -variable déclaration locale (§8.5.1) est le bloc dans lequel la déclaration se produit.

Ainsi, lorsque vous déclarez la variable locale dans le bloc try-catch, il peut être renvoyé que dans le bloc try-catch. Si vous déclarez une variable locale dans le bloc de corps de la méthode, elle peut être référencée dans la portée du corps de la méthode et dans les étendues imbriquées.

+0

Peut-être une idée de faire une vérification nulle avant le foreach au cas où l'exception est traitée dans son code réel (au lieu de simplement lancer) –

+0

@KlitosKyriacou d'accord, a également pensé à ce sujet, mais dans le code actuel en cas d'exception nous ne serons pas arriver à la boucle. Je pense que votre commentaire est une bonne note avant OP pour garder cela à l'esprit –

+0

wouldnt game.Participants dans le forloop tomber si la capture est levée? –

-2

chaîne y = null;

var x = y;

cela fonctionnera

0

Pourriez-vous faire quelque chose comme ça? Je ne sais pas quel type votre GetCurrentGame retaille de l'API alors je viens d'utiliser GameType comme un espace réservé.

private void button1_Click(object sender, EventArgs e) 
{ 
    var api = RiotApi.GetInstance("KEY"); 

    GameType game = new GameType();   

    try 
    { 
     game = api.GetCurrentGame(RiotSharp.Platform.EUW1, 79200188); 
    } 

    catch (RiotSharpException ex) 
    { 
     throw; 
    } 

    if(game == null || !game.Participants.Any()) return; 

    foreach (var player in game.Participants) // Can't find game variable 
    { 

    } 
} 
+0

malheureusement cela ne fonctionne pas comme un espace réservé :(Le type de retour est RiotSharp.CurrentgameEndpont.CurrentGame – FastCow

4

Quelque chose comme ceci:

private void button1_Click(object sender, EventArgs e) 
{ 
    var api = RiotApi.GetInstance("KEY"); 

    // if we have api, try get the game 
    var game = api != null 
     ? api.GetCurrentGame(RiotSharp.Platform.EUW1, 79200188) 
     : null; 

    // if we have game, process the players 
    if (game != null) 
     foreach (var player in game.Participants) 
     { 
      //TODO: put relevant logic here 
     } 
} 

S'il vous plaît, avis, que try {} catch (RiotSharpException ex) {throw;} est une construction redondante et peut être a chuté.

+0

Pourquoi est-il redondant? – FastCow

+3

@FastCow: vous * attraper * l'exception et ne faites rien, mais * jetez * encore –