Connect with us

Entwicklung & Code

Neu in .NET 10.0 [23]: Neue LINQ-Operatoren LeftJoin() und RightJoin()


Wie in den letzten .NET-Versionen auch, liefert Microsoft in .NET 10.0 wieder neue Operatoren für Language Integrated Query (LINQ), die bestehende Konstrukte vereinfachen. Dieses Mal sind es mit LeftJoin() und RightJoin() zwei elementare Operatoren, zum einen aus der Mengenlehre und zum anderen für relationale Datenbanken. Mehr dazu steht im zugehörigen Issue auf GitHub.

Weiterlesen nach der Anzeige


Der Dotnet-Doktor – Holger Schwichtenberg

Der Dotnet-Doktor – Holger Schwichtenberg

Dr. Holger Schwichtenberg ist technischer Leiter des Expertennetzwerks www.IT-Visions.de, das mit 53 renommierten Experten zahlreiche mittlere und große Unternehmen durch Beratungen und Schulungen sowie bei der Softwareentwicklung unterstützt. Durch seine Auftritte auf zahlreichen nationalen und internationalen Fachkonferenzen sowie mehr als 90 Fachbücher und mehr als 1500 Fachartikel gehört Holger Schwichtenberg zu den bekanntesten Experten für .NET und Webtechniken in Deutschland.

Tatsächlich waren diese Operationen bisher in LINQ bereits möglich, allerdings nur umständlich über eine Gruppierung mit GroupJoin() und SelectMany() sowie DefaultIfEmpty(). Die neuen Methoden LeftJoin() und RightJoin() vereinfachen den Einsatz, wie folgender Code am Beispiel eines Join zwischen den Klassen Company und Website zeigt:


public void LeftRightJoin()
{
 CUI.Demo();
 
 Company[] companies =
 [
   new Company{ ID = 1, Name = "www.IT-Visions.de" },
   new Company{ ID = 2, Name = "Software & Support" },
   new Company{ ID = 3, Name = "Heise Gruppe GmbH & Co. KG" },
   new Company{ ID = 4, Name = "Startup i.Gr." } // hat noch keine Website
 ];
 
 Website[] websites =
 [
   new Website{ CompanyID = 1, URL = "www.IT-Visions.de" },
   new Website{ CompanyID = 1, URL = "www.dotnet10.de" },
   new Website{ CompanyID = 2, URL = "www.entwickler.de" },
   new Website{ URL = "www.Microsoft.com" }, // Diese kleine ;-) Firma ist noch nicht angelegt...
   new Website{ CompanyID = 3, URL = "www.heise.de" },
 ];
 
 // ### LeftJOIN ALT ############################################################################
 
 CUI.H2("--- Alle Firmen mit ggf. vorhandenen Websites via LeftJoin ALT (GroupJoin+SelectMany) seit .NET Framework 3.5 ---");
 
 var AllCompaniesWithWebsitesSetOld = companies
     .GroupJoin(websites,
                c => c.ID,
                w => w.CompanyID,
                (c, websites) => new { Company = c, Websites = websites })
     .SelectMany(
         x => x.Websites.DefaultIfEmpty(),  // Falls keine Website existiert, wird `null` verwendet
         (c, w) => new WebsiteWithCompany
         {
          Name = c.Company.Name,
          URL = w.URL,   // Falls `w` null ist, bleibt URL null
          City = c.Company.City
         });
 
 foreach (var item in AllCompaniesWithWebsitesSetOld)
 {
  Console.WriteLine((item.Name != null ? item.Name + " " + item.City : "- keine Firma -").Trim() + " -> " + (item.URL ?? "- keine URL -"));
 }
 
 // ### LeftJOIN NEU ############################################################################
 
 CUI.H2("--- Alle Firmen mit ggf. vorhandenen Websites via LeftJoin NEU ab .NET 10.0 ---");
 var AllCompaniesWithWebsitesSet = companies.LeftJoin(websites,
  e => e.ID,
  e => e.CompanyID,
  (c, w) => new WebsiteWithCompany { Name = c.Name, City = c.City, URL = w.URL }
  );
 
 foreach (var item in AllCompaniesWithWebsitesSet)
 {
  Console.WriteLine((item.Name != null ? item.Name + " " + item.City : "- keine Firma -").Trim() + " -> " + (item.URL ?? "- keine URL -"));
 }
 
 // ### RightJoin ALT ############################################################################
 
 CUI.H2("--- Alle Websites mit ggf. vorhandenen Firmen via RightJoin ALT (GroupJoin+SelectMany) seit .NET Framework 3.5  ---");
 var WebsiteWithCompanySetOLD = websites
     .GroupJoin(companies,
                w => w.CompanyID,
                c => c.ID,
                (w, companies) => new { Website = w, Companies = companies })
     .SelectMany(
         x => x.Companies.DefaultIfEmpty(),  // Falls kein Unternehmen existiert -> null
         (w, c) => new WebsiteWithCompany
         {
          Name = c.Name,  // Falls `c` null ist, bleibt `Name` null
          City = c.City,   // Falls `c` null ist, bleibt `City` null
          URL = w.Website.URL
         });
 
 foreach (var item in WebsiteWithCompanySetOLD)
 {
  Console.WriteLine((item.Name != null ? item.Name + " " + item.City : "- keine Firma -").Trim() + " -> " + (item.URL ?? "- keine URL -"));
 }
 
 // ### RightJoin NEU ############################################################################
 
 CUI.H2("--- Alle Websites mit ggf. vorhandenen Firmen via RightJoin NEU ab .NET 10.0 ---");
 var WebsiteWithCompanySet = companies.RightJoin(websites,
     e => e.ID,
     e => e.CompanyID,
     (c, w) => new WebsiteWithCompany { Name = c.Name, City = c.City, URL = w.URL }
  );
 
 foreach (var item in WebsiteWithCompanySet)
 {
  Console.WriteLine((item.Name != null ? item.Name + " " + item.City : "- keine Firma -").Trim() + " -> " + (item.URL ?? "- keine URL -"));
 }
 
 // ### Zum Vergleich: Inner Join, den es seit .NET Framework 3.5 gibt
 CUI.H2("--- Alle Firmen, die Websites haben, via InnerJoin seit .NET Framework 3.5 ---");
 var CompaniesWithWebsitesSet = companies.Join(websites,
                                        c => c.ID,
                                        w => w.CompanyID,
                                        (c, w) => new WebsiteWithCompany
                                        {
                                         Name = c.Name,
                                         URL = w.URL,
                                         City = c.City
                                        });
 foreach (var item in CompaniesWithWebsitesSet)
 {
  Console.WriteLine((item.Name != null ? item.Name + " " + item.City : "- keine Firma -").Trim() + " -> " + (item.URL ?? "- keine URL -"));
 }
}



