Laden...
Avatar #avatar-2167.png
Golo Roden myCSharp.de - Member
Freiberuflicher Wissensvermittler und Technologieberater für .NET, Codequalität und agile Methoden Riegel am Kaiserstuhl Dabei seit 04.10.2003 4.207 Beiträge
Benutzerbeschreibung
Golo Roden ist freiberuflicher Wissensvermittler und Technologieberater für .NET, Codequalität und agile Methoden.

Forenbeiträge von Golo Roden Ingesamt 4.207 Beiträge

21.09.2009 - 07:56 Uhr
  1. Siehe Events und Delegates im Detail - Feinheiten in MSIL

  2. Weil die InterlockedExchange-Methode einmal für Referenztypen existiert, und einmal für diverse Wertetypen, und man die Variante für Referenztypen nicht mit Wertetypen verwenden soll.

21.09.2009 - 07:28 Uhr

@ErfinderDesRades .... ach so meintest Du das, okay, sorry, das hatte ich anders verstanden!

21.09.2009 - 07:24 Uhr

Und sind eine ganz blöde Idee ... siehe Für und wider C# 4.0

21.09.2009 - 07:18 Uhr

Hmmm ...

Ich habe jetzt eine ganze Weile überlegt, was ich von dem Code halte. Und entweder habe ich ihn nicht verstanden, oder er ist tatsächlich ein wenig merkwürdig 😉.

Was mich irritiert, ist die while-Schleife ... Du ersetzt letztlich value durch newValue, falls value = oldValue gilt. Das gilt im ersten Schleifendurchlauf aber in jedem Fall, da oldValue ja gerade so definiert ist, dass es = value ist.

In der while-Bedingung prüfst Du dann, ob der Rückgabewert != oldValue ist. Das kann im ersten Durchlauf aber nie der Fall sein, weil der Rückgabewert immer dem ursprünglichen Wert entspricht (also oldValue), egal ob die Ersetzung durchgeführt wurde oder nicht.

Das heißt doch, die Schleife wird mindestens ein zweites Mal betreten, und das ist ja dann - gerade im Hinblick darauf, dass die übergebene Methode mindestens zwei Mal ausgeführt wird - auch nicht mehr so wahnsinnig performant. Oder habe ich da irgendetwas übersehen?

18.09.2009 - 12:27 Uhr

Sorry, aber das ist Quatsch.

Auch wenn das Array nicht auf null gesetzt wird, wird es genauso früh oder spät abgeräumt, wenn das verweisende Objekt nicht mehr referenziert wird.

Das Aufräumen von Resourcen innerhalb von Dispose ist nur für unverwaltete (!) Resourcen sinnvoll.

18.09.2009 - 08:13 Uhr

Auch mit Dispose wird das Objekt aber nicht gelöscht - genauso wenig wie bei einer WeakReference.

17.09.2009 - 12:58 Uhr

Nein.

Die GC entfernt das Objekt, wenn keine Referenz mehr darauf verweist - das heißt, Du musst zwingend alle Referenzen per Hand auf null setzen.

Der umgekehrte Weg ist nicht möglich.

16.09.2009 - 13:09 Uhr

wozu braucht ihr wlan auf eure handys ?

Ich hab ein Windows Mobile-basiertes Gerät und ein Exchange-Postfach => ich kann Exchange mit dem Handy synchronisieren. Und weil das per WLAN a) schneller geht als per Mobilfunk und b) weniger kostet (nämlich gar nix 😉), würde ich auf WLAN nicht mehr verzichten wollen.

16.09.2009 - 11:07 Uhr

Da das Theme nicht userbezogen ist, gehört es nicht in die Session. Guck Dir mal das Application-Objekt an - das ist quasi die userübergreifende "Session" und dürfte dafür genau das richtige sein.

16.09.2009 - 11:06 Uhr

Weder noch:

Auf Touch und WLAN würde ich nicht verzichten wollen, eine Kamera, ein Radio oder einen mp3-Player brauche ich definitiv nicht im Handy.

15.09.2009 - 07:49 Uhr

