Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von bSharp
Thema: Subversion zur Datensicherung [oder andere Wege, um ein versioniertes Backup zu erstellen]
Am im Forum: Smalltalk

Du musst aber die Inkonsistenzen auflösen wenn die Mitarbeiter den ganzen Tag Dateioperationen OHNE Tortoise ausführen.

Hast Du schonmal mit SVN gearbeitet? Dann versuche es mal.

Es ist ungeeignet für deine Zwecke.

Thema: Subversion zur Datensicherung [oder andere Wege, um ein versioniertes Backup zu erstellen]
Am im Forum: Smalltalk

@1mannlan
Subversion ist vollkommen ungeeignet für dein Vorhaben.

Du willst doch nicht von den Mitarbeitern verlangen, dass jede Dateioperation über z.B. TortoiseSVN durchgeführt wird, oder?
Wenn Dateien einfach wie gewohnt kopiert, gelöscht und verschoben werden, hast Du bei jedem Commit unzählige Fehler von Hand aufzulösen -> Horror

Thema: Design Pattern: Welche benutzt Ihr?
Am im Forum: Rund um die Programmierung

Hallo


Muster die ich gerne verwende:

-Abstract Factory & Repository: Häufig in der Datenschicht.

-Strategy, State und Bridge: Sehr nützlich und eng verwandt. Eigentlich lässt sich die Idee dahinter ständig einsetzen um Verhalten wegzukapseln. Meine Meinung: Strategy ist das wichtigste aller Muster.

-Observer, Iterator, Mediator: events und IEnumerables, ist klar. Und jede Form ist Mediator ihrer Controls. Verwendet man also unbewusst ständig.

-Template Method: Kürzlich in einer Bildverarbeitungsbibliothek verwendet mit sehr sauberem Ergebnis.

-Visitor: Double-Dispatching ist eine faszinierende Idee um if-else-Kaskaden bei der Bestimmung eines konkreten Subtyps zu vermeiden.

-Facade: Einen Satz von Low-Level Schnittstellen hinter einer sauberen, kleinen Facade zu verstecken ist praktisch.

-Interpreter: Ein Rekursiv-Absteigender Parser eben. Sehr nützlich aber warum es ein Muster ist, ist mir rätselhaft.

-Builder: Bei einem Lexergenerator kürzlich verwendet: Regulärer Ausdruck -> NFA -> DFA. Der schrittweise Konstruktionsprozess von RA -> NFA kann damit schön weggekapselt werden.

-Command: Bei einem minimalistischen 3D-Modeller. Aus einer Mausaktion wird entsprechend irgendwelchen gesetzten Häckchen ein Command erstellt, das später ausgeführt wird. Sehr saubere Sache.


Muster die mich Interessieren aber noch nie in Produktivcode verwendet habe:

-Memento: Mangels friend-Schlüsselwort etwas schwierig zu verwenden in C# aber es geht trotzdem.

-Fliegengewicht: Schwierig zu verwenden weil man schnell den Überblick beim extrinsischen Zustand verliert und Anwendungsgebiete sind rar.


Muster die ich als unsauber oder wenig nützlich empfinde:

-Dekorator: Bei Streams z.B. sehe ich den Nutzen aber insgesamt sind Dekorierer gefährlich und hässlich. Wenn sich der Client-Code darauf verlässt, es mit dem "echten" Objekt zu tun zu haben, knallts.

-Proxy: Siehe Dekorator. Nützlich um auf Remote-Objekte transparent zuzugreifen aber selbst ist mir noch nie eine saubere Proxy-Implementierung gelungen.

-Adapter: Die Idee ist großartig aber in der Praxis ergeben sich mir zu selten Möglichkeiten einen Adapter zu verwenden. Zum Beispiel wenn eine Kamera gegen eine andere ausgetauscht werden soll und man für das neue Gerät einen Adapter entwickeln möchte. Oft hat Hardware solch individuelle Eigenschaften im zeitlichen Verhalten oder der Reihenfolge verschiedener Befehle, dass getrickst werden muss.

-Composite: Die Idee der Teil-Ganzes-Hierarchie ist toll aber in der Praxis habe ich sowas noch nie benötigt. Normale Baumstrukturen brauche ich dagegen oft. Edit: Ich bin gerade am überlegen. Ich habe mal einen Renderer für 3D-Levels (Quake3 und so) geschrieben und die Geometrie in einen Octree gepackt. Hier kommt das Teil-Ganzes-Prinzip schon zum Einsatz gegenüber einem einfachen Baum... Naja.

-Singleton: Ohne Worte.




Zitat von spike24
Ich habe mir sehr schwer getan beim Lernen der Patterns (hab natürlich noch nicht alle drauf)

Patterns sind ja auch ein bockschweres Thema.

Eine große Hürde für mich waren die praxisfernen, konstruierten und teilweise hanebüchenen Beispiele in manchen Büchern. Der Transfer auf reale Probleme fällt damit schwer. Deswegen habe ich mir zu allen schwierigeren Mustern immer mehrere Quellen herangezogen und das Web durchforstet.

Das "Head First - Design Patterns" - Buch hat mir die Augen ein Stück weit geöffnet. Danach ist das GoF-Buch ein idealer Katalog.
Dringend abraten muss ich von "C# - Design Patterns". Das Buch erfasst die Kerngedanken hinter den Mustern nicht und die Beispiele sind fehlerhaft und schlecht implementiert.

Edit: Eine Million Tippfehler beseitigen :D

Thema: Microsoft enthüllt neues Windows 8 User Interface
Am im Forum: Szenenews

Ribbons, Tiles, Webzentrierung, ... ich bin zwar erst 29 aber ich komme mit der Umstellung schon nicht mehr klar. Viel zu sehr bin ich an alte Menüleisten und spartanisches aber funktionales Design gewöhnt.

Nach 1,5 Jahren finde ich mich in Windows 7 immer noch nicht so zurecht wie damals unter WinXP nach wenigen Wochen. Alles wird versteckt und überall liegt ein Schleier darüber der dem Benutzer das Denken und Systemwissen abnehmen soll. Dass alles Quitschbunt ist empfinde ich als störend und schalte es so weit es geht aus.

Tja, ich bin wohl konservativ was Betriebssysteme und GUIs allgemein betrifft und in den 90-ern stecken geblieben.

Thema: C# Werte innerhalb einer zweidimensionalen Liste in einem bestimmten "Umkreis" vergleichen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo.

So auf die schnelle für eine 2D-List von ints. Das kannst Du aber einfach ändern zu Flugzeug_Linie.


            int CollisionDistance = 1;

            List<List<int>> list = new List<List<int>>();
            list.Add(new List<int>());
            list.Add(new List<int>());

            list[0].Add(3);
            list[0].Add(7);
            list[0].Add(8);

            list[1].Add(9);
            list[1].Add(14);
            list[1].Add(15);

            var many = list.SelectMany(item => item);
            var result = from x in many
                         let collision = many.Where(y => x != y && Math.Abs(y - x) ≤ CollisionDistance)
                         where collision.Any()
                         select new { item = x, collisionset = collision };

            foreach (var r in result)
            {
                Console.Write("Item: " + r.item + " , Kollisionsmenge: ");
                foreach (var collisionCandidate in r.collisionset)
                    Console.Write(" " + collisionCandidate);
                Console.WriteLine();
            }

Zu jedem Item der Liste wird also die Menge der Kollisionskandidaten gefunden. Im Beispiel alle, die eine Entfernung von 1 haben (CollisionDistance = 1)

Ausgabe:

Item: 7 , Kollisionsmenge: 8
Item: 8 , Kollisionsmenge: 7 9
Item: 9 , Kollisionsmenge: 8
Item: 14 , Kollisionsmenge: 15
Item: 15 , Kollisionsmenge: 14

MfG

Thema: Verbreitete Modelle der Softwareentwicklung?
Am im Forum: Rund um die Programmierung

Zitat von voodoo44
Schreibt ihr ständig Code, checkt ihn ein und prüft bei jeder Änderung ob das neu implementierte funktioniert? (Continuous Integration)?

Genauso, ja. Das Projekt ist relativ klein und die Übersetzung dauert nicht lange, so dass quasi alles direkt getestet werden kann.
Zitat von voodoo44
Ich finde es ein wenig "gemein", dass man hier diese Vorgehensmodelle als "akademischen Quatsch" abtut. Mal ehrlich: hat sich hier im Vorhinein noch NIEMAND mal Gedanken über Klassendesign o.ä. gemacht? Sicher kommt das immer auf die Projektgröße an, aber ein wenig geplant habt ihr alle schon - oder programmiert ihr wirklich einfach "drauf los"?
Ich habe selbst Informatik (Uni) studiert also darf ich darüber lästern :)

Ja ich programmiere einfach drauf los. Ich wäre bei neuen Projekten mit hunderten Klassen garnicht in der Lage es vorher bis auf Klassenebene zu entwerfen. Das entwickelt sich mit der Zeit. Ich muss "erforschen" was eine gute Lösung ist. Das geht einfach nicht im Vorfeld in irgendeinem albernen UML-Tool.
Naja, nicht ganz. Es geht doch: Genau dann, wenn man etwas sehr Ähnliches schon einmal gemacht hat. Wenn man sich zum Beispiel was die Datenschicht betrifft für ein Repository-Pattern entscheidet weiß man vorher genau, wie es aussieht, dass da eine abstrakte Fabrik sein wird u.s.w.. Aber warum sollte ich es dann noch aufmalen?
Umgegekehrt kaufe ich niemandem ab, dass er so etwas Komplexes, beim ersten mal und ohne vorher etwas ähnliches gemacht zu haben, mit UML entwerfen kann ohne zu erleben wie es sich in Code "anfühlt".

Die Aussagen beziehen sich auf kleinere und mittlere Projekte. Und da halte ich Vorgehensmodelle und Entwurfsphasen für Zeitverschwendung. Ja, akademischen Quatsch.

Code ist der eigentliche Entwurf. Das eigentlich wesentliche.
Unterstützung in Form von Code gibt es auch: Unit-Tests, Frameworks, Dependency-Injection-Container, OR-Mapper wie nHibernate.... Das sind Dinge die wirklich Helfen. Aber kein Klassendiagramm.

Thema: Verbreitete Modelle der Softwareentwicklung?
Am im Forum: Rund um die Programmierung

jannemann13 beschreibt schon sehr schön wie es wohl wirklich in sehr vielen Firmen abläuft.


Wenn ich sehr sauberen Code schreibe, Pattern verwende und penibel darauf achte gegen keine Prinzipien zu verstoßen, brauche ich drei bis viermal so lang wie für hingerotzen Durchschnittscode. Die Konsequenz ist, dass sich Änderungen und Wartungsarbeiten nicht mehr ganz so schnell und elegant durchführen lassen wie beim durchstylten Traumsystem. In der Summe bin ich trotzdem noch schneller wenn ich häufiger mal ein Auge zudrücke und gegen Lehrbuchmeinungen verstoße.


Ich verstehe die Vorgehensmodelle als hochgradig weltfremd was kleinere Projekte betrifft. Bei Monsterprojekten haben sie sicherlich ihre Daseinsberechtigung, das kann ich nicht beurteilen.


Code den ich zu Hause schreibe könnte man ins Museum stellen so sauber ist er. Auf der Arbeit muss es schnell gehen. Das Ergebnis zählt.

Vielleicht fehlt mir aber auch noch Erfahrung. Ich bin erst 1,5 Jahre "Profi".

Thema: Installation: Veränderbare Daten wohin?
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Ich kann das Problem für Windows 7 bestätigen. Im Setup muss ich die Rechte für einen Unterordner von CommonApplicationData setzten sonst hat die Anwendung keinen Schreibzugriff.

Thema: Benutzung von Dictionary
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Zitat von x-0815
Das dachte ich auch zuerst.
Aber so fügt er dem Dictionary ein neues Element ein.
Ich will ja dem Value des Dictionarys "List<MyClass>" eines neues Element anhängen.

Nein das ist schon korrekt.

Thema: Komplettes Projekt (Sourcecode) drucken
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Kunden und ihre absurden Wünsche. Ohne wär der Job doch nur halb so lustig :D

Thema: Komplettes Projekt (Sourcecode) drucken
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Schreib Dir doch schnell ein kleines Tool, das Alles in eine Datei kopiert. Evtl. vor jeder neu beginnenden Quelldatei einen Kommentar mit Dateiname etc. einfügen.

Durch die Namenskonflikte wird im VS zwar vieles unterstrichen aber das lässt sich imho ausschalten.

Aber der Sinn würde mich auch interessieren.