Screenshot

Screenshot

Der Code erzeugt diese Ausgabe (Abb. 1).

Die neuen Operatoren sind laut Microsoft performanter als die bisherige Operatorkombination.


Vergleichstabelle

Vergleichstabelle

Performance von LeftJoin() im Vergleich zu der bisherigen Operatorkombination (Abb. 2)

(Bild: Microsoft)


(rme)



Source link

Entwicklung & Code

.NET-Grafiken: SkiaSharp 4 mit Engine-Upgrade erschienen


Zwei Jahre Arbeit sind in das neu erschienene SkiaSharp 4.148.0 geflossen. Dabei handelt es sich um die erste stabile 4.x-Version der Cross-Platform-2D-Grafik-API für .NET-Plattformen, die auf Googles Skia-Graphics-Bibliothek basiert. Sie bringt eine überarbeitete Engine für verbesserte Grafiken sowie erhöhte Performance.

Weiterlesen nach der Anzeige

SkiaSharp wird vom .NET-Team in Partnerschaft mit dem Uno-Platform-Team entwickelt und kommt in .NET MAUI, WebAssembly, WinUI 3 und Frameworks wie Uno Platform zum Einsatz.


betterCode() .NET 11.0

betterCode() .NET 11.0

(Bild: King / stock.adobe.com)

Das ist neu in .NET: Die Online-Konferenz betterCode() .NET 11.0 präsentiert am 17. November 2026 die zentralen Änderungen für Entwicklerinnen und Entwickler. Bis zur Veröffentlichung des Programms sind vergünstigte Blind-Bird-Tickets verfügbar.

Die in SkiaSharp 4 auf den Chrome-Meilenstein m148 aktualisierte native Skia-Engine soll sich positiv auf bestehende Apps auswirken, ohne Codeänderungen zu erfordern. Unter anderem soll sie die Performance verbessern sowie für schärfere herunterskalierte Grafiken, automatische Fotoausrichtung und akkuratere Farben sorgen. Wie Microsoft in der Ankündigung betont, zeigen erste Tests im Vergleich zur vorherigen SkiaSharp-Version 3.119 ein um bis zu 24 Prozent schnelleres Rendering zentraler App-UI-Bestandteile, wie Schlagschatten und mehrschichtige Oberflächen. Dabei treten laut den Tests an anderen Stellen keine Regressionen auf.

SkiaSharp 4 räumt darüber hinaus mit Legacy-APIs auf und behebt unter der Haube die Ursache für eine Klasse von Use-After-Free-Abstürzen durch einen neuen Umgang mit Singleton-Objektlebenszyklen. Daneben hat das Entwicklungsteam die Test-Suite auf xUnit 3 aktualisiert und jede gebundelte native Dependency mit den neuesten Security-Fixes versehen. Als ein neues Feature ist nun vollständige Kontrolle über OpenType-Variablen-Schriftachsen enthalten, ebenso wie animiertes WebP-Encoding mit SKWebpEncoder sowie Farbpaletten für Emoji- und Icon-Schriftarten.