Falls Du aus einer .NET-Anwendung eine andere im administrativen Kontext starten willst, musst Du bei Process.Start das Verb "runas" angeben.

14.09.2009 - 14:28 Uhr

SharePoint basiert auf ASP.NET

14.09.2009 - 09:55 Uhr

Hi Florian,

cool, das war's! Tja, warum das so ist - fällt mir auch nichts sinnvolles zu ein 😦

Vielen Dank für Deine Hilfe!

Golo

14.09.2009 - 09:21 Uhr

Hi Florian,

die Methode sieht folgendermaßen aus:

// Load the user configuration file.
var root = XElement.Load(this._userConfigurationFile);

// Add the new user to the file.
root.Element(_userNamespace, "custom").Add(
    new XElement(_userNamespace + "user",
        new XAttribute(_userNamespace + "securityId", user.SecurityId.Value.ToStringWithBraces()),
        new XAttribute(_userNamespace + "fullName", user.FullName),
        new XAttribute(_userNamespace + "logon", user.Login),
        new XAttribute(_userNamespace + "password", user.PasswordHash),
        new XElement(_userNamespace + "groups")));

// Save the changes.
root.Save(this._userConfigurationFile);

_userNamespace ist ein XNamespace und definiert als "http://example.com/", und entspricht auch exakt dem, was im Root-Element der Datei als xmlns angegeben ist.

Viele Grüße,

Golo

14.09.2009 - 09:17 Uhr

Hi Kaji,

das Problem ist, dass .NET dann davon ausgeht, dass man gar keinen Namespace haben will und ein

xmlns=""

beim eingefügten Child-Element hinzufügt.

Viele Grüße,

Golo

14.09.2009 - 09:03 Uhr

Hallo,

folgendes Problem: Ich habe eine XML-Datei, der im Root-Knoten ein xmlns zugewiesen wird. Nun möchte ich dieser Datei per LINQ to XML neue Knoten hinzufügen.

Beim Anlegen des neuen Knotens gebe ich dem XElement den passenden XNamespace mit.

Obwohl es der gleiche Namespace ist wie der, der bereits für den Root-Knoten eingetragen ist, schreibt er mir ein neues xmlns-Attribut an das neu erzeugte Element.

Woran könnte das liegen?

Viele Grüße,

Golo

12.09.2009 - 08:53 Uhr

Du bist genial, danke 😃!

11.09.2009 - 23:00 Uhr

Hallo,

ich habe in XML folgende Struktur:

<users>
  <user id="1">
    <groups>
      <group name="a" />
      <group name="b" />
    </groups>
  </user>
</users>

Solche user-Einträge kann es rein theoretisch mehrere geben. Was ich nun haben will, sind die Namen aller Gruppen für eine bestimmte User-ID - und das idealerweise in nur einer LINQ-Abfrage. Aber irgendwie stelle ich mich dabei ein bisschen blöd an.

Folgendes habe ich bislang:

from u in users.Elements("user")
  where u.Attribute("id") == 1
  select u.Element("groups").Elements("groups");

Nur dann komme ich nicht weiter - weil ich auf Elements kein Attribute("name") mehr aufrufen kann.

Irgendwie habe ich das Gefühl, dass ich hier einen totalen Knoten drin habe, und ich das eigentlich ganz anders angehen müsste - ich habe nur leider keinen blassen Schimmer, wie. Kann mir jemand dabei helfen?

Viele Grüße,

Golo

10.09.2009 - 08:47 Uhr

Hat sich erledigt: Der "Content-Location"-Header ist zuständig (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.14).

10.09.2009 - 08:17 Uhr

Hallo,

in der WebResponse-Klasse gibt es die Eigenschaft ResponseUri. Ich frage mich, wie das gemacht wird - denn einen entsprechenden Response-Header gibt es meines Wissens nicht (oder doch?).

Hat jemand eine Idee?

Viele Grüße,

Golo

09.09.2009 - 10:29 Uhr

