code it

Martins Tech Blog

Du bekommst mich nicht!

Ich finde ja die Methode Contains auf generischen Listen sehr praktisch. Um so überraschter war ich nun heute, als ich wie selbstverständlich auf eine PointCollection ein Contains aufrufen wollte und mit einer für mich sehr unerwarteten ArgumentException belohnt wurde.

Mein Code ist ganz einfach nachgestellt: Eine PointCollection wird mit 3 Punkten initialisiert, ich hole mir eine Referenz auf den ersten Punkt und verwende dann die Methode Contains, um zu prüfen, ob dieser Punkt in der Liste enthalten ist.

var points = new PointCollection {
   new Point(50, 50),
   new Point(100, 100),
   new Point(150, 150)
};

var point = points[0];

var isInList = points.Contains(point);

Sieht gar nicht so kompliziert aus und sollte eigentlich funktionieren. Aber: PointCollection ist natürlich keine List<Point>, sondern eine PresentationFrameworkCollection<Point>. Trotzdem hätte ich erwartet, dass dieser Typ in der Lage ist, ein enthaltenes Member zu finden.

Abhilfe schafft hier die ExtensionMethod auf IEnumerable mit dem gleichen Namen. Dieser kann als zweiter Parameter ein Comparer übergeben werden. Das bedeutet natürlich zusätzlichen Aufwand - auch wenn dieser hier sehr marginal ist. Aber warum das Rad neu erfinden. Es gibt ja bereits einen Default-Comparer der genau diese Arbeit übernehmen kann. Dazu übergibt man der ExtensionMethod einfach im zweiten Parameter den Wert null.

var points = new PointCollection {
   new Point(50, 50),
   new Point(100, 100),
   new Point(150, 150)
};

var point = new Point(50, 50);

var isInList = points.Contains(point, null);

Keine Fehlermeldung mehr und das Ergebnis stimmt auch.

Silverlight im Firefox debuggen

Ok, ich gebe es zu: Was meinen Browser angeht, verwende ich den Firefox als Standard-Browser und nicht den Internet-Explorer. Das funktioniert auch ganz gut. Problematisch wird es dann, wenn man mit Microsoft-Technologien entwickelt. Möchte man eine Silverlight-Anwendung debuggen, hält der Debugger bei Breakpoints nicht an - mit der bekannten Meldung "The breakpoint will not currently be hit. No symbols have been loaded for this document."

Funktioniert es, wenn der IE als Standard-Browser eingestellt ist, so liegt es eindeutig nicht an den Projekteinstellungen (denn auch hier gibt es Fallstricke), sondern am Browser. Dank der Tipps von Lars und Tim hab ich jetzt auch die Lösung und muss nicht mehr jedes Mal die Einstellung für den Standard-Browser ändern.

Der Tipp ist vielleicht nicht neu, aber weil ich mit Sicherheit beim nächsten Rechner wieder überlege, was man machen muss damit es geht, hier der Tipp als Gedankenstütze für mich und alle die das gleiche Problem haben.

Folgende Schritte führen zum Ziel:

  • in der Adressleiste about:config eingeben
  • die Warnung akzeptieren (sind wir nicht immer vorsichtig?)
  • den Eintrag dom.ipc.plugins.enabled.npctrl.dll suchen und doppelklicken, so dass der Wert von true auf false geändert wird
  • den Browser neu starten
Startet man nun den Debugger wieder, so hält dieser auch an den Breakpoints an.