Weiterlesen nach der Anzeige

Die interaktive SkiaSharp-Galerie zeigt die Möglichkeiten mit Blazor WebAssembly und Uno Platform. Beispiele mit .NET MAUI und weiteren Technologien sollen folgen.

SkiaSharp 4.148.0 steht beim .NET-Paketmanager NuGet unter MIT-Lizenz zum Download bereit. Weitere Informationen zur neuen stabilen Version


(mai)



Source link

Weiterlesen

Entwicklung & Code

Hacking-Fähigkeiten von Chinas KI Z.ai angeblich so gut wie die von Claude


Das chinesische KI-Unternehmen Zhipu AI (bekannt als Z.ai) hat mit GLM-5.2 ein Open-Weight-Modell veröffentlicht, das sich bei der Erkennung von Sicherheitslücken offenbar mit Anthropics Opus 4.8 messen kann.

Weiterlesen nach der Anzeige

Das haben IDOR-Benchmark-Tests der Cybersicherheitsfirma Semgrep ergeben. Da es sich um ein Open-Weight-Modell handelt, kann jeder GLM-5.2 herunterladen, lokal betreiben und modifizieren. Das eröffnet für Hacker weitere Möglichkeiten für kriminelle Einsätze.

Die offene Verfügbarkeit von GLM-5.2 ist ein zweischneidiges Schwert. Sicherheitsfirmen, CERTs und interne Red Teams können das Modell in abgeschotteten Umgebungen für Code-Reviews und Penetrationstests nutzen, ohne sensible Daten an US-Clouds zu übermitteln. Für DSGVO-konforme Umgebungen in Europa ist das ein Vorteil.

Gleichzeitig können auch Angreifer GLM-5.2 ohne jede Aufsicht betreiben. Diese Eigenschaft macht das Modell attraktiv für Akteure, die nach Schwachstellen in kritischen Systemen suchen wollen. Lior Div, Chef der Cybersicherheitsfirma 7AI, fasste die Lage gegenüber dem Wall Street Journal zusammen: China sorge dafür, dass der Abstand zu den US-KIs „immer kleiner“ werde.

Zhipu AI selbst räumt in den Release Notes ein, dass GLM-5.2 während des Reinforcement-Learning-Trainings verstärkt sogenanntes Reward Hacking zeigte. Das Unternehmen habe daraufhin spezielle Anti-Hacking-Sicherungen für das Training und die Evalution des Modells integriert.

Die Entwicklung trifft die US-Regierung in einem heiklen Moment. Eines von Anthropics Modellen war kurzzeitig komplett gesperrt, weil die Trump-Administration den Zugriff durch ausländische Nutzer untersagte. Auch OpenAI bekommt von der US-Regierung Auflagen „aus Sicherheitsgründen“.

Weiterlesen nach der Anzeige

Für europäische Unternehmen und Behörden stellt sich mit der wachsenden Leistungsfähigkeit der KI-Modelle die Governance-Frage: Wie lässt sich der Einsatz solcher Werkzeuge in sicherheitskritischen Bereichen mit dem EU AI Act und nationalen Sicherheitsvorgaben vereinbaren – und wie geht man mit einem Modell um, das beim Schwachstellen-Finden brilliert, aber keiner Aufsicht unterliegt?


(rie)



Source link

Weiterlesen

Entwicklung & Code

So würde eine KI als Start-up-Chef abschneiden


Forscher der Princeton University haben mit CEO-Bench einen neuen Langzeit-Benchmark vorgelegt, der KI-Agenten vor eine ungewöhnliche Aufgabe stellt: Sie sollten 500 Tage lang ein fiktives Software-Start-up führen. Das Ergebnis fällt für die aktuellen Modelle ernüchternd aus. Von zehn getesteten KI-Modellen schafften es lediglich drei, am Ende mehr Geld auf dem Konto zu haben als das Startkapital von einer Million US-Dollar. Zum Vergleich: Daten zu menschengeführten Start-ups in den USA legen nahe, dass ein Fünftel aller Start-ups im ersten Jahr und bis zu 65 Prozent der Start-ups innerhalb von zehn Jahren nach ihrer Gründung scheitern.

Weiterlesen nach der Anzeige

Als Vergleich im Benchmark-Test ließen die Forscher auch einen handkodierten, regelbasierten Agenten ganz ohne maschinelles Lernen die gleiche Aufgabe absolvieren. Abgesehen von den drei Gewinnern performte er besser als die KI-Modelle.

