Entwickler-Ecke

C# - Die Sprache - Funktion in externe Datei legen, aber wie?


Sharpy78 - Do 13.12.07 20:42
Titel: Funktion in externe Datei legen, aber wie?
Hallo,

ich würde gerne um mein Programm übersichtlicher zu gestallten einige mittlerweile große Blöck in externe Dateien verlegen.

Dazu habe ich mir eine neue Datei erzeugt "Add Item" und dann "Code file".

Die Tools.cs Datei sehe ich nun doch wie kann ich hier nun meine Funktionen hinterlegen?

Kann mir jemand ein Beispiel aufzeigen wie das geht?

MfG Frank


Christian S. - Do 13.12.07 20:50

Hallo!

Nur Funktionen kannst Du in C# ja nicht auslagern, Du musst sie in eine Klasse packen.

Das heisst, entweder legst Du in der neuen Datei eine ganz neue Klasse an und fügst die Funktionen dort ein. Oder aber Du machst eine bestehende Klasse zu einer partiellen Klasse (Stichwort in der Hilfe: partial class) und lagerst einen Teil in Deine neue Datei aus.

Grüße
Christian

P.S.: Mit "Add Item" -> "Class" kannst Du schneller eine Datei mit einer Klasse anlegen. Wähle den Dateinamen dabei so, wie die Klasse heißen soll.


Chryzler - Do 13.12.07 20:52

Ganz normal, wie du sonst auch Code schreibst. Nur musst du eventuell die using-Anweisungen neu angeben und noch den Namespace/Klasse. Wenn du eine neue Klasse in der neuen Datei erstellen möchtest, kannst du auch gleich "Add Item" und dann "Class" auswählen, dann erstellt dir Visual Studio das Grundgerüst von selbst.


Sharpy78 - Do 13.12.07 21:45

Hallo,

super! Danke!

Das habe ich soweit also es in einer Class gepackt, sieht auch gut aus.
Wie greift man da nun drauf zu. *duck* aber wenn ich es erst einmal kappiert hab bin ich ruhig. ;-)

Die Klasse habe ich den Namen "Tools" gegeben, "MyHelloWorld" heist mein Projekt...

Die Class Datei sieht so aus...


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MyHelloWorld
{
    class Tools
    {
        public struct TestRmc
        {
            public Boolean Ok;
            public String RawData;
            public DateTime Time;
        }
    }
}



Using Tools;

Klappt nicht, das geht wohl anders?!


MfG Frank


Christian S. - Do 13.12.07 22:08

Hallo!

Wenn der Namespace überall in Deinem Projekt gleich ist, kannst Du auf die Klasse einfach wie auf jede andere Klasse zugreifen und musst nix in die using-Direktiven schreiben (bist ja schon im richtigen Namespace).

Könntest also sowas machen:

C#-Quelltext
1:
2:
Tools.TestRmc myTest;
myTest.RawData = "foobar";


Grüße
Christian


Sharpy78 - Do 13.12.07 22:27

Ok dank Dir! ;)

Nun wenn ich es richtig sehe ist die Klasse an "MyHelloWorld" gebunden?
Oder ist das Blödsinn und ich kann auch aus jedem anderen beliebigen Projekt auf meine extern lagerden Typen und Funktionen zugreifen oder geht das wieder etwas anders?

Ich möchte mir halt eine Datei basteln wo alles das reinkommt was ich immer mal wieder gebrauchen kann.

MfG Frank


Christian S. - Do 13.12.07 22:58

Nein, ist nicht gebunden. In anderen Projekten musst Du halt über "using" den Namespace "MyHelloWorld" einbinden und eine Referenz auf Dein Projekt setzen. Dann würde ich es allerdings "richtig" auslagern und ein eigenes Projekt, nämlich eine Bibliothek draus machen.


Kha - Do 13.12.07 23:22

Damit kein falscher Eindruck entsteht: ein struct ist ein normaler Typ, für den brauchst du keine Klasse außenrum, sondern kannst ihn direkt in den Namespace-Block schreiben. Diese Nested-Type-Syntax Tools.TestRmc ist bei C#-Entwicklern nicht gerade beliebt, wohl einfach zu lang ;) .
Deshalb sollten Nested Types nur innerhalb der umgebenden Klasse verwendet werden, ein sinnvolles Beispiel dafür ist die List<T>.Enumerator-Klasse: Da wohl niemand direkt diese Klasse referenzieren/instanzieren wird, braucht man nie den umständlichen Namen, als Nested Class hat Enumerator aber den Vorteil, auf nicht-öffentliche Member wie List<T>._version zugreifen zu können.