Autor Beitrag
Thomas450
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Mi 10.02.10 14:20 
Hallo,

ich bin C# Anfänger und hätte ne Frage.

Wie und wo muss ich eine Klasse instantiieren wenn ich auf Felder und Methoden der Instanz von verschiedenen Programmteilen aus zugreifen möchte?

ausblenden Klasse trace
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
  public class trace
  {
    string filename;

    public trace(string filename)
    {
      this.filename = filename;
    }

    ~trace()
    {
      
    }

    public void trace_diag(string titel, string text)
    {
      // Meldung in File oder Datenbank schreiben
    }


ausblenden Windows Form
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
  public partial class HAUPTFENSTER : Form
  {
    static trace tc;

    private void lesen()
    {
      tc.trace_diag("Titel""Text");
    }

    public HAUPTFENSTER()
    {
      InitializeComponent();
      var tc = new trace("TEST.TRC");
    }
  }


Wenn ich im Beispiel oben die Methode tc.trace_diag aufrufe bekomme ich eine Ausnahme, da tc NULL enthält.

Ich möchte auf tc.trace_diag auch noch aus anderen Formen zugreifen.
Vielleicht kann mir jemand weiterhelfen.

Gruß Thomas

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Mi 10.02.10 14:32 
Hallo,

diese und viele grundlegende Fragen werden im OpenBook C# erläutert. Allgemein gelten die objektorientierten Ansätze.

Über die Sichtbarkeit entscheiden nicht "nur" wo du die Variablen deklarierst, sondern noch mit welchen Modifier/Sichtbarkeit du sie ausstattest.

Bei deinem Beispiel hast du die Klasse trace (eigentlich Klassen, Methoden und Member groß) public gesetzt. Dem Klassenmember filename hast du keinen modifier angegeben und ist deshalb privat. Privat bedeutet ausschließlich die Klases (in diesem Fall trace) können den Member sehen und verändern. Das gleiche gilt für Methoden. Die trace Methode hast du als public deklariert. Sprich andere Klassen können, wenn sie ein Instanz auf das trace objekt haben, diese Methode ansprechend. Allerdings hast du den Rückgabe-Wert vergessen ,so dass dieser Code nicht kompiliert werden würde.

Nochmal zusammenfassend:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
<sichtbarkeit> class <name>
{
 <sichtbarkeit> <typ> <classmember_name>;
 
 <sichtbarkeit> <rueckgabewert> <function_name>(<ParameterType> <parameterName>, ..)
 {
  <typ> <methodenvariable>
 }
}


Anmerkung:Methodenvariablen sind nur in der entsprechenden Methode vorhanden.

Ich hoffe das hilf - aber unbedingt das C#-Buch oder andere objektorientierte Programmierbücher anschauen.

Gruß Daniel
bakachan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 503
Erhaltene Danke: 34

W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
BeitragVerfasst: Mi 10.02.10 14:40 
user profile iconThomas450 hat folgendes geschrieben Zum zitierten Posting springen:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
    public HAUPTFENSTER()
    {
      InitializeComponent();
      tc = new trace("TEST.TRC");
    }


Du solltest nicht identische Variablennamen für unterschiedliche Variablen verwenden.
Du hattest die static tc nicht initiallisiert sondern eine funktionsinterne tc-Variable.
Thomas450 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Mi 10.02.10 15:30 
Hallo Daniel,
hallo Michael,

vielen Dank für die schnellen Antworten.

Das mit der Sichtbarkeit der Klassen, Member und Methoden ist mir schon einigermaßen klar.
Ich hab mich mal durch die HTML-Dateien "Programmieren in CSharp - Einfuehrung" gelesen.

Mein Problem liegt bei der Verwendung der Klasse bzw. der Instanz davon. Wie kann ich z.B die public deklarierte Methode trace_diag(... in verschiedenen Funktionen, welche sich auch in verschiedenen Formen befinden können verwenden?
Wohin muss die Deklaration stattfinden?

Daniel:
Benötige ich für trace_diag einen Rückgabe-Wert, wenn bei der Deklaration void angegeben ist?


Gruß Thomas
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Mi 10.02.10 15:58 
Entweder hast du deinen Beitrag editiert oder die Formatierung hat mich komplett durcheinander gebracht - bitte meinen ersten Beitrag einfach ignorieren ;)

Wenn du ein Objekt (dein Logger) in verschiedenen Klassen verwenden willst, musst du diesen die Referenz/das Objekt übergeben.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
Blub a = new Blub();
Blah b = new Blah();
Logger l= new Logger();

a.Logger = l;
b.Logger = l;


So ist beiden Klassen die das gleiche Objekt bekannt. Soviel zur allgemeinen Vorgehensweise.

Wenn du in einer Anwendung Loggen/Tracen willst, gibt es dafür elegantere Lösungen, wie zum Beispiel vom .NET Framework (System.Diagnostics.Trace oder Debug) und vor Allem Log4Net.

Die letztendliche Verwendung ist Abhängig von der Projektgröße.

Gruß Daniel
Thomas450 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Mi 10.02.10 22:09 
Sorry,
bin beim editieren versehentlich auf Absenden gekommen. Der Beitrag war noch nicht fertig.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
Blub a = new Blub();
Blah b = new Blah();
Logger l= new Logger();

a.Logger = l;
b.Logger = l;


So richtig verstehe ich das Beispiel nicht.
Die Methode oder Member ".Logger" ist doch nicht in den Klassen "Blub" oder "Blah" deklariert.
In welchem Programmteil deklariere ich den Logger. Ich hab die Klasse Main und verschiedene Formen.
Innerhalb der Formen möchte ich darauf zugreifen.

Gruß Thomas
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Do 11.02.10 10:13 
Hallo,

bei Daniels Beispiel ist Logger auch eine Eigenschaft der beiden Klassen Blub und Blah, ähnlich wie du es mit static trace in deinem Formular gedacht hattest. Daniel weist dieser Eigenschaft jeweils eine (dieselbe) Instanz der Logger-Klasse zu.

Aber er hat ausdrücklich auf die fertigen und besseren Lösungen von System.Diagnostics.Trace und Log4Net hingewiesen.

Gruß Jürgen
Thomas450 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Do 11.02.10 11:27 
Danke für die Informationen.
Könnte mir noch jemand sagen, in welchen Programmteil ich den Logger instantiieren soll.
Hab das Problem nicht nur mit dem Logger/Tracer, sondern auch mit anderen Klassen.

In den Tutorials bzw. auf Seite welche die Programmiersprache beschreiben, wird selten auf die Struktur von Projekten eingegangen. Hab mir auch schon mal größere Programme geladen um zu deren Struktur an-/ab-zuschauen. Hab aber leider noch nicht den roten Faden gefunden.

Kennt vielleicht jemand Beispielprogramme "for beginners" die ich mir anschauen sollte.


Gruß Thomas
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Do 11.02.10 12:43 
Hallo Thomas,
user profile iconThomas450 hat folgendes geschrieben Zum zitierten Posting springen:
Könnte mir noch jemand sagen, in welchen Programmteil ich den Logger instantiieren soll.
Hab das Problem nicht nur mit dem Logger/Tracer, sondern auch mit anderen Klassen.

Ein Logger wird sinnvollerweise in der Program-Klasse erstellt, denn er wird im Zweifelsfall auch dort schon benötigt.

Für andere Objekte kann man das nicht so pauschal sagen. Es ist z.B. denkbar, dass ein Objekt im Hauptformular erstellt wird und diese Referenz an abhängige Formulare übergeben wird.

Es kommt immer darauf an... Jürgen
Thomas450 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Fr 12.02.10 11:31 
Hallo,

vielen Danke für die Unterstützung. Der Tipp vom Jürgen war hat mir weiter geholfen. Hab den Logger bisher immer an der falschen Stelle in der Programmklasse erstellt. Da hat dann der Compiler gemeckert.


Gruß Thomas