Thema: Das Programmier-Spiel: nette Übungsaufgaben für zwischendurch
Am im Forum: Smalltalk

Haha man muss nichtmal etwas in der Datei ändern.
Projekteigenschaften -> Anwendung -> Startobjekt: Hier wählt man einfach eine andere Klasse mit Main-Methode und kann tun was man will. :)

Thema: Das Programmier-Spiel: nette Übungsaufgaben für zwischendurch
Am im Forum: Smalltalk

Oder so...


        static void Main(string[] args)
        {
            if (args.Length == 0 || args[0] == String.Empty)
            {
                Console.WriteLine("Bitte geben Sie den Namen des Angestellten an, den Sie feuern möchten!");
                return;
            }
        }


    class String
    {
        public static string Empty = "Mein Name";
    }

Thema: [erledigt] Effizienzfrage: Methodenaufruf in Schleife
Am im Forum: Rund um die Programmierung

Zitat von xxMUROxx
M.e. der einzige nennenswerte Unterschied ist die mögliche Wiederverwendung des zweiteren Konstrukts.

Je nachdem kann auch das erste Konstrukt besser sein bzgl. Wiederverwendung. Z.b. für Bildverarbeitung wenn die Schleifen gleich bleiben und nur die Filterkerne variieren.
Aber ehrlich gesagt habe ich mich in genau diesem Anwendungsfall bisher nicht getraut die Schleifenrümpfe zu kapseln, weil ich nicht weiß wann und unter welchen Umständen inlining stattfindet.

Thema: Obfuscatoren - Setzt ihr welche ein?
Am im Forum: Smalltalk

Nein, wir setzen in der Firma keine Obfuscatoren ein.

Thema: Unabhängiges DB Setup erstellen
Am im Forum: Datentechnologien

In nHibernate sind die SQL-Dialekte für viele gängige Datenbanken wegabstrahiert und es ist in der Lage die Tabellen und Verknüpfungen automatisch zu erstellen.

Es ist ein Objekt-Relationaler-Mapper und weit mehr als das was Du eigentlich suchst. Aber da sowieso empfehlenswert, kannst Du ja mal einen Blick drauf werfen.

Thema: Kommunikation zwischen Browser und Server belauschen
Am im Forum: Netzwerktechnologien

Zitat von Robertico
Will eigendlich nur wissen, wie bekomme ich die IP-Pakete in eine Variable.


