Ich dachte, dass ich nicht explizit darauf hinweisen muss, dass das abgeaenderte Dictionary lediglich eine Moeglichkeit von vielen ist, bevor man in Richtung ICommand geht und ohne, dass der eigentliche Use Case geschildert wurde.
@FZelle: Warum Du einen Knopf an der Backe moechtest oder hast, entzieht sich meinem Verstaednis, da das schon ziemlich doof aussieht. Aber das muss letztendlich jeder fuer sich entscheiden, welchem Schoenheitsideal man folgt.
Beste Gruesse
Moin, moin,
naja...man kann ICommand nehmen oder koennte das Dictionary auch auf Dictionary<string, Delegate> umschreiben (siehe Hinweis von Th69).
Gruss,
Moe
Moin,
Dein erstes Beispiel erzeugt erst einmal eine Instanz der SerialPort Klasse, wie Du bereits gesagt hast. Auf diese Art und Weise kannst Du bspw. eine lokale Variable in einer Methode erzeugen.
Die zweite Variante definiert zum einen die Sichtbarkeit "private" der Variable serialPort, und ist nur innerhalb einer Klasse sichtbar. Static bedeutet wiederum, dass jede neue Instanzen der umschliessenden Klasse Zugriff auf dieselbe Kopie der SerialPort Instanz hat. Die Variable serialPort ist Instanz uebergreifend gueltig/verfuegbar.
Gruss,
Moe
Moin,
letztendlich ist es ein Baum, der hier aufgebaut werden muss und man sucht nach dem kuerzesten Weg. Dazu faellt mir der A* (A-Stern) Algorithmus ein:
Vielleicht hilft Dir das weiter.
Gruss,
DaMoe
Hallo hasan,
ich wuerde zu LaTinos Punkten gerne den Punkt 0 hinzufuegen und Dir raten sich Gedanken ueber ein Domaenenmodell zu machen, d.h. brauchst Du eventuell eine Produkt-Klasse (mit Name und Preis; spaeter erhaelt es weitere Eigentschaften). Dann wirst Du sicherlich eine Warenkorb-Klasse benoetigen, die Produkte und deren Anzahl aufnehmen kann. Des weiteren wird sie dir dann die Summe bspw. ausgeben koennen usw.
Im Prinzip ist das Domaenenmodell die Grundlage fuer die technischen Punkte 1 und 2, die LaTino erwaehnt.
Gruss,
DaMoe
Huhu Angel123,
schau doch einfach mal hier. Vielleicht hilft Dir das weiter Testing if a device is in range
Gruss,
DaMoe
Hi Maliko,
das Szenario, welches Du beschreibst hoert sich nach Master-Detail DataGrid an. Schau mal hier, ob das was fuer Dich ist: Master-Detail-Wpf
Gruss,
DaMoe
@FZelle: Mit Auditing meinte ich lediglich Aktionen, die der User in einer Applikation durchfuehrt, d.h. Dinge selektiert, Aktionen ausfuehrt, Buttons klickt etc., sodass man einen groben Pfad durch die Applikation erhaelt. Das entscheidende an dieser Stellt soll aber nicht der Begriff sein. Ich meinte also das, was Du umschrieben hast mit:
Das ViewModel in MVVM ist die Businesslogik des View.
Wenn hier etwas zu loggen ist, was nichts in der darunterliegenden Schicht zu suchen hat, dann ist es natürlich die richtige Stelle.
Gruss,
DaMoe
Hallo zusammen,
mich interessiert eure Ansicht bzgl. Logging/Auditing in ViewModels. Wir haben eine Diskussion bei uns darueber, ob nun Logging Funktionalitaet in einem ViewModel verwendet werden darf oder nicht.
Eine Meinung dazu ist, da das ViewModel "zur UI gehoert", dass dort Logging nicht zu suchen hat. Ich sehe das etwas anders. Meiner Ansicht nach bildet das ViewModel u.A. Use-Cases ab, die man auf einer grob granularen Ebene "mitloggen"(Auditing) kann.
Wie seht Ihr das? Habt Ihr irgendwelche Literatur/Links zu Pro und Contra?
Selber habe ich mal u.A. bei Prism geschaut, wie die das machen.
Gruesse,
DaMoe
Hallo,
was bekommst Du ueberhaupt fuer eine Fehlermeldung?
Was ist den "tempRow" fuer eine Variable?
Gruss,
DaMoe
Hallo,
was meinst Du mit "das zweite Programm"? Meinst Du damit, dass auch ein anderer, sprich zweiter Prozess auch "gesperrt" wird?
Gruss,
DaMoe
Tach auch,
das Codebeispiel, welches Du aufgefuehrt hast, macht so nicht viel Sinn, sprich strUntersuchen.AsEnumerable(), da du da ueber die chars iterierst. Der pragmatischte Ansatz waere in etwa der Folgende, ohne genau zu wissen, was Du genaus wissen willst, d.h. die enthaltenen Ausdruecke oder, ob nur einer der vordefinierten Ausdruecke enthalten ist.
var enthalteneAusdruecke = LAusdrücke.Where(strUntersuchen.Contains);
Gruss,
DaMoe
Hi,
richtig, Du warst nicht gmeint hypersurf, sondern JMano.
Was meinst Du damit? Wenn ich Elemente im DoWork verändere, dann übernimmt der BG keinen Kontext Switch für mich.
Du hast natuerlich Recht, ich war zu ungenau in meiner Aussage. Ich meinte lediglich RunWorkerCompleted und ProgressChanged. Ich hatte vergessen, dass DoWork natuerlich auch ein Event ist und da muss man sich um den Kontextwechsel selber kuemmern, wenn man direkt auf UI Elemente zugreift.
Ich habe es immer so gehalten, dass ich aus dem DoWork selber keine UI-Manipulationen vorgenommen habe. In dem asynchron verarbeitenden BG-Worker habe ich lediglich die reine UI-unabhaengige Algorithmen ausgefuehrt. Ueber die ReportProgress-Methode dann Informationen weitergegeben. Ein iteressierter Abonnent hat sich auf dem ProgressChanged registriert, und dann entsprechend z.B. die UI aktualisiert.
So habe ich die Algorithmik frei von UI-Aktualisierung und vor allem dem Kontextwechsel. Das uebernimmt dann der BG fuer mich, wenn ich mit ProgressChanged-Event arbeite.
Der Abonnent, hier die UI, weiss am besten, was zu aktualisieren ist. So hat man beides schoen getrennt.
Natuerlich muss man sich noch etwas ueberlegen, wenn man mit ReportProgress arbeitet und dir der reine Zustand in Prozent nicht genuegt. Dafuer gibt es eine Ueberladung von ReportProgress, die noch einen UserState weitergibt. Dafuer verwendet man dann einen Progress Datencontainer (ist frei nach eigenen Anforderungen zu waehlen), der irgendwelche Nachrichten oder was auch immer enthaelt. Die UI-Seite entnimmt dann wieder diese Informationen und setzt den Progress, schreibt einen Zustand, etc.
Gruss,
DaMoe
Hallo zusammen,
ja, man kann es ueber BackgroundWorker implementieren, wuerde ich aber nicht mehr verwenden. Es ist empfehlenswert die TPL bzw. die Task Klasse dafuer zu benutzen. Dazu nimmst Du noch die Progress<T> Klasse, die den Kontext Switch fuer Dich uebernimmt und einen Zustandsfortschritt reportiert.
@Hypersurf: Such einfach einfach mal nach TPL, Task<T>, Parallel.Foreach und Listen. Da wirst Du sicherlich etwas finden und daraus, dann ableiten koennen, wie du asynchrony und dann noch parallel Deine Liste verarbeitest
z.B. Parallel.Foreach
@hypersurf: Wenn man die UI-Elemente direkt aus dem BackgroundWorker veraendert, dann hast Du Recht. Man muss sich um den Kontext Switch kuemmern. Wenn man allerdings "nur" die Events aus dem BackgroundWorker verwendet, dann uebernimmt der BG den Kontext Switch fuer Dich.
Gruesse,
Moe
Moin,
ich wuerde Dir empfehlen, falls Du bzgl. des DataBinding etwas ueber den Designer eingestellt hast, das rueckgaengig zu machen und einmal die Datenquelle, wie Du bereits selber versucht hast, aus dem Code zu setzen. Meine Erfahrung mit dem Databinding und dem DevXpress Grid ist, dass wenn Du den Designer verwendest, du beim "expliziten" Binding pro Column Einstellungen taetigen musst, d.h. wie Du bindest bzw. welcher Datentyp darunterliegt. Das kann manchmal zu dem Problem fuehren, dass keine Daten angezeigt werden.
Gruss,
DaMoe
Moin!
ich habe gesehen, dass Du die Instanz von Form_C3 (wird in "Menue" erzeugt) beim Klick auf OK in derselbigen form "versteckst" (Hide aufrufst). Wird denn bei Hide() ueberhaupt das Event FormClosing ausgeloest?
Gruss,
DaMoe
Hallo,
Th69 hat Recht. Man kann sich das gut im .Net Code abgucken. Bei Reflection auf private Konstrukte wie z.B. hier den Konstruktor, egal ob von MS oder eigenem Code, waere ich immer sehr vorsichtig.
Nur am Rande: Man kann sich den Code sehr schnell und auch schick mittels der Microsoft Reference Source .Net 4.5.1 anschauen.
Gruss,
DaMoe
Moin,
sag mal, hast Du schon mal hier geschaut Time_Zone_Information @ PInvoke
Nachtrag: Sorry, der Link wird Dir wahrscheinlich bei Deiner Frage zur "Konvertierung" nicht weiterhelfen.
Gruss,
DaMoe
Hi darktower,
zu 2:
Schaut Dir mal an, was Ms dazu sagt.
Zu Deiner abschliessenden Frage, wie so ein Mapping aussehen wuerde:
bzw. gibt es sogar eine VS Extension
Gruss,
DaMoe
Hi Samy,
hilft Dir das weiter:
Edit: Sorry, hatte ueberlesen, dass Du den PrimaryScreen veraendern moechtest. Dann wir Dir diese URL nicht weiterhelfen.
Gruss,
DaMoe
Wenns wirklich so "einfach" sein soll wie gezeigt, würd ich das selber zeichnen.
Davon wuerde ich erst einmal die Finger lassen. Man muss nicht immer das Rad von neuem erfinden. Soweit meine Meinung. Es mag immer "einfacher" anmuten, allerdings steckt der Teufel/Schwierigkeit im Detail
Wenn ich nun meine Charts jede 500 Millisekunden aktualisieren will, ist das etwas Problematisch. Oder?
Ist es denn nun Fakt, dass das WPF Chart Dir Probleme bei der Aktualisierung Probleme bereitet? Hast Du es bereits getestet?
Bevor Du nun ZedGraph, Oxyplot oder gar eine eigene Implementierung anstrebst, wuerde ich Christoph1972's Vorschlag und Deine anfaengliche Idee aufgreifen:
Verwende WindowsFormsHost zusammen mit den Microsoft Charts. Ein Versuch ist es wert.
Gruss,
DaMoe
Moin zusammen,
@ Abt:
Funktioniert ähnlich wie Dein aktuelles Vorhaben; aber halt über COM.
Worauf beziehst Du diese Aussage?
@emtcho:
Von dem Code her, welchen Du gepostet hast, mutet es ein wenig merkwuerdig an, dass das PPT Window gesucht, gelockt und dann "irgendwie" aktualisiert wird. Natuerlich kenne ich Deine Anforderung im Detail nicht.
Muss denn ubedingt das PPT Fenster geoffnet sein, damit Daten dann generiert werden, oder ist es nicht besser, nachdem Du die Daten generiert hast, daraus eine PPT Praesentation zu erstellen?
NetOffice ist nicht OpenXML, das stimmt. OpenXML ist ein Standard, welcher von "aktuelleren" Office Applikationen umgesetzt wurde. Mit dem Open XML SDK for Office von Microsoft, kann man man ohne ein installiertes Office, alle auf dem OpenXML Standard basierten Office Dateien (docx, pptx, xlsx, etc.) zugreifen und bearbeiten.
Natuerlich kann man auch auf dem "guten, alten" Interop arbeiten, welches wiederum ein installiertes Office Produkt voraussetzt:
Bzgl. der Performance, kommt es natuerlich darauf an, wie Du die Daten generierst und dann auch in die Praesentation schreibst. Ich sehe nicht, wie Deine Daten generierst und in die Slides der PPT Praesentation schreibst.
Es kann natuerlich sein, dass Du mit dem OpenXML SDK nicht schneller bist.
Wie gross werden denn Deine PPT Praesentationen ungefaehr?
Gruss,
DaMoe
Moin emtcho,
sag mal, ist es nicht irgendwie umstaendlich, so wie Du momentan eine PowerPoint Praesentation erstellst?
In wieweit waere bspw. das OpenXML SDK von Microsoft fuer Dich, um direkt ueber Code deine PPTX zu erstellen? Man muss dazu sagen, dass nur das "neuere" pptx Format unterstuezt wird.
Hat zwar nichts mit Charts zu tun, zeigt aber auf, wie man programmatisch auf PowerPoint zugreifen kann:
PowerPoint OpenXML
Gruss,
DaMoe
Hi!
Das funktioniert soweit auch ganz gut nur das die Progressbar sich nicht aktualisiert (Die Progressbar wurde Invoked).
Siehe hier:
Backgroundworker
Hast du bspw. das Property WorkerSupportsCancellation auf true gesetzt?
Gruss,
DaMoe
Edit: Ich meinte natuerlich WorkerReportsProgress und nicht WorkerSupportsCancellation.
Moin zusammen,
ich frage mich, warum die ObservableCollection<T> anstatt der BindingList<T> verwendet wird im Hinblick auf das urspruenglich beschriebene Einsatzszenario?
Wenn der Elementtyp von sich aus INotifyPropertyChanged implementiert, löst die originale ObservableCollection bei Änderungen an "ihren" Elementen von alleine die nötigen Events aus.
@herbivore: Entweder ich habe Dich falsch verstanden, allerdings loest die ObservableCollection<T> selbst meines Wissens nach keine Notifikation aus, wenn eins der enthaltenden Elemente, auch wenn es INotifyPropertyChanged impementiert, sich aendert (so auch die MSDN). Es werden lediglich Aenderungen an der Liste selbst entsprechend propagiert.
Represents a dynamic data collection that provides notifications when items get added, removed, or when the whole list is refreshed.
MFG,
DaMoe
Hallo,
zerteile Deine Problemstellung in einzelne Fragestellungen:
Textdatei einlesen und abspeichern solltest Du hier im Forum oder auch per Google relativ einfach finden. String Suchmethoden findest Du in der MSDN.
Gruss,
DaMoe
Hallo!
Ich wuerde jetzt erst einmal fragen, was sind das Events und warum kommen diese so haeufig? Ist es wirklich notwendig, dass diese so haeufig hochkommen?
Dann faellt mir natuerlich noch das Stichwort DoubleBuffering ein:
DoubleBuffering
Gruss,
Moe
Hi!
Nur noch als kleiner Zusatz zu den existierenden Vorschlaegen: Mittels XDocument laesst sich die Aufgabe auch sehr schoen im Zusammenhang mit Linq loesen:
Gruss,
DaMoe
Moin zusammen,
ich habe vor einiger Zeit den Vergleich fuer einen Test folgenderweise umgesetzt:
public static bool IsImageContentEqual(Image a, ImageFormat formatA, Image b, ImageFormat formatB)
{
using (var imgStreamA= new MemoryStream())
{
using (var imgStreamB = new MemoryStream())
{
a.Save(imgStreamA, formatA);
b.Save(imgStreamB, formatB);
var bytesA = imgStreamA.ToArray();
var bytesB = imgStreamB.ToArray();
if (bytesA.Length != bytesB.Length)
{
return false;
}
for (int i = 0; i < bytesA.Length; i++)
{
if (bytesA[i] != bytesB[i])
{
return false;
}
}
}
}
return true;
}
Gruss,
DaMoe
Hi!
Warum bzgl. der Charts in die Ferne schweifen, wenn es doch so nahe liegt:
System.Windows.Forms.DataVisualization.Charting Namespace ()
Das Charting ist sehr gut, kommt urspruenglich auch von einer Firma, die sich auf Charts spezialisiert hat. ZedGraph ist nicht schlecht, passt sich aber optisch (meines Erachtens) nicht so gut in die WinForms ein und die API, welche man auch gut verwenden kann, merkt man an, dass diese einen Hauch von C++ hat.
Gruss,
DaMoe
Hi Taladan!
Ich wuerde vermuten, dass bei Dir trotzdem der UI Thread nicht wirklich getrennt ist von dem Thread, den du gerade beschrieben hast. Du muessten schon einen kleinen Ausschnitt hier posten, von dem Du vermutest, dass es an entsprechender Stelle Probleme gibt.
Gruss,
DaMoe
Hi,
das Stichwort ist hier CodeDom und ist eigentlich gar nicht so schwer. Aus eigener Erfahrung wuerde ich von so einem Vorhaben, wenn moeglich, absehen, weil es einige Probleme nach sich zieht. Wir hatten so eine Skriptingfunktion implementiert und diese Funktion wurde von Benutzern der Software bald zu ausgiebig benutzt. Es wurde nicht kompilierfaehiger Code gespeichert und versucht durch die Applikation einzulesen. Das folgende Fehlverhalten wurde dann auf die Software, nicht aber auf den "geskripteten" Code durch den User zurueckgefuehrt, was aber ein falscher Rueckschluss war. Sei einfach vorsichtig mit so einer Funktion.
Gruss,
DaMoe
Hi!
Dir fehlt im zweiten Konstrukt das kleine, aber wichtige Schluesselwort "into". Das "into" macht bei Linq einen Outer Join aus. Laesst du das "into" weg, ist es ein Inner Join.
Gruss,
DaMoe
Hi Kingkook!
Es sollte automatisch funtionieren, wenn Du den BackgroudWorker im UI Thread erstellst. Das ist wichtig, dam der BGW bzw. der SynchronizationContext im BGW erkennt, ob zwischen den Threads "geswitcht" werden muss.
Jetzt wartet die GUI darauf, von einer anderen Klasse ein Event zu erhalten.Wenn dieses Event gefeuert wird, wird der Worker gestartet.
In welchem Thread wird der BGW initialisiert?
By the way: Du brauchst in der Methode TaskDoWork nicht immer das Property WorkerReportsProgress auf true setzen. Das genuegt initial einmal bei Erstellung des BGW.
Gruss,
DaMoe
Moin!
Schau mal hier in der Doku nach, da findest Du sicherlich etwas zum Sorting:
http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.aspx
Gruss,
DaMoe
Moin!
Schau mal hier:
[FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke)
Gruss,
DaMoe
Hallo Simon19,
ich wuesste nicht, dass es eine explizite Dokumentation ueber den Geschwindigkeitsvergleich von bspw. switch zu if-else Anweisungen gibt, da es meines Erachtens nach wenig Sinn macht diesen Vergleich anzustellen. Helfen koennen Dir ganz gut Profiler helfen(such mal hier im Forum). Ich kann mir eher Vorstellen, dass Deine Implementierung an der ein oder anderen Stelle nicht optimal ausprogrammiert ist.
Weitere Einschaetzungen sind hier jetzt schwierig anzustellen.
Gruss,
Damoe
Moin!
Bitte um Unterstützung
Was ist denn genau Dein Problem? Wo gibt es Verstaendnisprobleme?
Gruss,
DaMoe
Windows (Win 7 auf jeden Fall) besitzt bereits ein kleines Tool, das sich im Englischen "Snipping Tool" nennt.
Gruss,
DaMoe
Moin!
Wenn ich Dich richtig verstanden habe, dann wirft GetTypes() die Exception. Das mach auch Sinn, wenn in Deiner Assembly eine Klasse existiert, die in irgendeiner Weise Teile Deines Crystal-MergeModuls verwendet. Wenn nun die Typinformationen abgefragt werden, wird unter umstaenden das Crystal-MergeModul benoetigt. Da diese Assembly nicht existiert, wird entsprechend die Exception geworfen.
Schau mal hier, um Deine Applikation Plugin faehig zu machen.
[FAQ] Eigene Anwendung pluginfähig machen
EDIT: In C# ist es moeglich, dass Applikationen so lange einwandfrei funktionieren, bis diese an eine Stelle gelangen, an der bspw. eine Klasseninstanz erzeugt werden soll, deren Informationen aus einer anderen Assembly kommen, die nicht vorhanden ist. Vermute, dass das am Jitting liegt.
Gruss,
DaMoe
Hallo Carrymann!
Es kommt bei der Kommunikation zwischen den AppDomains auch stark darauf an, welche Informationen Du zwischen den AppDomains (Haupt AppDomain und die temporaere AppDomain) austauscht bzw. was Dir die aufgerufene Methode an Rueckgabewerten zurueckliefert. Handelt es sich um einen Typen, der aus der nachgeladenen Assembly stammt, und wird dieser aus der temporaeren Domain in die Hauptdomain uebermittelt, dann wird die Assembly auch in die Hauptdomain geladen. Das Verhalten kannst Du wunderbar ueberpruefen, indem Du auf der entsprechenden AppDomain dir mittels der Methode GetAssemblies() die momentan geladenen Assemblies anschaust. So ein impliziter Typenaustausch zwischen den AppDomains kann eventuell fuer Probleme sorgen.
Ist vielleicht noch ShadowCopying ein Stichwort?
@Spook: Auch die von Dir beschriebene Loesung, kann zu dem von mir beschriebenen Problem fuehren, dass eine Assembly implizit in die Hauptdomain geladen wird und somit der Zugriff auf die eigentliche Datei (dll) verweigert wird.
Gruss,
DaMoe
Hallo KPhoenix,
die Angabe eines Generics T kann nicht fehlen, da wuerde der Compiler bereits meckern.
testObject ist sicherlich nicht null bei dir, allerdings der Cast mittels des Operators "as" liefert dir null zurueck. Das ist genau dann der Fall, wenn das zu castende Objekt, hier testObject, nicht in den Zieltypen konvertiert werden kann.
var test = testObject as IOSDataGrid<IUIDataObject>;
testDataObject ist einfach nicht in den Zieltypen castbar, weil testObject das Interface nicht implementiert oder es an der Ko/Kontravarianz des Generics liegt.
Gruss,
DaMoe
Hi jojo123,
das was Du beschreibst, wuerde das Liskovschen Substitutionsprinzip verletzen (Liskovsches Substitutionsprinzip). Du wuerdest das Verhalten der Basisklasse veraendern und nicht erweitern (siehe auch Open-Closed-Principle). Ich ueberlege gerade, ob es nicht Sinn macht und somit die vorher geannten Prinzipien nicht verletzt, indem Du eine Basis-Klasse X einfuehrst und jeweils A und B von X ableitest und dort dann die Veraenderung durchfuehrst.
Gruss,
DaMoe
Moin Lukerer!
Jetzt habe ich noch einmal einen Blick auf Deinen Code geworfen. Ich glaube, dass Dein Problem von dem Arg.Matches Aufruf ruehrt. Du erwartest, dass x gleich sendBytes ist, allerdings pruefst Du auf Refernzgleichheit und nicht auf Inhalt und Laenge. Ich glaube nicht, dass in Deinem Beispiel sendBytes (im Test) und _sendBytes (in der implementierenden Klasse) die selben Arrays sind. Und deshalb schlaegt Dein Test fehlt.
Wahrscheinlich bietet zudem JustMock bereits Constraints an, die fuer Dich den Inhaltsvergleich von Arrays, Listen, Collections, etc. bewaeltigen.
Gruss,
DaMoe
Hi!
Ich muss Dir sicherlich nicht sagen, dass Deine beschriebene "Loesung" ein richtiger Hack ist und saemtlichen gaengigen und guten Softwareprinzipien widerspricht. Ich kann Dir nur davon abraten, so wie Du es jetzt implementierst. Du solltest versuchen, Teile der Applikation zu verbessern und langwierige Arbeitsschritte in den Hintergrund zu legen und nicht irgendwelche UIs (beachte Pfadfinderregel).
Du wirst eventuell mit folgendem Artikel weiterkommen, wenn auch nur unter vehementen Veto meinerseits:
Thread.SetApartmentState Method
Gruss,
DaMoe
Was mir gerade noch auffaellen ist: Lass den Try-catch Block weg. Du fuegst der von Dir geworfenen Exception keine weiteren Informationen hinzu, wirfst nur eine allgemeine Exception und verschluckst noch den Callstack. Die Exceptin wird so oder so hochpropagiert.
Gruss,
DaMoe
Hi!
Ohne, das Mocking Framework, was Du verwendest zu kennen, gehe ich davon aus, dass der Aufruf Send(...) nicht mit den von Dir in dem Test erwarteten Paramtern aufgerufen wird. Somit erhaelst Du die von Dir beobachtete Fehlermeldung. Kurz gesagt, wenn Du erwartest, dass Send mit dem Parameter 6 aufgerufen wird und es mit 2 aufgerufen wird, dann ist Deine Annahme fehlgeschlagen. Sollten Dir die Parameter egal sein, dann muss Du das Deinem Mocking Framework auch mitteilen und dich lediglich damit begnuegen, dass die Send Methode aufgerufen wird.
By the way: Dein Test sieht mir mehr nach einem Unit-Test, also Einheiten-Test, aus als einen Komponententest.
Das ist eine Einstellung bei Dir im VS. Das kannst Du in der Ansicht direkt umstellen (rechtsklick auf den Wert und "Hexadecimal Display" ausschalten). Die Anzeige hat keine Auswirkung auf Deine if-Bedingung.
Gruss,
DaMoe
Man muss sicherlich zwischen Code Dokumentation und API Dokumentation unterscheiden. Eine API Dokumentation kann gar nicht aussagekraeftig und ausfuehrlich genug sein.
Fuer Kommentare im Code halte ich es aehnlich wie Abt:
Wenn es um inhaltliche Methoden-Kommentare geht, dann dokumentiert man nur dort, wo man zB bestimmte Vorgänge erklären will; aber sicherlich nicht jede Ausführung oder Deklaration. Hier ist weniger mehr.
Um es noch verkuerzter zu schreiben: Dokumentiere warum Du etwas an einer Stelle machst und nicht was, denn das steht bereits als Code da.
Gruss,
DaMoe