Zoals men wel weet bevat C# het impopulaire keyword goto. Maar is het echt zo slecht dit te gebruiken, als het in een oogopslag is te zien waar hij heenspringt?
Neem de volgend stukje uit mijn code:
Is het werkelijk zo ranzig uit de foreach te jumpen, terwijl het duidelijk is waar hij heenspringt? Of is het netter een boolean te zetten, en in de parent loop deze boolean met een if te bekijken om dan te breaken?
Laten we het geval van een Abort/Retry/Ignore dialogbox bekijken:
Hier is het ook duidelijk wat de goto doet. Ik kan me voorstellen als je over grote afstanden springt het lelijk en ongestructureerd is, maar als er zeer dichtbij gesprongen wordt, is het ook dan ranzig, als het een aantal if's en booleans scheelt?
Neem de volgend stukje uit mijn code:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| TreeNode selectedTreeNode = null; for (int i = 0; i < treeTableGepland.TreeModel.GetChildCount(null); i++) { TreeNode node = (TreeNode)treeTableGepland.TreeModel.GetChild(null, i); foreach (TreeNode node2 in node.Nodes) { if (node2.Tag as CustomActivity == activity) { selectedTreeNode = node2; goto NodeFound; // Impopulaire goto } } } NodeFound: if (selectedTreeNode != null) { treeTableGepland.ExpandRow(selectedTreeNode.Parent); // etc. |
Is het werkelijk zo ranzig uit de foreach te jumpen, terwijl het duidelijk is waar hij heenspringt? Of is het netter een boolean te zetten, en in de parent loop deze boolean met een if te bekijken om dan te breaken?
Laten we het geval van een Abort/Retry/Ignore dialogbox bekijken:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| private void btnSave_Click(object sender, EventArgs e) { Try: try { if (!u.Text.Equals(String.Empty)) { int partijNr = Convert.ToInt32(u.Text); int ID = GetIDFromName(u.Name); // ... try to save } } catch (Exception ex) { DialogResult result = MessageBox.Show("Fout bij bewaren van partij " + u.Text + "\n\n " + ex, "Foutmelding", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Error); if (result == DialogResult.Retry) goto Try; // Ranzige goto else if (result == DialogResult.Abort) ExitDialog(); } // more code.. } |
Hier is het ook duidelijk wat de goto doet. Ik kan me voorstellen als je over grote afstanden springt het lelijk en ongestructureerd is, maar als er zeer dichtbij gesprongen wordt, is het ook dan ranzig, als het een aantal if's en booleans scheelt?