2017-06-06 132 views
0

這裏是我的代碼:如何聲明一個空變量?

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 
     { 

     } 
    } 

我不能叫game.Participants在我的foreach循環,因爲我try語句裏面初始化遊戲。我不能在try語句之外初始化遊戲,但是因爲要這樣做,我必須給它一個臨時值,我不知道它會是什麼樣的價值。

有沒有辦法將變量聲明爲null?或者是否有解決此問題的其他方法?

+0

像'遊戲遊戲= NULL;'?請注意,你不能放'var game = null;'並且必須聲明實際的類型。 –

+1

考慮將循環移入嘗試,因爲如果遊戲不存在或不存在,您不想訪問遊戲? –

+1

在try塊內包含foreach有什麼錯誤? –

回答

-1

嘗試這樣的:

var game = (Object)null; 
+0

遊戲絕對不是字符串 –

+0

對不起,我編輯它... –

+0

這只是聲明'game'爲'Object',然後你將不能夠做到'的foreach(在game.Participants VAR播放器)'。 –

6

之前try-catch塊應聲明變量,否則它不會是try-catch塊外部可見:

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) 
{ 

} 

注意,目前的try-catch塊不要」除了RiotSharpException之外什麼也沒有,甚至對於那種類型的例外,你只需重新拋出它。所以,什麼都不會改變,如果你刪除try-catch這裏完全

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) 
    // ... 

延伸閱讀:3.7 Scopes從C#規範

一個名字的範圍是程序文本的區域內,它是 可能引用名稱聲明的實體而不具有 名稱的資格。範圍可以嵌套

,尤其是

•在 局部變量聲明中表示的局部變量的範圍(第8.5.1節)是其中 聲明所在的塊。

所以當你聲明try-catch塊內的局部變量時,它只能在try-catch塊內引用。如果在方法體塊中聲明局部變量,則可以在方法體範圍內和嵌套範圍內引用它。

+0

可能是一個想法,如果在foreach異常在他真正的代碼(而不是僅僅投擲)處理 –

+0

@KlitosKyriacou同意,也想過這個問題,但目前的代碼任何異常的情況下,之前做一個空檢查,我們不會進入循環。我覺得您的評論是一個很好的說明脫穎而出OP來記住這一點 –

+0

難道不game.Participants在for循環翻倒如果趕上拋出? –

-2

string y = null;

var x = y;

這將工作

0

你能做這樣的事嗎?我不知道你的GetCurrentGame是什麼類型的API回退,所以我只用GameType作爲佔位符。

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

不幸的是,這並不作爲佔位符:(返回類型RiotSharp.CurrentgameEndpont.CurrentGame – FastCow

4

事情是這樣的:

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 
     } 
} 

請,通知,即try {} catch (RiotSharpException ex) {throw;}冗餘建設和可下降

+0

爲什麼冗餘 – FastCow

+3

@FastCow工作:你*抓*例外呢?並且什麼都不做,但是*再次扔掉它 –