Laden...

Forenbeiträge von 0815Coder Ingesamt 767 Beiträge

22.12.2007 - 00:04 Uhr

In c# sind die construktoren implizit statisch, und in statischen gibts kein this.

du könntest das aber durch

public Type t= typeof(Test1);

ersetzen.

21.12.2007 - 14:26 Uhr

für die richtung musst wohl einen kompass auf die maus kleben 🙂

21.12.2007 - 14:22 Uhr

pixelart forever!

21.12.2007 - 12:29 Uhr

Das beispiel Projekt mit dem ich mir die entsprechenden Werte für + operator, StringBuilder und string.Format gemessen hab kann ich hier posten (wenn ich heimkomme).

(ich glaub man muss es zwar ein paar mal ändern wenn man unterschiedliche string längen oder anzahl strings messen will. Grund dafür ist wieder dass ich das nicht über UI eingeben wollte, um Verfälschungen durch for schleifen zu vermeiden, bzw. kann man


string s = s1+s2+s3+s4;

eben nur zur laufzeit eine andere anzahl von strings geben.

Zu den ganzen Performancemessungen muss man auch dazu sagen, dass die Performance unter Mono oder mit anderem Compiler ganz anders sein kann.

TestProjekt kommt heute abend.

Für Diagramme brauch ich länger, vielleicht nach Weihnachten.

20.12.2007 - 21:10 Uhr

gerade wenn man konstante strings zusammenbaut also


string s = "abc"+"def"+"ghi";

braucht man sich keine gedanken um performance machen, da das der kompiler sowieso auf einen konstanten string optimiert, und zur laufzeit nichts mehr passiert.

auch sowas:


Person x = ... ;
string s = x.Vorname + " " + x.Nachname + " " + x.Strasse + " " + x.Plz + " " + x.Ort + " " + x.Land;

ist immer schneller als mit StringBuilder (auch mit 10000 Properties wär das schneller)
Grund:
Der Compiler verwandelt das in ein string.Concat(...)
Dort werden einmal die längen aller strings zusammengezählt, der Speicher einmal angelegt und dann die strings in den Speicher kopiert. Beim StringBuilder würde immer wieder neuer Speicher angelegt, wenn der StringBuilder wachsen muss, und dann würde alles umkopiert. Das kostet Performance. (Selbst wenn ich im voraus wüsste wie lang der String am Ende wird, würde ich in dem Fall die + Methode (string.Concat) vorziehen...

Der StringBuilder bringt aber was wenns um sowas geht:


StringBuilder vornamen = new StringBuilder();
List<Person> persons = ...;
foreach (Person p in persons)
{
  vornamen.Append(p.Vorname);
  vornamen.Append(", ");
}

Und das zahlt sich erst ab (Faustregel Daumen * Math.PI) etwa 20 Strings, die aneinander gehängt werden, sonst ist immer noch der + Operator schneller.

Die langsamste Methode ist logischerweise


string.Format("{0} {1} {2}", x.Vorname, x.Nachname,x.Strasse);

allerdings ist das auch die lesbarste, weshalb ich sie oft verwende, wenn die Performance des string.Format nicht mehr ins Gewicht fällt (zB weil man zusätzlich noch über Webservice kommuniziert, oder ein paar updates an die Datenbank schickt.)

19.12.2007 - 21:12 Uhr

einerseits:
GetPixel und SetPixel um Längen geschlagen. 800 mal schneller

andererseits ists auch nicht grad schnell, wenn die pixelwerte einzeln per wlan ankommen.

vorschlag:
miss mal beides getrennt voneinander, und schau wo die zeit wirklich verloren geht
-> Stichwort: Stopwatch

17.12.2007 - 16:46 Uhr

Hui, wenn Taschenrechner auf einmal auch gültig sind:

Texas Instruments 57-II

Bei dem konnte man konfigurieren ob er 7 Speicherregister haben sollte und 0 Byte Programmspeicher oder - in 7er Schritten - bis zu 49 Programmschritte, aber immer weniger Speicherregister. Dafür hat er sich aber die Programme auch beim Ausschalten noch gemerkt.

Danach wars dann ein Amiga 500 (der steht immer noch irgendwo bei mir rum, muss mal probieren ob der noch geht). Auf dem hab ich mit Basic angefangen, bin dann über Assembler zu AmigaE gekommen und schließlich bei C++ hängen geblieben (das war dann aber ein A4000, den ich bis 1998 in Betrieb hatte - und der im Gegensatz zum 500er verschrottet wurde.)

13.12.2007 - 12:57 Uhr

Original von herbivore
Ein Ähnlichkeitsvergleich in der Qualität, wie Menschen ihn in der Lage sind zu leisten, gibt es noch nicht annähernd.

Was schon daran liegt, dass "Ähnlichkeit" auch für jeden Menschen etwas anderes bedeutet, also sehr subjektiv ist.

Ähnlichkeit müsste also erstmal eindeutig definiert werden...

12.12.2007 - 19:01 Uhr

gegenfrage:
warum änderst du die anderen objekte wenn du sie nicht ändern willst?

12.12.2007 - 12:09 Uhr

Original von megachucky
Das Kürzel F6 für Build erstellen gibt es bei mir nicht ?!?

Das ist ja genau das, was ich suche 😦

Das kann je nach Standardeinstellung auch Shift-Strg-B sein (läßt sich in den Optionen aber umstellen.

12.12.2007 - 12:08 Uhr

Das Addon "Resharper" analysiert den Quellcode schon beim schreiben, da siehst du die Compilerfehler (und auch mögliche logische) sogar schon vor dem speichern. Ist aber nicht billig.

11.12.2007 - 18:53 Uhr

Möglicherweise gibts ab .NET 3.0 eine einfachere Möglichkeit.

Referenz auf WindowsBase.dll hinzufügen, und den namespace System.IO.Packaging einbinden. Dort gibts die Klassen Package und ZipPackage - und wenn ichs nicht ganz missverstanden hab kann man damit auch Zip Dateien manipulieren.

Ich habs nur überflogen aber vielleicht könnt ihr damit was anfangen (und .NET 3.0 steht ja auch für Studio 2005 zur Verfügung).

11.12.2007 - 11:03 Uhr

Wenn du einen Status hältst, verletzt du

der unabhängige Charakter von SOA

somit wäre die best practise: "keinen status halten."
wenn mans dennoch tun muss sind aber sessions sicher die beste und einfachste lösung. alles andere läuft nur auf selbstprogrammierte sessions raus, also kann man gleich die von asp verwenden.

11.12.2007 - 00:28 Uhr

Was wahrscheinlich (ungetested) geht:

Die Webservice methode


public IEnumerable<string> MyEnumeration()
{
    //...
}

schreiben und das ganze kompilieren.

Was aber nicht gehen wird, ist diesen Webservice dann referenzieren (bzw. die Webreferenz updaten), ich würde erwarten, dass VS die Referenz.cs nicht erstellen kann.

05.12.2007 - 19:09 Uhr

Folgendes überschreiben:


protected override bool IsInputKey(Keys keyData)

und für die Pfeiltasten true liefern, für alle anderen base.IsInputKey() aufrufen.

dann bekommst du den key auch in KeyDown()

05.12.2007 - 19:06 Uhr

Damit das .xml file generiert wird, musst du im entsprechenden Projekt in den Buildoptions ganz unten "Xml documentation file" ankreuzen (Pfad kann leer bleiben), und nochmal kompilieren.

Die generierte xml datei liegt dann im /bin/ Ordner. Wenn jemand eine Referenz auf die .dll setzt, und die Xml Hilfe haben will, muss er die Xml Datei im gleichen Verzeichnis haben wie die .dll.

02.12.2007 - 11:52 Uhr

meine tastatur hat einen drehregler mit dem ich die lautstärke ändern kann. nachdem das ganze ohne tastatur treiber funktioniert, nehm ich an, dass das spezielle key commandos sind, die von windows unterstützt werden.

ich würd also annehmen, dass du das mit SenKeys hinbekommen könntest. und wenn du mir sagst, wie ich die keyscodes abfangen kann, kann ichs dir hier posten.

"ton aus" ist auch drauf, falls dich der interessiert.

01.12.2007 - 18:39 Uhr

das funktioniert leider nur bei überschreibbaren properties. leider gibts auch einige nicht virtuelle bei denen ich in meinen usercontrols oft gern properties verstecken würde.

26.11.2007 - 20:48 Uhr

vielleicht hast du deinen code fürs forum vereinfacht, was löblich ist, aber falls nicht, kannst du das auch einfacher implementieren:


internal class Spalten : IEnumerable<SpaltenInfo>
    {
        Dictionary<string, SpaltenInfo> m_spalten;
        ...
        public IEnumerator<SpaltenInfo> GetEnumerator()
        {
            return m_spalten.Values.GetEnumerator();
        }
...

25.11.2007 - 13:42 Uhr

Original von Golo
Was mich noch interessieren würde: Woher weißt Du, was im Hintergrund als SQL erzeugt wird? Wie kann man sich das anzeigen lassen?
Golo

implementier eine Klasse die von TextWriter erbt. Überschreibe WriteLine(...), lass das auf ein File oder in eine Textbox schreiben. häng deinen TextWriter an dataContext.Log.

dann schreibt er alles was an Sql generiert wird inklusive parametern in die Textbox (oder wohin du willst).

25.11.2007 - 13:35 Uhr

partielle methoden sind nicht dazu geeignet, interfaces zu definieren, die implementiert werden müssen wie es SaveData() sein sollte. dazu gibts je nach anwendung interfaces oder abstrakte klassen.

partielle methoden sind aber sinnvoll wenn es darum geht in generierten code files methoden aufzurufen, die der verwender erst selbst implementieren kann (aber nicht muss). die generierten dbml dateien von linq2sql sind ein gutes beispiel.

23.11.2007 - 23:48 Uhr

Sollte es sich nicht um Collections handeln, kann man dynamische queries auch mit dem ❔ operator bauen:


            string[] namen = new string[] { "Hans", "Franz", "Sissi" };

            bool queryLength = false;
            int length = 5;
            bool queryChar = true;
            string character = "H";

            var query = from name in namen
                        where (queryChar ? name.StartsWith(character) : true)
                        && (queryLength ? name.Length == length : true)
                        select name;

dadurch wird je nachdem welchen der beiden boolean man setzt, nur die entsprechende Expression beachtet. Unbedingt wichtig sind hier die Klammern, ohne wären die Prioritäten so verteilt:


[...]
                        where (queryChar ? name.StartsWith(character) : true && queryLength) 
                        ? name.Length == length : true
                        select name;

23.11.2007 - 11:41 Uhr

Original von Golo
So, die Lösung ist total trivial: Statt zu versuchen, in EINE Query eine variable Anzahl von Parametern reinzupacken, wird einfach zuerst eine Query abgesetzt, die alles holt, und dann jeder Parameter einzeln in einer Schleife mit where abgefragt.

Et voilà 🙂

Das Problem ist, dass du damit nur die Results bekommst, auf die alle Bedingungen zutreffen (also ob sie mit AND verknüpft wären). OR sind damit leider nicht möglich.

Speziell für LINQ to SQL gibts noch die möglichkeit, wie bisher einen ganz normalen SQL Query string zusammenzubauen, und

dataContext.ExecuteSql(string); // oder so ähnlich

aufrufen. Dann verliert man zwar für so komplexe queries die Typsicherheit und Intellisense aber zumindest das OR-Mapping bleibt.

Obs besser ist, die Expression Trees selber zusammenzustellen, wird jeder für sich entscheiden müssen. Für mich ists eine Herausforderung.

23.11.2007 - 10:55 Uhr

ich hab auch das aus 2005 verwendet, ich brauch die expliziten fields sehr oft, und wenn nicht, stören sie nicht.

21.11.2007 - 23:34 Uhr

hab was gefunden:

IsInputKey() überschreiben und dort für Left und Right true zurückgeben, sonst base.IsInputKey() aufrufen.

21.11.2007 - 22:10 Uhr

Hallo,

ich hab ein UserControl erstellt in dem ich OnPreviewKeyDown() überschrieben habe, und will da drinn auf die Cursortasten reagieren.

Dieses UserControl hab ich mehrmals in einem Panel verwendet. Mein Problem ist, dass nach dem PreviewKeyDown das Control den Focus verliert, wenn ich eine Cursortaste drücke, besser gesagt, der Focus wandert zum nächsten Control.

Auch wenn ich base.PreviewKeyDown nicht aufrufe, wird der Focus weitergegeben. Hat jemand einen Ahnung wie ich das verhindern kann?

18.11.2007 - 21:10 Uhr

du könntest es so umstellen:


try
{
    Template tpl = new Template(@"D:\vs8\tpltex\datei.xml");
    Console.WriteLine(tpl.methode());
}
catch (Exception e)
{
    Console.WriteLine(e);
}

dann riskierst du auch keine NullReference.

16.11.2007 - 23:18 Uhr

Process.Start("http://...");

16.11.2007 - 20:14 Uhr

Beschreibung:

Das Snippet zeigt, dass man IDisposable nicht nur zum freigeben von Resourcesn verwenden kann, sondern auch, um oft verwendete try-finally Blöcke zu vereinfachen, da diese dann mit using() verwendet werden können.

Etwas das recht häufig in try-finally Blöcken gemacht wird, ist die Zeit zu messen, die eine bestimmte Methode oder ein Teil einer Methode braucht. Das sieht dann zB so aus:


Stopwatch _watch = Stopwatch.StartNew();
try
{
    // do something...
}
finally
{
    Console.WriteLine("MeineMethode: {0} ms", _watch.ElapsedMilliseconds);
}

Das kann auch vereinfacht werden und so aussehen:


using (new Stopper("MeineMethode"))
{
    // do something...
}

Damit das funktioniert braucht man die Klasse Stopper (das eigentliche Snippet, das ich euch vorstellen will).


public class Stopper : IDisposable
{
    private readonly string _message;
    private readonly Stopwatch _watch = Stopwatch.StartNew();

    public Stopper(string message)
    {
        _message = message;
    }
    
    public void Dispose()
    {
        Console.WriteLine("{0} took {1} ms", _message, _watch.ElapsedMilliseconds);
    }
}

Die Klasse ist hier recht einfach - ich verwende zB log4net, ist aber ganz simpel und dennoch effektiv, Code wird so wesentlich leichter lesbar (meine Ansicht).

Beim Instanzieren wird eine Stopwatch gestartet, und beim Dispose() wird die Zeit ausgegeben. Mehr fällt mir dazu nicht ein.

Aber vielleicht habt ihr schon IDisposable für ähnliche Sachen verwendet, bin gespannt was Euch dazu einfällt...

Zeitmessung, IDisposable

13.11.2007 - 11:11 Uhr

dort gibts auch einige nette Sachen, sowie ein Set<>

http://www.wintellect.com/PowerCollections.aspx

12.11.2007 - 17:14 Uhr

int a = 5;
int b = 0;
int c = a/b; // Exception

double a = 5;
double b = 0;
double c = a/b; // c == double.PositiveInfinity -> keine exception

12.11.2007 - 11:15 Uhr

Original von svenson
Nachteil: Du verlierst IDictionary als Interface.

Nachdem das genau das ist, was er will (keine Add/Remove Methoden mehr) würde ich das nicht als Nachteil bezeichnen.

Find ich auch besser als eine NotSupportedException, weil man die erst zur Laufzeit sehen würde.

Ausserdem kann man immer noch ein eigenes IReadOnlyDictionary interface definieren, das eben jene Methoden nicht enthält.

09.11.2007 - 19:18 Uhr

svensons lösung ist gut.

aber unter umständen kommst du mit dem Strategy Pattern noch weiter. Dazu wirst du aber dein Programm zumindest leicht ändern müssen und nicht mehr den Namen einer Methode übergeben, sondern je nach Methode eine Instanz einer anderen Klasse, die ein Interface implementiert.

09.11.2007 - 19:05 Uhr

siehe auch http://logging.apache.org/log4net/

ist sehr schnell konfiguriert und daher auch für kleinprojekte nicht overpowered.

09.11.2007 - 14:08 Uhr

Original von Kalle
Ja das zweite ist ein offset der durch 0x1000 hoch addiert wird.
Ich kann ihn nicht als int definieren da er später noch Buchstaben beinhaltet und auch "0x" würde verloren gehen.

meinst du hexadezimal zahlen, zB :

int offset = 0x10CAFE;

09.11.2007 - 13:20 Uhr

zwei pointer addieren macht kaum sinn. sieht eher danach als als wäre der zweite pointer ein offset. somit kannst du den gleich als int definieren.

08.11.2007 - 15:29 Uhr

vielleicht ist hier auch was dabei:
http://www.codeproject.com/cs/algorithms/colorspace1.asp

06.11.2007 - 13:17 Uhr

wenn du nur in OnPaint() zeichnest, warum rufst du dann noch CreateGraphics() auf? die Graphics kommt doch schon in den EventArgs e.

06.11.2007 - 11:18 Uhr

ist das nicht so, dass \n nur in die nächste zeile geht (ohne die X position zu verändern) und \r ganz nach links geht?
du müsstest somit \n\r verwenden (oder noch besser Environment.NewLine)

05.11.2007 - 18:39 Uhr

du müsstest den Comparer so schreiben, dass er bei gleichen M noch nach L sortiert.

02.11.2007 - 14:19 Uhr

/signed
NullWert ist schön kurz.

02.11.2007 - 11:39 Uhr

von der übersetzung her würde verschmelzung / vereinigung passen.

aber wie wärs mit "null-verwandlung" oder "null-transformation"? also null-transformations-operator. transformiert eine null ja auf was anderes.

31.10.2007 - 16:42 Uhr

Original von mabru

LINQ geht auch ohne VS2008.

aber leider nur mit .NET 3.x X(

erst ab 3.5
3.0 gibts ja schon länger (WPF, WCF, WWF, aber kein LINQ)

31.10.2007 - 16:39 Uhr

Original von Cookiie
Für die Leute ohne Internet, gibts von mir nen zeitlich limitierten Offlinecode. Mit diesem kann der Kunde dann sein Produkt innerhalb der Zeitspanne aktivieren.

du meinst, der code muss innerhalb von zB 24 stunden eingegeben werden?
und nicht, dass das programm dann nur 3 monate läuft und dann neu aktiviert werden muss?

30.10.2007 - 22:57 Uhr

LINQ rechnet sich deshalb, weil LinqToSql die Erzeugung der Objekte übernimmt, und du das nicht selber machen musst. Ausserdem kannst du dann deine Queries mit Intellisense und vom Compiler geprüft erstellen, und merkst somit schon beim kompilieren, wenn wo was nicht stimmt. Bei Sql Strings merkst du das ja erst, wenns kracht.

30.10.2007 - 15:00 Uhr

Original von herbivore
Erst neulich hat Microsoft mit der Windows-Validierung, so dass massenhaft gültige Lizenzen als illegal eingestuft wurden:
>
und
>
. Wenigstens wurden die Lizenzen nicht gesperrt, sondern "nur" ein Reboot durchgeführt, Aero abgeschaltet und ein Hinweis angezeigt.

Windows zurückstufen ist dann aber genauso Diebstahl, wenns unberechtigt ist. Wenn ich für die Ultimate bezahlt hab, will ich die auch ultimativ nutzen.

30.10.2007 - 00:58 Uhr

das nicht.
ich habs in meiner java zeit verwendet. keine ahnung obs dafür auch ein addon für VS 2005 gibt, und wie die zusammenspielen.

29.10.2007 - 21:07 Uhr

vista styles so einbinden, dass sie auf xp laufen, kann ich mir nicht vorstellen, die hängen sicher zu tief im system drinnen bzw benutzen ausserdem vista features die es unter xp gar nicht gibt.

damit du unter xp controls hast die aussehen wie unter vista wirst du eigene controls schreiben müssen, die das selber zeichnen bzw controls von drittanbietern verwenden die diesen stil unterstützen.

29.10.2007 - 21:04 Uhr

Javaseitig hatte ich gute Erfahrungen mit TortoiseSVN.

29.10.2007 - 20:51 Uhr

ich weiss nicht ob es die möglichkeit gibt, das moderne theming zu erzwingen.

aber stell dir mal die frage, warum es jemand ausgeschaltet hat. wahrscheinlich will derjenige das einfach nicht. warum ihn also zu etwas zwingen das er nicht haben will? vielleicht verärgerst du ihn damit noch...