Laden...

string[] args Elemente an andere Klasse übergeben

Erstellt von micha0827 vor 6 Jahren Letzter Beitrag vor 6 Jahren 2.667 Views
M
micha0827 Themenstarter:in
85 Beiträge seit 2015
vor 6 Jahren
string[] args Elemente an andere Klasse übergeben

Ich steh momentan ganz auf dem Schlauch. Ich brauche die Befehlszeilenargumente in einer anderen Klasse. Dazu habe ich mir eine Klasse erstellt:


public class DBConfig
    {
        public int dbskip { get; set; }
        public int dbcount { get; set; }
    }

in der Main Methode habe ich dann folgenden Teil:


DBConfig db_config = new DBConfig();
                
                if (args.Length == 2)
                {
                    db_config.dbcount = Convert.ToInt16(args[0]);
                    db_config.dbskip = Convert.ToInt16(args[1]);
                }

Nur kann ich von meiner Klasse aus nicht auf db_config.dbcount zugreifen. Wenn ich DBConfig db_config = new DBConfig(); oberhalb von main in die class Program schreibe kann ich von der Main nicht darauf zugreifen.

Wo ist der richtige Ansatz ?

Danke
Michael

121 Beiträge seit 2016
vor 6 Jahren

Nur kann ich von meiner Klasse aus nicht auf db_config.dbcount zugreifen

Woran merkst du das?

M
micha0827 Themenstarter:in
85 Beiträge seit 2015
vor 6 Jahren

an der Fehlermeldung > Fehlermeldung:

der Name db_config ist im aktuellen Kontext nicht vorhanden

Michael

3.003 Beiträge seit 2006
vor 6 Jahren

Weil du die Variable db_config vom Typ DBConfig in der Main-Methode der Klasse deklarierst, ist sie auch nur innerhalb der Main-Methode verfügbar. Möglicherweise suchst du das hier: Felder, um die Variable über den Gültigkeitsbereich der Main()-Methode hinaus parat zu haben. Das wäre allerdings schon die Grundlage der Grundlagen und ein Anlass, sich erst einmal ein Buch zu schnappen und durch zu arbeiten.

Bitte auch [Artikel] C#: Richtlinien für die Namensvergabe beachten.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

D
985 Beiträge seit 2014
vor 6 Jahren

Dann zeig doch mal den Code so, dass auch daraus hervorgeht, wo was steht statt einer umständlichen Beschreibung dessen.

Ich kann mir zwar Situationen vorstellen, wo das passieren kann, aber keine Lust mir dann anzuhören "Nee, das ist bei mir anders!" nur weil ich dann nicht exakt die getroffen habe.

M
micha0827 Themenstarter:in
85 Beiträge seit 2015
vor 6 Jahren

aber gerne doch:


using System;
using System.Diagnostics;
using System.Threading.Tasks;
using System.Timers;


namespace ApiCall
{
    public class Program
    {
        private static System.Timers.Timer aTimer;
        DBConfig db_config = new DBConfig();
        
        static void Main(string[] args)
        {
            
            try
            {
                DBConfig db_config = new DBConfig();
                
                if (args.Length == 2)
                {
                    db_config.dbcount = Convert.ToInt16(args[0]);
                    db_config.dbskip = Convert.ToInt16(args[1]);
                }

                SetTimer();
                Start().Wait();

                Console.WriteLine("\nPress the Enter key to exit the application...\n");
                Console.WriteLine("The application started at {0:HH:mm:ss.fff}", DateTime.Now);
                Console.ReadLine();
                aTimer.Stop();
                aTimer.Dispose();

                Console.WriteLine("Terminating the application...");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
                Console.ReadKey();
            }

            if (Debugger.IsAttached)
                Console.ReadKey();
        }

        public static async Task Start()
        {
            Stopwatch watches = new Stopwatch();
            watches.Start();

            ApiFindingCall call = new ApiFindingCall();
            var arrGesamt = await call.StartCall();

            watches.Stop();
            Console.WriteLine(DateTime.UtcNow.ToString() + " Auktionen eingetragen. Dauer: " + watches.Elapsed.ToString());

            
        }

        private static void SetTimer()
        {
            
            
            aTimer = new System.Timers.Timer(1000 * 300);
            aTimer.Elapsed += OnTimedEvent;
            aTimer.AutoReset = true;
            aTimer.Enabled = true;
        }

        private static void OnTimedEvent(Object source, ElapsedEventArgs e)
        {
            
            Task t = Start();
            t.ContinueWith((str) =>
            {
                //Console.WriteLine(str.Status.ToString());
                //Console.WriteLine("Main end");
            });
            t.Wait();

        }

        


    }
}

hier brauch ich dann die Werte:



using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;

namespace ApiCall
{
    class ApiFindingCall
    {
         public async Task<string[,]> StartCall()
        {
            int dbskip = db_config.dbskip;
            int dbcount = db_config.dbcount;
        }

     }
}
121 Beiträge seit 2016
vor 6 Jahren

Es sollte

static DBConfig db_config = new DBConfig();

heissen.

2.298 Beiträge seit 2010
vor 6 Jahren

Lege dein Config-Objekt als Member von "Program" an. Beachte aber, dass es statisch sein muss, sonst kannst du nicht darauf zugreifen.

In deiner Start-Methode übergibst du dann das Objekt an dein ApiFindingCall. - Danach hast du auch innerhalb dessen Zugriff auf die Konfigurationswerte.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

M
micha0827 Themenstarter:in
85 Beiträge seit 2015
vor 6 Jahren

danke inflames2k, das hat mir den Tag gerettet.

Michael

5.658 Beiträge seit 2006
vor 6 Jahren

Damit auch die kommenden Tage gerettet sind, empfehle ich einen Blick in [FAQ] Wie finde ich den Einstieg in C#? sowie in das OpenBook vom Rheinwerk-Verlag: 🛈

Weeks of programming can save you hours of planning

16.835 Beiträge seit 2008
vor 6 Jahren

Besser wäre es die Config als Instanz via Methodenparameter zu übergeben und auf static zu verzichten.
static macht als Einsteiger i.d.R. mehr Probleme, als das es hilft.

M
micha0827 Themenstarter:in
85 Beiträge seit 2015
vor 6 Jahren

MrSparkle,

auch an Dich ein großes Dankeschön für diesen Hinweis.

Michael

57 Beiträge seit 2012
vor 6 Jahren

Von Andreas Kühnel ist auch das Buch 'C#6 mit Visual Studio 2015' sehr zu empfehlen, damit du die Grundlagen wirklich verstehst

OO gibts seit Platon - hatte der auch C#?