Der Hinweis findet sich interessanterweise nur auf der MasterPage.Master-Property-MSDN-Seite (http://msdn.microsoft.com/de-de/library/system.web.ui.masterpage.master.aspx).

Dort heißt es:

Die Master-Eigenschaft ist schreibgeschützt, da zur Laufzeit keine Hierarchien von Masterseiten erstellt werden können.

09.09.2009 - 09:41 Uhr

Hallo,

ich habe eine Klasse, die IHttpHandler implementiert, um eine Webseite vollständig per Code zu erzeugen. Nun soll diese Seite mit einer MasterPage verknüpft werden, die aber ihrerseits auch nur als Code vorliegt - also keine .master-Datei, sondern nur eine von System.Web.UI.MasterPage abgeleitete Klasse.

Wie bekomme ich beides zusammen?

IHttpHandler hat zwar eine Eigenschaft Master, die ist aber read-only - und die schreibbare Eigenschaft MasterPageFile will eine Datei haben ...

Wie löst man dieses Problem?

Viele Grüße,

Golo

09.09.2009 - 08:40 Uhr

Also verstanden habe ich (glaube ich), worauf Du hinauswillst. Du machst es Dir tatsächlich ein wenig schwierig 😉.

Wenn Du willst, dass nur ein PC mit einer bestimmten MAC-Adresse etwas wieder entschlüsseln kann, dann nimm doch einfach die MAC-Adresse als Kennwort für Deine Verschlüsselung.

Das wäre es doch dann schon gewesen.

08.09.2009 - 15:29 Uhr

Wenn PC 2 das Passwort zum Entschlüsseln braucht, das PC 1 zum Verschlüsseln verwendet hat, hat das nichts mehr mit asymmetrischer Verschlüsselung zu tun.

Genau das - das gleiche Kennwort zum Ver- und Entschlüsseln - ist symmetrische Verschlüsselung.

Oder habe ich da jetzt etwas falsch verstanden?

08.09.2009 - 15:27 Uhr

Klares jein 😉

Hauptberuflich nein, nebenberuflich ja.

Warum fragst 😉?

08.09.2009 - 15:03 Uhr

Ich wünsch mir dass AOP zumindest in der IDE standardmäßig möglich ist, ob das dann auch mit C# Spec 5 zu tun haben muss, ist eine andere Frage.

Wäre schön wenn alles was mit Postsharp möglich ist, dann auch so oder auf ähnliche Weise mit der VS xx IDE möglich wäre...

Oh ja! FULLACK

08.09.2009 - 09:29 Uhr

Mal abgesehen davon - wenn Die Methode "GetVehicle" heißt, sollte sie auch ein Vehicle zurückgeben und nicht eine ID.

Da das Vehicle ja als out-Parameter zurückkommen soll, warum nicht folgendermaßen:

Vehicle vehicle = GetVehicle(whereClause);
string id = vehicle.Id;

Das wäre konsistent von der Namensgebung, und Du würdest dieses out-Konstrukt vermeiden.

08.09.2009 - 09:27 Uhr

Wenn ich das ganze mit Testklassen erstelle funktioniert es. Zumal es sehr unschön ist, wenn man jedes mal, wenn man eine Member Benutzen möchte
eine Hilfsvariable benutzen muss. Das empfinde ich als starke einschränkung vorallem wenn ich mit Graphen Arbeiten will.

Auch mit Testklassen ist es in C# nicht möglich, Eigenschaften als out- oder ref-Parameter zu übergeben.

Es geht "by design" nicht.

08.09.2009 - 09:05 Uhr

Zumindest bei mir war es damals so, dass ich dann auch Events besser verstanden habe.

Und, falls Dich technische Details und Best Practices interessieren, guck mal hier: MSDN Webcast: Events und Delegates im Detail - Feinheiten in MSIL

08.09.2009 - 09:04 Uhr

Auch Java EE hat sehr lange Releasezyklen (wenn ich mir EJBs angucke), das finde ich dort auch nicht unbedingt vorteilhaft.

Klar haben kurze Releasezyklen den "Nachteil", dass man ständig neues lernen muss, auf der anderen Seite etablieren sich ungünstige Pattern erst gar nicht ...

07.09.2009 - 10:11 Uhr

Hallo,

Delegaten sind quasi normale Variablen, nur dass darin halt Code und keine Daten gespeichert werden. Was man damit machen kann, ist zum Beispiel, eine Funktion als Parameter zu übergeben.

Sprich, Du hast eine Funktion, die irgendwas langlaufendes macht, und idealerweise soll die Dir Bescheid sagen, wenn sie fertig ist, indem sie ihrerseits wieder eine Funktion bei Dir aufruft.

Nun möchtest Du das ganze aber nicht hart verdrahten, weil diese langlaufende Funktion allgemein nutzbar sein soll. Was also tun?

Ganz einfach: Die Rückrufmethode wird als Parameter mitgegeben (und weil das ja keine Daten sind, sondern Code, muss es eben ein Delegate sein).

Das war's eigentlich auch schon 😉

Viele Grüße,

Golo

PS: Als Besonderheit sei noch erwähnt, dass man in einem Delegate (also quasi in einer Variablen) mehrere Funktionen speichern kann. Es entspricht also eher einem Array aus Funktionen, als einer einfachen Variable.

06.09.2009 - 20:40 Uhr

Liegt daran, dass die Generischen Typen nicht abgeleitet sind.

Ist IMHO nicht der Grund - der Grund ist eher, dass die Typsicherheit verletzt werden könnte und Probleme entstehen könnten, die erst zur Laufzeit auftreten. Als simpler Beispielcode:

List<string> myStrings = new List<string>();
List<object> myObjects = (List<object>)myStrings;
myObjects.Add(new object());

Dabei knallt's dann (zur Laufzeit), weil die zu Grunde liegende Liste eben nur Strings aufnehmen kann, und ein object kein String ist.

Bei C# 4 gibt es die neuen Schlüsselwörter in und out, mit denen man dieses Verhalten explizit freigeben muss - das heißt, es geht nicht OOTB per se mit jeder Collection. Der Sinn der expliziten Freigabe liegt eben genau darin, dass der Entwickler wissen soll, welche Gefahren er sich einhandelt.

05.09.2009 - 20:20 Uhr

Hi Florian,

das wird mit C# 4 gehen. Nennt sich Kovarianz beziehungsweise Kontravarianz von generischen Typen.

Viele Grüße,

Golo

04.09.2009 - 22:27 Uhr

Das ist das, was ich mit dem oben erwähnten IArithmetic meinte ...

01.09.2009 - 15:01 Uhr

Zum Thema "Parametrisierbare Properties": Im Endeffekt so was wie die Indexer, nur dass ich davon gerne mehrere hätte, und die nicht zwingend this nennen möchte - in VB geht das, in C# nicht.

Statische Member bzw Konstruktoren in Interfaces: Ich würde gerne zB in einem Interface vorgeben können, dass jede Klasse, die dieses Interface implementiert, einen bestimmten Konstruktor aufweisen muss - zum Beispiel einen Konstruktor mit einem bestimmen Parameter.

Analog dazu würde ich gerne erzwingen können, dass jede Klasse, die ein bestimmtes Interface implementiert, einen bestimmten statischen Member aufweisen muss.

Mir ist klar, dass Interfaces dafür der falsche Ort sind (@ Peter, ja dazu gab es auch schon mal eine Diskussion 😉), aber vom Prinzip her drückt es das aus, was mir fehlt: So eine Art Klassentemplate, das von abgeleiteten Klassen implementiert werden muss, was allerdings - im gegensatz zu Interfaces - von der Vererbung ausgenommen ist.

31.08.2009 - 21:27 Uhr

Ja, okay, das mit dem Master stimmt, aber so was wie einen Certified XP Trainer?

31.08.2009 - 21:26 Uhr

Mal ein paar Anmerkungen zu den Vorschlägen:

Was ich gerne hätte:

  • Statische Member und Konstruktoren in Interfaces
  • Parametrisierbare Properties
  • IArithmetic-Interface, um arithmetische Operationen auf Generics zu erlauben (okay, hat mehr was mit .NET als mit C# zu tun)
30.08.2009 - 15:35 Uhr

Hallo,

für Scrum gibt es ja den Certified Scrum Master als Zertifizierung.

Gibt es etwas vergleichbares auch für Extreme Programming? Wenn ja, wie nennt sich das?

Viele Grüße,

Golo

30.08.2009 - 15:33 Uhr

Also ich war auch vor ein paar Jahren mal bei Gravis .... ich sag's mal so: Wenn ich eine Stilberatung oder eine neue Frisur gewollt hätte, wären die Leute dort sicherlich kompetent gewesen.

Was ihre Computer angeht, scheint ihnen damals entgangen zu sein, dass ich durchaus bereit gewesen wäre, ein paar tausend Euro dort zu lassen .... kurzum: Total inkompetent.

29.08.2009 - 10:22 Uhr

Das bezieht sich aber leider nicht auf .NET ... ansonsten ist das schon eine sehr gute Anleitung, gerade um zu verstehen, warum wieso weshalb das alles so ist.

Aber alle Codebeispiele beziehen sich leider nur auf Win32.

29.08.2009 - 10:19 Uhr

Hallo,

zudem wäre die Frage, was "halbwegs gut" heißt 😉.

Aber mal im Ernst: Ich denke, einfache Konsolenprogramme hat man relativ schnell raus - auch vielleicht ein bisschen was grafisches, sofern man mit dem Designer auskommt, dürfte nicht so lange dauern.

Bis man allerdings die Grundlagen verstanden hat, die Hintergründe kennt, richtig objektorientiert denken kann, ... da können Jahre vergehen.

Insofern steht und fällt die Antwort eigentlich damit, welche Ansprüche Du an Dich selbst und die zu schreibende Anwendung stellst.

Viele Grüße,

Golo

28.08.2009 - 12:40 Uhr

Da wirst du wenig Erfolg haben, denn MSSQL verursacht beim Hoster Lizenzkosten und die muss schließlich jemand bezahlen.
Für die Express Varianten fallen auch für Hoster keine Lizenzkosten an. Aber bedingt durch die Performanceminderung der Express Versionen ist diese nicht wirklich geeignet, um zahlreiche User und Datenbanken mit grossem Traffic zu hosten.

Und das Betriebssystem, auf dem SQL Server Express läuft, kostet ja zum Glück auch nichts 😉?

27.08.2009 - 10:37 Uhr

Ja, danke, dass hilft weiter.

@kleines_eichhoernchen:
Leider kann ich deiner Argumentation nicht folgen, da dies gegen die Vorschrift für Objekte verstößt, sofern diese Werte haben. Die Methode ReferenceEquals sollte immer über == verwendet werden. Equals ist für Wert-Vergleiche da. Der ==-Operator kann bei immutable-Objekten überschrieben werden. Equals kann aber auch bei veränderlichen Objekten verwendet werden.
Dazu folgender Link:

>

Was gemeint ist, ist folgendes:

Wenn Du == überlädst, solltest Du auch Equals und GetHashCode überschreiben. Also entweder alle oder nichts.

27.08.2009 - 10:35 Uhr

Zwei Threads, der eine löst ein Manual- oder ein AutoResetEvent aus, der andere wartet mit WaitOne darauf.

Basisklasse für all das ist WaitHandle.

Siehe MSDN und http://yoda.arachsys.com/csharp/threads/ - dort finden sich jeweils massenhaft Beispiele.

27.08.2009 - 10:29 Uhr

Er schrieb was von asynchron - in dem Fall ist das IMHO kein Quatsch, zumindest aus technischer Sicht nicht.

27.08.2009 - 10:14 Uhr

Stichworte: AutoResetEvent, ManualResetEvent, WaitHandler

27.08.2009 - 08:00 Uhr

Bei all dem (Regex & Co) bitte an IPv6 denken 😉

27.08.2009 - 07:59 Uhr

Noch mal meine Frage:

Wenn Du in der überschriebenen Methode ausschließlich base aufrufst, welchen Sinn hat dann die überschriebene Methode?

26.08.2009 - 12:19 Uhr

In der Klasse john definierst Du ein Ereignis, und überschreibst die add- und remove-Handler, so dass das Event keine eigene Delegatinstanz hat, sondern der Eventhandler an die dummy-Objekte durchgereicht wird.

Damit sparst Du Dir eine Menge Arbeit.