Die in der auf arXiv veröffentlichten Studie mit der beschriebenen Simulation dreht sich um ein Start-up namens „NovaMind“. Die KI-Agenten starten ohne Kunden und mit einer Million Dollar. Fällt der Kontostand unter null, ist die Firma insolvent – und das Spiel vorbei. Um ihr Start-up zu führen, stehen den Agenten 34 Werkzeuge zur Verfügung: von Preisfestlegung über Produktgestaltung bis hin zu Marketing. Als Input bekommen sie unter anderem „unternehmensinterne“ Datenbanken, Informationen zu Kundengruppen mit Präferenzen, die erst entschlüsselt werden müssen, und einen Markt, der sich laufend verändert. Konjunkturzyklen, Druck durch Wettbewerber und Änderung der Marktlage inklusive. Die Modelle müssen unübersichtliche, miteinander vernetzte Unternehmensdatenbanken analysieren, Daten und Ereignisse in fundierte Strategien übersetzen und zahlreiche Entscheidungen aufeinander abstimmen. Wie die Autoren der Studie betonen, messen sie damit nicht die Fähigkeit, isolierte Aufgaben abzuarbeiten, sondern das, was sie „Steering Intelligence“ nennen: die Kompetenz, ein komplexes System über längere Zeit trotz Unsicherheiten zu steuern.

In der Hauptauswertung absolvierten alle Modelle jeweils drei Durchläufe. Als Leistungsmaß dient der beste Run pro Modell. Claude Opus 4.8 erzielte dabei ein End-Guthaben von rund 27,8 Millionen US-Dollar nach 500 Tagen, GPT-5.5 kam auf etwa 21,3 Millionen. Beide Modelle landeten damit in ihrer besten Runde deutlich oberhalb des Startkapitals – in den anderen beiden Runden lagen sie darunter und „bestanden“ den Test ebenfalls nicht. Claude Fable 5 schaffte laut der CEO-Bench-Projektseite in einem Lauf rund 47 Millionen Dollar; hier lief der Test jedoch zwischenzeitlich mit Opus, da Fable sich aufgrund seiner starken Sicherheitseinschränkungen immer mal wieder Aufgaben verweigerte.

Die übrigen Modelle blieben entweder unter dem Startkapital oder gingen bankrott. Claude Opus 4.7 überlebte zwar in allen Läufen die kompletten 500 Tage, endete aber mit nur rund 390.000 Dollar. Grok 4.20 hielt es im besten Fall gerade einmal 37 Tage durch, DeepSeek V4 Pro maximal 176 Tage.

Weiterlesen nach der Anzeige

Die erfolgreichen Modelle gingen für ihren Erfolg sehr unterschiedlich vor. Claude Opus 4.8 verfolgte in einem Run eine radikale Harvesting-Strategie: zunächst aggressiver Kundenaufbau, dann drastische Kostenschnitte – am Ende stand eine hohe Cash-Bilanz bei null aktiven Kunden. Ziel erreicht, im echten Leben wäre das jedoch nichts wert gewesen. GPT-5.5 setzte hingegen auf einen dauerhaften Kundenstamm und investierte rund 89 Prozent seines Entwicklungsbudgets in gruppenspezifische Verbesserungen. Beide Modelle schrieben eigenständig Code-Dateien: Opus 4.8 baute eine kohortenbasierte Cash-Prognose, GPT-5.5 analysierte Verhandlungshistorien, um Kundenpräferenzen abzuleiten.

Die Varianz zwischen den Läufen desselben Modells ist ebenfalls groß. GPT-5.5 zum Beispiel schwankte zwischen frühen Bankrotten nach 77 Tagen und einem vollständigen 500-Tage-Lauf. Einzelne Runs liefern daher kein stabiles Leistungsbild. Selbst in einer auf 50 Tage verkürzten Variante scheiterten die meisten Agenten – was nahelegt, dass nicht nur der lange Horizont, sondern die grundsätzliche Entscheidungskoordination unter Unsicherheit ein Problem für sie darstellt.

Das Ergebnis passt ins Bild aktueller Forschung zur Langzeit-Kompetenz von KI-Modellen. Im Projekt „Emergence World“ durften Modelle wie ChatGPT, Grok, Claude und Gemini simulierte Städte regieren – mit teils bizarren Resultaten: Gemini 3 Flash schuf eine Hochkriminalitäts-Welt, Claude Sonnet 4.6 baute einen nahezu konfliktfreien „Ponyhof“. Auch dort zeigte sich, dass die Modelle in offenen Langzeit-Szenarien zu unvorhersehbarem Verhalten neigen. Man muss allerdings bei beiden Simulationen anfügen: Die getesteten KIs waren keine Weltmodelle, sondern überwiegend Reasoning-Modelle, die mutmaßlich nicht ideal für solche Aufgaben sind.


(rie)



Source link

Weiterlesen

Beliebt