![]() |
[C#] Fragen zu automatisch generiertem Code
Also, ich habe mir gerade den C# Builder von Borland installiert. Bei einem leeren Projekt generiert die IDE folgendes:
Code:
Klar, entspricht dem gewohntem uses nur dass eben die Namespaces bekannt gegeben werden, die benutzt werden sollen.
using System;
using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; Dann:
Code:
Fdas ist die Klasse meines Formulares, entspricht TForm. So jetzt fängt es aber schon an. Diese public WinForm() { ... } ist ja eine Methode, was hat di in der Klasse-Definintion zu suchen. Ist das was C++ typisches?
public class WinForm : System.Windows.Forms.Form
{ /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.Container components = null; private System.Windows.Forms.Button btnClose; private System.Windows.Forms.Button btnAbout; private System.Windows.Forms.Label lblBanner; public WinForm() { // // Required for Windows Form Designer support // InitializeComponent(); // // TODO: Add any constructor code after InitializeComponent call // } /// <summary> /// Clean up any resources being used. /// </summary> protected override void Dispose (bool disposing) { if (disposing) { if (components != null) { components.Dispose(); } } base.Dispose(disposing); } Ebendso verhält es sich mit protected override void Dispose (bool disposing) { ... }. Aber hier stellt sich mir die Frage: Was macht diese Funktion? Wozu ist sie gut? Dann kommt noch
Code:
Das ist auch klar, das sind die abweichenden Einstellungen von den standard Einstellungen die man im OI eingestellt hat.
#region Windows Form Designer generated code
... ... ... #endregion So, wenn mir da doch bitte jemand meine Fragen beantworten könnte und eventuell falsches richtig stellt oder unvollständiges ergänzt, wäre ich dankbar dafür. [edit=fkerber]Neu gespeichert wg. Code-Highlighting. Mfg, fkerber[/edit] |
Re: [C#] Fragen zu automatisch generiertem Code
Hi,
in C# befinden sich alle Methoden innerhalb der Klassendefinition. Das hat die Sprache so an sich. ;) Und die Methode WinForm ist ein Konstruktor - wie bei C++. Dispose ist da wohl der Destruktor wenn ich die bisherigen Versuche mit C# richtig deute. ;) Chris |
Re: [C#] Fragen zu automatisch generiertem Code
Zitat:
Zitat:
|
Re: [C#] Fragen zu automatisch generiertem Code
Zitat:
|
Re: [C#] Fragen zu automatisch generiertem Code
Na so, wie man es eben kennt:
Code:
class Temperatur {
public int Foo(void) } int Temperatur::Foo(void) { TuWas; } |
Re: [C#] Fragen zu automatisch generiertem Code
Ah, wusste nicht, dass das auch geht. OK, meine C#-Kenntnisse sind auch nicht gerade erwähnenswert...
|
Re: [C#] Fragen zu automatisch generiertem Code
Also laut meinem Schulwissen stimmt das mit dem Konstruktor. In den meisten C-verwandten Sprachen handelt es sich bei einer Methode die genauso heißt wie die Klasse der sie angehört tatsächlich um den Konstruktor.
Naja, und dass es bei ner WinForm etwas komplizierter aussieht scheint ja ein bisl logisch. Ist bei einem Win32API-Code für ein Formular -aus meiner Sicht- ja genau das gleiche ;-) Bis dann, S - tefano |
Re: [C#] Fragen zu automatisch generiertem Code
Also es ist definitiv der Constructor :)
Und in C# ist es eigentlich gang und gebe, die Methoden direkt in der Klasse zu implementieren. Eine Klassendefinition vorher zu machen erscheint den meisten die aus dem C-Lager kommen zu viel Tipparbeit zu sein. C# ist nunmal keine Sprache, die man hinterher sauber lesen kann. |
Re: [C#] Fragen zu automatisch generiertem Code
Zitat:
Zudem ne Frage. Was soll public int Foo(void) für ne Konstruktion sein? Soll das bedeuten das Foo keine Parameter übergeben werden? Wenn ja dann wird das ohne das Void geschrieben. |
Re: [C#] Fragen zu automatisch generiertem Code
Zitat:
Code:
Hier liegen eindeutig Methoden von WinForm in einem namespace, nämlich dem von Project1.
namespace Project1
{ const String APPNAME = "Hello"; const String VER = "1.0"; const String INFO_TEXT = APPNAME + " " + VER+"\nCopyright (c) 2004 Michael Puff\n\nhttp://www.luckie-online.de"; /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.Run(new WinForm()); } private void btnClose_Click(object sender, System.EventArgs e) { Application.Exit(); } private void WinForm_Load(object sender, System.EventArgs e) { this.Text = APPNAME; lblBanner.Text = APPNAME; } private void btnAbout_Click(object sender, System.EventArgs e) { MessageBox.Show(INFO_TEXT, APPNAME, MessageBoxButtons.OK, MessageBoxIcon.Information); } } } Zitat:
[edit=fkerber]Neu gespeichert wg. Code-Highlighting. Mfg, fkerber[/edit] |
Re: [C#] Fragen zu automatisch generiertem Code
Zitat:
Code:
public class Form1 : System.Windows.Forms.Form
{ Zitat:
|
Re: [C#] Fragen zu automatisch generiertem Code
Zitat:
Dispose ist generell die einzige Methode der IDisposable-Schnittstelle. Sie dient dazu, dem Benutzer die Möglichkeit der deterministischen Zerstörung von Objekten zu geben, die .net ansonsten nicht anbietet. Sie wird meist verwendet, um nicht gemanagete Ressourcen freizugeben. Im .net SDK zu finden unter "Cleaning Up Unmanaged Resources". In diesem besonderen Fall handelt es sich aber um eine Methode, die bereits in Component definiert wird. Wie im Code zu sehen, ruft sie auch die Dispose-Methoden aller Unterkomponenten auf. Mehr dazu unter Component.Dispose im .net SDK. Zitat:
Zitat:
Zitat:
Noch etwas generelles: In C# gibt es nichts "under the hood", also Code, der automatisch vom Compiler erzeugt wird wie in Delphi. Der gesamte Verwaltungscode ist mit drin. Deshalb wurden für C# 2.0 auch partial classes eingeführt, die man also innerhalb mehrerer Dateien definieren kann. Die Designer legen hierzu eine eigene Datei für den gesamten generierten Code an. [Nachtrag] Zitat:
|
Re: [C#] Fragen zu automatisch generiertem Code
Zitat:
[edit=fkerber]Neu gespeichert wg. Code-Highlighting. Mfg, fkerber[/edit] |
Re: [C#] Fragen zu automatisch generiertem Code
Code:
Da fehlt ja wohl 'ne Klammer auf. Ich garantiere dir, dass dieser Code nicht kompiliert. Namespaces können keine Funktionen beinhalten.
namespace Project1
{ const String APPNAME = "Hello"; const String VER = "1.0"; const String INFO_TEXT = APPNAME + " " + VER+"\nCopyright (c) 2004 Michael Puff\n\nhttp://www.luckie-online.de"; ... private void btnAbout_Click(object sender, System.EventArgs e) { MessageBox.Show(INFO_TEXT, APPNAME, MessageBoxButtons.OK, MessageBoxIcon.Information); } } } Nachtrag: Noch ein Tipp - der C# Builder bringt doch ein kurzer C#-Tutorial mit. Darin wird eigentlich alles geklärt ;c) |
Re: [C#] Fragen zu automatisch generiertem Code
OK, hier der gesamte Code:
Code:
Wie man sieht gehört die letzte schließende Klammer zu ersten öffnenden Klammer. Und somit liegen die Methoden von WinForm eindeutig im Namespace von Project1.
namespace Project1
{ /// <summary> /// Summary description for WinForm. /// </summary> public class WinForm : System.Windows.Forms.Form { /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.Container components = null; private System.Windows.Forms.Button btnClose; private System.Windows.Forms.Button btnAbout; private System.Windows.Forms.Label lblBanner; public WinForm() { // // Required for Windows Form Designer support // InitializeComponent(); // // TODO: Add any constructor code after InitializeComponent call // } /// <summary> /// Clean up any resources being used. /// </summary> protected override void Dispose (bool disposing) { if (disposing) { if (components != null) { components.Dispose(); } } base.Dispose(disposing); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.btnClose = new System.Windows.Forms.Button(); this.lblBanner = new System.Windows.Forms.Label(); this.btnAbout = new System.Windows.Forms.Button(); this.SuspendLayout(); // // btnClose // this.btnClose.Location = new System.Drawing.Point(208, 144); this.btnClose.Name = "btnClose"; this.btnClose.TabIndex = 0; this.btnClose.Text = "&Schließen"; this.btnClose.Click += new System.EventHandler(this.btnClose_Click); // // lblBanner // this.lblBanner.BackColor = System.Drawing.Color.White; this.lblBanner.Font = new System.Drawing.Font("Microsoft Sans Serif", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.lblBanner.Location = new System.Drawing.Point(0, 0); this.lblBanner.Name = "lblBanner"; this.lblBanner.Size = new System.Drawing.Size(296, 72); this.lblBanner.TabIndex = 2; this.lblBanner.Text = "lblBanner"; this.lblBanner.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; // // btnAbout // this.btnAbout.Location = new System.Drawing.Point(232, 8); this.btnAbout.Name = "btnAbout"; this.btnAbout.Size = new System.Drawing.Size(48, 23); this.btnAbout.TabIndex = 3; this.btnAbout.Text = "&Info"; this.btnAbout.Click += new System.EventHandler(this.btnAbout_Click); // // WinForm // this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(292, 175); this.Controls.Add(this.btnAbout); this.Controls.Add(this.lblBanner); this.Controls.Add(this.btnClose); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; this.MaximizeBox = false; this.Name = "WinForm"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "Foo"; this.Load += new System.EventHandler(this.WinForm_Load); this.ResumeLayout(false); } #endregion const String APPNAME = "Hello"; const String VER = "1.0"; const String INFO_TEXT = APPNAME + " " + VER+"\nCopyright (c) 2004 Michael Puff\n\nhttp://www.luckie-online.de"; /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.Run(new WinForm()); } private void btnClose_Click(object sender, System.EventArgs e) { Application.Exit(); } private void WinForm_Load(object sender, System.EventArgs e) { this.Text = APPNAME; lblBanner.Text = APPNAME; } private void btnAbout_Click(object sender, System.EventArgs e) { MessageBox.Show(INFO_TEXT, APPNAME, MessageBoxButtons.OK, MessageBoxIcon.Information); } } } [edit=fkerber]Neu gespeichert wg. Code-Highlighting. Mfg, fkerber[/edit] |
Re: [C#] Fragen zu automatisch generiertem Code
Da liegt alles im Namespace Project1. Aber viel wichtiger ist, dass alles innerhalb der Klassendeklaration passiert.
|
Re: [C#] Fragen zu automatisch generiertem Code
Ich sag's mal so:
Natürlich ist alles im Namespace. In .net kann nichts außerhalb des Namespace existieren. Aber DIREKT im Namespace können nur Typen definiert werden (class, enum, struct). Nur strukturierte Typen können auch Methoden enthalten. Das gilt für ALLE, selbst für aus Windows-DLLs importierte Funktionen. Es gibt keine Funktionen in .net, nur Methoden. Objektorientiert halt. |
Re: [C#] Fragen zu automatisch generiertem Code
@Luckie: Wieso denn? Nur die Klasse Winform liegt innerhalb des Namespaces. Die Methoden liegen alle innerhalb der Klasse
Code:
namespace Project1
{ /// <summary> /// Summary description for WinForm. /// </summary> public class WinForm : System.Windows.Forms.Form { /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.Container components = null; private System.Windows.Forms.Button btnClose; private System.Windows.Forms.Button btnAbout; private System.Windows.Forms.Label lblBanner; private void btnAbout_Click(object sender, System.EventArgs e) { MessageBox.Show(INFO_TEXT, APPNAME, MessageBoxButtons.OK, MessageBoxIcon.Information); } } } |
Re: [C#] Fragen zu automatisch generiertem Code
Der Punkt ist, die Methoden befinden sich in der Klasse, die sich wiederum im Namespace befindet. Somit befindet sich INDIREKT die Methode auch im Namespace. DIREKT im Namespace liegt hingegen nur die Klasse.
Nachtrag: Ich sehe jetzt erst das "@Luckie", sorry ;c) |
Re: [C#] Fragen zu automatisch generiertem Code
@OG: Ja so wird ein Schuh draus, also mit dem DIREKT und INDIREKT. ;)
|
Re: [C#] Fragen zu automatisch generiertem Code
Zitat:
Absolut Falsch ! Du befindest dich mit Csharp in absoluter OOP, hier befindet sich alles in einer Klasse! Zitat:
Zitat:
Gruß Torsten |
Re: [C#] Fragen zu automatisch generiertem Code
Zitat:
Also man kann es so machen (Strings mit + verbinden) jedoch passiert dann das, was sharkx gesagt hat. Man sollte die StringBuilder-Klasse dazu verwenden Zitat:
|
Re: [C#] Fragen zu automatisch generiertem Code
Hallo !
Entschuldige Generalissimo, mir wird diesere Fehler nicht mehr unterlaufen ;)
Code:
StringBuilder sb = new StringBuilder();
sb.Append("Dein Text"); Gruß Torsten |
Re: [C#] Fragen zu automatisch generiertem Code
Nur um das nochmal klarzustellen:
Es gibt in C# keine Destruktoren wie in z.B. C++ oder Delphi. Destruktoren werden für die deterministische Zerstörung von Objekten eingesetzt und sind in .net sowie in C# so NICHT vorhanden. Das, was man in C# als Destruktoren bezeichnet und was auch aussieht wie ein C++-Destruktor, ist in Wirklichkeit ein Finalizer! Es hat dieselbe Semantik wie die Finalizer der anderen .net Sprachen. Hierbei sollen die Objekte auch zerstört werden, aber der Vorgang ist nicht deterministisch! Genauer ist ein so genannter Destruktor in C# also nur eine bequeme Methode, die Object.Finalize()-Methode zu überschreiben und dabei implizit (was man sonst von Hand machen müsste) base.Finalize() aufzurufen. Managed C++ hingegen unterstützt zusätzlich einen deterministischen Destruktor, der aber vom Compiler erzeugt wird und keine CLR-Unterstützung genießt. Zitat:
Zitat:
Ein wesentlicher Unterschied ist: Bei einem herkömmlichen Destruktor sind alle Referenzen in der Klasse noch gültig, denn Kindobjekte werden erst später freigegeben. Bei einem Finalizer sind die Kindobjekte aber möglicherweise schon zerstört worden, soweit sie gemanaged sind. Darüberhinaus ist es anders als z.B. in C++, wo jede Klasse einen Destruktor hat (gegebenenfalls vom Compiler generiert), in .net eine aufwändige Sache, einen Finalizer auszuführen und somit generell zu vermeiden. Edit: Zitat:
|
Re: [C#] Fragen zu automatisch generiertem Code
Nochmals zum Thema Destruktor:
Microsoft empfiehlt in seinen Dokumenten, eine entsprechende Methode (z.b. mit dem Namen Dispose()) zu erstellen, welche die aufräumarbeiten unabhängig vom Destruktor bei Bedarf durchführt. Einen Destruktor in C# erstellt man, in dem man eine Methode mit dem Namen der Klasse, aber einem vorangstellten ~ erzeugt. Aufgrund der Automatischen Speicherverwaltung ist aber nicht sicher, wann der Destruktor aufgerufen wird, da der Speichermanager der .NET-Umgebung dies Eigenständig entscheidet. Gruß Torsten |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz