Hallo!
Mein Titel dieses Beitrags mag etwas sperrig klingen, da ich nicht wusste, wie man es besser ausdrücken kann, aber ich komme gleich zur Sache.
Folgende Methode SetStatusbar_Enter(object sender, EventArgs e)
wird aufgerufen, wenn bestimmte GUI-Elemente wie Label, Textbox, Picturebox, ... den Fokus durch einen Cursor (z. B. Mauscursor) erhalten. Diese Methode bewirkt, dass ein kleiner Informations- bzw. Hilfstext in einer Statusbar angezeigt wird. Sobald das jewelige GUI-Elemente keinen Fokus mehr hat, wird der Informationstext wieder gelöscht. Der Informationtext selbst in der AccessibleDescription
des jeweiligen GUI-Elemente gespeichert. Die Methode SetStatusbar_Enter(object sender, EventArgs e)
sieht wie folgt aus:
private void SetStatusbar_Enter(object sender, EventArgs e)
{
if (sender is TextBox)
{
SetStatusbarText(text: ((TextBox)sender).AccessibleDescription);
}
else if (sender is Button)
{
SetStatusbarText(text: ((Button)sender).AccessibleDescription);
}
else if (sender is RadioButton)
{
SetStatusbarText(text: ((RadioButton)sender).AccessibleDescription);
}
else if (sender is CheckBox)
{
SetStatusbarText(text: ((CheckBox)sender).AccessibleDescription);
}
else if (sender is DateTimePicker)
{
SetStatusbarText(text: ((DateTimePicker)sender).AccessibleDescription);
}
else if (sender is Label)
{
SetStatusbarText(text: ((Label)sender).AccessibleDescription);
}
/** gekürzt **/
}
Bei der Quellcodeanalyse (in Visual Studio 2019) wird mir nun folgender Hinweistext angezeigt:
Fehlermeldung:
CA1800: Der 'sender'-Parameter wird in der 'MainWindow.SetStatusbar_Enter(object, EventArgs)'-Methode mehrmals in den Typ 'TextBox' umgewandelt. Führen Sie eine Zwischenspeicherung des Ergebnisses des as-Operators oder eine direkte Umwandlung durch, um die überflüssige castclass-Anweisung zu entfernen.
Gleicher Hinweismeldung tritt mehrmalig statt für eine Textbox auf einen Button, einen Label... auf.
Nun stehe ich etwas auf dem Schlauch. Wie kann die obere SetStatusbar_Enter(object sender, EventArgs e)
unter Anwendung der Hinweismeldungen noch weiter optimiert werden? Habt ihr ein kleinen Codeschnipsel als Beispiel parat?
Type testing with pattern matching
object a = 1;
if (a is int b)
{
Console.Write("Int: " +b);
}
AccessibleDescription
kommt von Control.
Wieso verwendest Du also nicht die Basisklasse?
Würde hier viel redundanten Code sparen.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Den as
-Operator kannst du so verwenden:
var textbox = sender as TextBox;
if (textbox != null)
{
SetStatusbarText(text: textbox.AccessibleDescription);
}
Du kannst dir aber diese ganzen Konvertierungen und Abfragen sparen, da die AccessibleDescription-Eigenschaft zur Klasse Control gehört, und alle Steuerelemente davon erben. Daher brauchst du nur einmal zu casten:
SetStatusbarText(text: ((Control)sender).AccessibleDescription);
Weeks of programming can save you hours of planning
Danke für eure Hinweise! Sie haben mir geholfen, dass Problem auf einfache Weise zu lösen.