Autor Beitrag
Morjo
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mo 01.12.08 01:44 
Hallo zusammen,

ich kämpfe gerade in einer simplen Visual-C#-Anwendung mit einem mir nicht nachvollziehbarem Fehler:

Zitat:
Keine Überladung für die FileHandler-Methode nimmt 1 Argumente an.


Hier der Code:
Main-Methode in der Program.cs:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
        static void Main(String[] args)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1(args));
        }


Entsprechende Main-Methode in Form1.cs:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
        public Form1(String[] args)
        {
            InitializeComponent();

            // args
            if (args.Length == 0)
            {
                // no file to read...
            }
            else
            {
                // setting filename
                String filename = args[0];
                String file = new FileHandler(filename);
            }
        }


Entsprechende Main-Methode in FileHandler.cs:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
        public String Main(String filename) {
            FileStream fs = new FileStream(@filename, FileMode.Open);
            StreamReader sr = new StreamReader(fs);

            String s = sr.ReadToEnd();

            sr.Close();
            fs.Close();

            return s;
        }


Der Fehler erscheint in der Regel nur, wenn die Anzahl der Argumente beim Aufruf der Methode nicht mit der Anzahl der benötigten Argumente überein stimmt. Beim Aufruf von FileHandler wird ein Argument (String filename) übergeben. Der Construktor benötigt aber auch nur ein Argument (ebenfalls String filename).

Woran liegt es, dass hier ein Fehler ausgegeben wird? Leider habe ich bisher keinen Grund finden können...

Ich würde mich über Eure Hilfe sehr freuen!

Danke & Viele Grüße
Morjo
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 01.12.08 01:53 
Hallo und :welcome:!

Die Main-Methode des FileHandler nützt hier wahrscheinlich wenig, weil die (zumindest in den geposteten Quelltexten) nie aufgerufen wird. Die Main-Methode ist nicht der Konstruktor!

Grüße
Christian

//edit: Was Du postest sieht aus wie ein Compiler-Fehler und keine Exception, sollte also zur Compile-Zeit und damit unabhängig von den übergebenen Argumenten erscheinen?

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
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: Mo 01.12.08 10:46 
Hallo und ebenfalls :welcome:

Ergänzend zu Christians Antwort habe ich noch folgende Hinweise:

SDK-Doku/MSDN hat folgendes geschrieben:
Main() und Befehlszeilenargumente
  • Die Main-Methode ist der Einstiegspunkt des Programms, an dem Objekte erstellt und andere Methoden aufgerufen werden.
  • Es kann nur einen Einstiegspunkt in einem C#-Programm geben.
  • Sie wird innerhalb einer Klasse oder Struktur deklariert. Sie muss statisch sein und sollte nicht öffentlich sein. (Im Beispiel oben erhält sie den Standardzugriff und ist somit als privat deklariert.)
  • Sie kann entweder den Rückgabetyp void oder int haben.

Deine Main-Methode in FileHandler.cs steht in Widerspruch zu allen diesen Bedingungen. Bitte unbedingt umbenennen! (Ich benutze in ähnlichen Situationen eine Init-Methode.)

Außerdem rufst Du im Formular den Konstruktor von FileHandler mit einem Argument auf, aber es scheint keinen Konstruktor mit einem Argument zu geben. Deine Main-Methode ist kein Konstruktor! (Ein Konstruktor hat keinen Rückgabewert.) Du musst also die Zusammenarbeit zwischen dem Formular und dem FileHandler grundsätzlich ändern: einfacher Konstruktor, dazu Init-Methode.

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



BeitragVerfasst: Mi 03.12.08 20:58 
Hallo Christian und Thomas,

vielen Dank für die freundlichen Willkommensgrüße und auch für die hilfreichen Antworten. Da hatte ich mich wirklich in dem Glauben verrannt, die Main-Methode sei der Construktor :)

Wie folgt habe ich das Ganze nun gelöst:
Form1.cs
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
        public Form1(String[] args)
        {
            InitializeComponent();

            // args
            if (args.Length == 0)
            {
                // no file to read...
                label1.Text = "keine Logdatei definiert";
            }
            else
            {
                // setting filename
                String filename = args[0];
                FileHandler file = new FileHandler(filename);
                if (file.ReadLogfile() != "")
                {
                    label1.Text = "doll";
                }
            }
        }


FileHandler.cs
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
    class FileHandler
    {
        private String _filename; // logfile to analyze

        public FileHandler(String filename) {
            _filename = filename;
        }

        public String ReadLogfile()
        {
            FileStream fs = new FileStream(_filename, FileMode.Open);
            StreamReader sr = new StreamReader(fs);

            String s = sr.ReadToEnd();

            sr.Close();
            fs.Close();

            return s;
        }       
    }


Danke nochmals & Viele Grüße
Mario



Edit: @Christian: ja, das war ein Compiler-Fehler (s. Topic ;)). Bin darauf im msdn.microsoft.com/d...ibrary/d9s6x486.aspx aufmerksam geworden.
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 04.12.08 10:51 
Hallo,

noch zwei konkrete Ergänzungen:
user profile iconMorjo hat folgendes geschrieben Zum zitierten Posting springen:

ausblenden C#-Quelltext
1:
if (file.ReadLogfile() != "")					

Besser ist diese dafür vorgesehene und noch sicherere Abfrage:
ausblenden C#-Quelltext
1:
if( ! String.IsNullOrEmpty(file.ReadLogfile()) )					


Instanzen, die mit Dispose arbeiten, sollten in einen using-Block gekapselt werden. Erkennbar ist das daran, dass die Klasse über IDisposable verfügt; siehe in der SDK-Doku/MSDN auf der Seite "Informationen über...". Vorteil ist, dass die Instanz auf jeden Fall nur beschränkte Gültigkeit hat und sowohl Close als auch Dispose automatisch ausgeführt werden. Beispiel:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
using( FileStream fs = new FileStream(_filename, FileMode.Open) )
{
           StreamReader sr = new StreamReader(fs);
           String s = sr.ReadToEnd();
           sr.Close();
}


Gruß Jürgen