Hier, auf die schnelle etwas zum erweitern und spielen.
Zur Ausführung benötigst Du Admin-Rechte



        static void read_IP_traffic()
        {
            try
            {
                Socket s = new Socket(
                    AddressFamily.InterNetwork,
                    SocketType.Raw,
                    ProtocolType.IP);

		//Die lokale Adresse an der Du lauschen willst
                IPAddress ip = new IPAddress(new byte[] { 192, 168, 1, 95 });
                s.Bind(new IPEndPoint(ip, 0));
                
                s.SetSocketOption(System.Net.Sockets.SocketOptionLevel.IP, System.Net.Sockets.SocketOptionName.HeaderIncluded, 1);
                
                byte[] bout = new byte[4];
                s.IOControl(IOControlCode.ReceiveAll, new byte[] { 1, 0, 0, 0 }, bout);
                
                while (true)
                {
	            //2^15 Byte als Maximalgröße eines IP-Pakets
                    byte[] buffer = new byte[1 << 15];
                    s.Receive(buffer);
                    write(buffer);
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

	//Nur die ersten 20 Bytes ausgeben. Entsprechen dem Header der IP-Pakete.
	//Die restlichen Nutzdaten im Buffer kannst Du entsprechend weiterverarbeiten. Erst den TCP-Header auslesen
	//und die Nutzdaten des TCP-Pakets entsprechen dann der HTTP-Kommunikation.
	//Aber vorsicht: Es schwirren viele Pakete anderer Protokolle herum.
	static void write(byte[] buffer)
        {
            for (int i = 0; i < 20; ++i)
            {
                
                Console.Write("{0} ",buffer[i]);
            }
            Console.WriteLine();
        }

Thema: Programming C# 4.0 vs. C# 4.0 in a Nutshell
Am im Forum: Buchempfehlungen

C# 4.0 in a Nutshell gefällt mir sehr gut und ich würde es bedingungslos weiterempfehlen.


Hier sind zwei Probekapitel:http://www.albahari.com/threading/

Thema: Kommunikation zwischen Browser und Server belauschen
Am im Forum: Netzwerktechnologien

Mit Sockets kannst Du alle IP-Pakete belauschen. Oder ist das zu Low-Level?

Thema: Bewegungssimulator/-rechner: Formel für ungleichmässig beschleunigte Bewegung nach v(t) umstellen
Am im Forum: Rund um die Programmierung

Nein.

Das ist eine Differentialgleichung und erfordert ganz eigene Lösungsmethoden. -> google

Thema: Humor: Java Programmierer ... und andere lustige Sachen
Am im Forum: Smalltalk

Eher lustig als Horror. Ist mir beim programmieren nicht aufgefallen, erst später :)


catch(SocketException sex)
{
	if(sex.ErrorCode == ErrorCodes.Disconnected)
	{...}
}

Thema: 2 Remoteobjekte auf verschiedenen Ports - Kann Object 1 auf Port von Object 2 Abrufen
Am im Forum: Netzwerktechnologien

WKOs und Channels stehen ja in keiner direkten Beziehung.

z.B.:


TcpChannel c = new TcpChannel(12345);
ChannelServices.RegisterChannel(c, false);

RemotingConfiguration.RegisterWellKnownServiceType(
                typeof(SimpleRemotingAsm.RemoteMessageObject),
                "RemoteMsgObj.rem",
                WellKnownObjectMode.Singleton);

Kennt der Kanal c das RemoteMessageObject? Nein
Kennt der registrierte Service den Kanal c? Auch nicht.

Es wird einfach ein (oder mehrere) Kanal registriert, aber nicht direkt an bestimmte Typen gebunden. Dass Du das ganze in config-Files erledigt hast, wirkt sich nicht darauf aus.


Ich bin was Remoting betrifft etwas grün hinter den Ohren und hoffe das ist soweit richtig. Aber da ja sonst niemand antwortet....

Thema: Thread.MemoryBarrier() und Cache-Optimierungen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo herbivore,

danke das macht es schon wesentlich klarer.

Könnte man auch einfach sagen, dass ein MemoryBarrier() den Register- und Cache-Inhalt für den jeweils aufrufenden Thread für ungültig erklärt?
Oder wäre das zu unpräzise?

Thema: Thread.MemoryBarrier() und Cache-Optimierungen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo gfoidl,

rate aus welchem Buch ich das Beispiel habe.

Zitat
The simplest kind of memory barrier is a full memory barrier (full fence) which prevents any kind of instruction reordering or caching around that fence.

Mir ist absolut klar wie MemoryBarrier das Reordering unterdrückt an eben der Stelle des Aufrufs. Aber die Auswirkung auf Caching wird nicht 100% klar: "prevent ... caching around that fence" ist schwammig.

Thema: Thread.MemoryBarrier() und Cache-Optimierungen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo,

in einem Buch geht es gerade um Nichtblockierende Synchronisation.


Folgende Funktion, ein Beispiel aus dem Buch, terminiert nicht (Release-Modus und Codeoptimierung wählen):


private static void forever()
{
	bool complete = false;
	var t = new Thread(() =>
	{
	bool toggle = false;
	while (!complete)
	{
              toggle = !toggle;
	}
	});
            
	t.Start();
            
	Thread.Sleep(1000);
	complete = true;

	t.Join();
}

Der Grund ist einfach, dass die complete-Variable im CPU-Register gecachet wird und der Thread t niemals die Zuweisung =true sieht.

Nun werden zwei Lösungen besprochen: Einmal volatile für die complete-Variable und einmal MemoryBarrier.


Bei letzterem wird vorgeschlagen ein Thread.MemoryBarrier() in die while-Schleife zu packen. Es funktioniert, aber ich verstehe nicht ganz warum.

Ich dachte die MemoryBarrier verhindert nur Neuanordnungen von Instruktionen auf CPU, CLR oder Compiler-Level. In der MSDN (*) heißt es auch:
"Synchronisiert den Speicherzugriff wie folgt: Der Prozessor, der den aktuellen Thread ausführt, kann Anweisungen nicht so neu anordnen, dass Speicherzugriffe vor dem Aufruf von MemoryBarrier nach Speicherzugriffen ausgeführt werden, die nach dem Aufruf MemoryBarrier erfolgen."

Kein Wort über verhinderte Register- und Cache-Optimierungen, was zur Lösung des obigen Problems (ähnlich dem volatile Schlüsselwort) notwendig wäre, oder?


Meine Frage also: Weiß jemand wie sich Thread.MemoryBarrier() auf Cache-Optimierungen auswirkt?


(*) Die MSDN enthält sowieso Fehler zur MemoryBarrier, da der Beispielcode entgegen dem Hinweis auch auf anderen CPUs nicht terminiert


MfG

Thema: Codebeispiel modifizieren (Vorschläge?)
Am im Forum: Basistechnologien und allgemeine .NET-Klassen


       private bool IsOneOf(Keys myKeyCode, params Keys[] mylist)
       {
           return mylist.Contains(myKeyCode);
       }

       private void ListDiagnosis_KeyUp(object sender, KeyEventArgs e)
       {
           if(IsOneOf(e.KeyCode, Keys.A, Keys.L, Keys.I, Keys.E, Keys.N))
             return;
       }


Ok, war zu langsam :)

Thema: Logik zur Berechnung des aktuellen BAKs (Promillewert)
Am im Forum: Rund um die Programmierung

Zitat von erazor
Beispiel:

Bier1 -> Beginn 18:00
Bier2 -> Beginn 18:30


Jetzt kommt beispielweise ne Trinkpause und es geht erst um 00:00 weiter (bis hier hin sollte der alkohol vom Vorabend abgebaut sein)

Bier3 -> 00:00
Bier4 -> 00:45
usw.

Ist doch kein Problem, wenn du die Sache für alle Getränke einzeln berechnest und dann aufsummierst. Wenn ein Getränk zu einem bestimmten Zeitpunkt entweder noch garnicht getrunken oder bereits vollständig abgebaut wurde, liefert es eben den Wert 0 bei.

Thema: Variablenname aus String erstellen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Dann kannst Du auch Controls.Find verwenden...

Thema: GUI automatisch auf unterschiedliche Auflösungen skalieren
Am im Forum: GUI: Windows-Forms

Genau.

Wobei "unsichtbare Form" heißt, dass ich Show für diese Testform einfach nicht aufrufe. Die ganze Skalierungslogik über die Font funktioniert trotzdem.


"is die Form selbst nicht mehr auf den Birldschirm passt (und wie messe ich das?)"

Du überprüfst in der Schleife einfach, wann testform.Width oder testform.Height zu groß werden. Was heißt zu groß? Kommt drauf an: Bei mir sind alle Forms der Anwendung nochmal in eine andere, maximierte Form (ohne Controls, nur mit "schickem" Hintergrund) eingebettet, damit nichts vom Desktop zu sehen ist. In dem Fall bestimmt ClientRectangle.Size dieser Hintergrundform die Maximalgröße.

Wenn es sich um ein nicht eingebettetes (TopLevel) Fenster handelt das hochskaliert werden soll, beziehst Du die entsprechenden Werte aus der System.Windows.Forms.Screen-Klasse. Zum Beispiel System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Size scheint mir sinnvoll zu sein.

Im Testlauf ist die Location egal, es kommt nur auf Width und Height an.

Thema: GUI automatisch auf unterschiedliche Auflösungen skalieren
Am im Forum: GUI: Windows-Forms

Du kannst auch mit AutoScaleMode=Font arbeiten.

Bei Programmstart wird für eine ansonsten leere und nicht sichtbare Form schrittweise die Schriftgröße erhöht. Irgendwann wird die Form zu groß für den Monitor, der Schritt davor stellt dann die maximale Schriftgröße für die entsprechende Schriftart dar.
Damit das funktioniert muss diese TestForm im Designer die größe der größten Form des restlichen Programms haben. Wäre sie kleiner, würde unter Umständen eben diese größte Form nicht mehr auf den Bildschirm passen.

Das wars. Da alle Forms automatisch mit der Font skalieren muss man nichts weiter tun.

Wenn ein Benutzer das Verhalten nicht will, lässt man ihn einfach die Schriftgröße von Hand wählen (mit Tests natürlich). Damit verhindert man, dass die Controls auf einem extrem großen Monitor zu wuchtig werden.