C# Fragenverzeichnis

ali7566

Lieutenant
Registriert
Feb. 2007
Beiträge
980
Hallo,

ich arbeite jetzt schon länger mit C# und es kommt oft vor das ich gewisse dinge nicht ganz nachvollziehen kann, deswegen mache ich diesen Thread, in dem ich meine Fragen stellen möchte.

Gleich zu der ersten:

using System;

enum wochentag {montag, dienstag, mittwoch, donnerstag, freitag, samstag, sonntag };

namespace cases
{
class testenSwitch
{
static void Main(String[] args)
{
zeit();
Console.ReadKey();
}

static void zeit()
{
DateTime heute = DateTime.Now;

switch ((wochentag)heute.DayOfWeek) // #1
{
case (wochentag.montag):
case (wochentag.dienstag):
case (wochentag.mittwoch):
Console.WriteLine("Der erste Teil der Woche");
break;

case (wochentag.donnerstag):
case (wochentag.freitag):
case (wochentag.samstag):
Console.WriteLine("Der zweite Teil der Woche");
break;

case (wochentag.sonntag):
Console.WriteLine("Das Ende der Woche");
break;

}
}

}
}

#1: Kann mir jemand verraten was in dieser Zeile genau passiert. Soweit ich das verstehe sind die Enums standardmäßig int und mit der DayOfWeek anweisung lasse ich mir dann den genauen Wert des tages geben (5 = Samstag) und anschließend abprüfen.

Desweiteren springt der Compiler immer in den letzten case (sonntag) obwohl heute Samstag ist. Ich habe auch mal einen BreakPoint gesetzt um zu gucken und er springt direkt immer sonntag.

Gruß Ali.
 
Hi,
enums sind in C# im default nichts weiter als named integer. Montag = 0, Dienstag = 1, ...

In DateTime.DayOfWeek wird der aktuelle Wochentag gehalten, wahrscheinlich als Int oder als eigenes Enum (es sollte ein WeekDays oder ähnliches geben im .NET Framework). Der interne Wochentag ist offensichtlich 6, d.h. wenn du gerade Samstag hast, bildet .NET Samstag mit dem Wert 6 ab. Das kann so passieren:

Code:
// Jetzt beginnt die Aufzählung mit dem Index 1. 
enum wochentag {montag=1, dienstag, mittwoch, donnerstag, freitag, samstag, sonntag };

In der von dir markierten Zeile wird wohl der .NET Typ WeekDay (oder wie auch immer er benannt ist) mit dem Wert 6 in den von dir erstellten Typ WochenTag gecasted (Konvertiert). Dazu wird einfach der passende Enum mit dem Wert 6 genommen. Aufgrund der verschiedenen Startindizes hast du deswegen einen offset von +1 (ein Tag weiter).

Evtl. beginnt .NET auch mit Sonntag als erstem Wochentag (könnte auch abhängig von den Kultureinstellungen sein), dafür musst du dir einfach mal mit dem .NET Reflector den Typen anschauen oder ausprobieren.
Lass dir doch einfach mal den Wert von DateTime.Now.DayOfWeek ausgeben, dann siehst du wo der offset herkommt.
 
Zuletzt bearbeitet:
Ich würde mal sagen, dass das DayOfWeek-enum mit 1 anfängt für Montag, bei dir fängt dein enum aber mit 0 an.
Und das bei deinem Enum zu ändern musst du einfach bei der Deklaration bei Montag " = 1" hinzuschreiben, dann wird bei 1 angefangen zu zählen.

EDIT:
Super, eine Minute Tippzeit. ^^
 
Das DayOfWeek Property in .NET fängt bei Sonntag (= 0) an und endet bei Samstag (= 6)


Schönen Gruß
Stephan
 
Meine Vorposter haben das eig. gut erklärt.
Ich habe hier aber noch ne Anmerkung.
Benutz doch soweit möglich die standardmässig von .Net zur Verfügung gestellten Klassen. In diesem Falle zum Beispiel das DayOfWeek-enum.

Code:
            DateTime heute = DateTime.Now;

            switch (heute.DayOfWeek)
            {
                case (DayOfWeek.Monday):
                    Console.WriteLine("Montag");
                    break;
                case (DayOfWeek.Tuesday):
                    Console.WriteLine("Dienstag");
                    break;
                
                //usw.
            }
 
Du kannst auch SOO machen!

Code:
        /// <summary>
        /// Wochentage übernohmen von DayOfWeek und deshalb komplett kompatibel dazu.
        /// </summary>
        public enum WochenTage
        {
            /// <summary>
            /// Wochentag Montag.
            /// </summary>
            Montag = DayOfWeek.Monday,

            /// <summary>
            /// Wochentag Dienstag.
            /// </summary>
            Dienstag = DayOfWeek.Tuesday,

            /// <summary>
            /// Wochentag Mittwoch.
            /// </summary>
            Mittwoch = DayOfWeek.Wednesday,

            /// <summary>
            /// Wochentag Donnerstag.
            /// </summary>
            Donnerstag = DayOfWeek.Thursday,

            /// <summary>
            /// Wochentag Freitag.
            /// </summary>
            Freitag = DayOfWeek.Friday,

            /// <summary>
            /// Wochentag Samstag.
            /// </summary>
            Samstag = DayOfWeek.Saturday,

            /// <summary>
            /// Wochentag Sonntag
            /// </summary>
            Sonntag = DayOfWeek.Sunday,

            /// <summary>
            /// Kein bestimmter Wochentag. Nur für Sonderfälle.
            /// </summary>
            Alle = -1
        }
 
Vielen dank für die Antworten, ich werde es heute abend die Vorschläge nochmal ausprobieren.

Gruß Ali.
 
Hi,

vlt. habe ich etwas überlesen, aber wenn du den Tag deines Datums haben willst, dann kannst du das ganz leicht so machen:

Code:
// beispiel Objekt von DateTime, könnte auch DateTime.Now sein etc.
DateTime day = new DateTime(2011, 6, 10);

// in dein gewünschtes string Format bringen und in der Konsole ausgeben
Console.WriteLine(string.Format("{0:dddd}", day));


Was an dieser Stelle vlt. noch interessant wäre:
String Formate
 
@toeffi...

es ist wie mans sehen will... der macht ja auch doppelt gemoppelt. Vielleicht wollte er ja nicht anders. Ich habe nur vorgeschlagen, mehr nicht.
 
Jop richtig. Aber anstatt eine redundante Lösung zu posten, kannst du auch wie Elessar_CH oder Haggi eine sinnvolle Lösung posten, und ich bin mir sicher das du auf dem Level bist das ohne Probleme hinzubekommen ;)
 
Wieso strings? Die Lösung von Elessar_CH arbeitet doch mit dem .NET Date-Enum. Und das ist meines erachtens die beste korrekte Lösung. Zumal man sich für jedes DateTime objekt auch mit der passenden Culture die Wochentage in seiner Sprachvariante ausgeben lassen kann. Oder habe ich dich falsch verstanden?
 
Ich habe da nur string als Ausgabeformat angegeben... hätte ich dazu sagen sollen. Dachte er will es eh bloß auf der GUI ausgeben...
 
Zurück
Oben