2015-03-20 2 views
2

Могу ли я сделать предположения относительно значения заливки int системных перечислений в C#?Возможность предположения в C#

Например:

//DayOfWeek 
(int)DayOfWeek.Monday == 1, 
(int)DayOfWeek.Tuesday == 2, 
(int)DayOfWeek.Wednesday == 3, 
(int)DayOfWeek.Thursday == 4, 
(int)DayOfWeek.Friday == 5, 
(int)DayOfWeek.Saturday == 6, 
(int)DayOfWeek.Sunday == 0 

Логика моего кода зависит от него. Тем не менее, я не хочу писать собственное картографирование, потому что это ... просто неправильное решение.

EDIT Также здесь идет культура. Стандарт ISO - понедельник 1-го дня. В США - воскресенье 1-го дня.

ответ

6

Да, вы можете полагаться на него, поскольку это documented, что:

DayOfWeek перечисление представляет день недели в календарях , которые имеют семь дней в неделю. Значение констант в этом перечислении варьируется от DayOfWeek.Sunday до DayOfWeek.Saturday. Если отбрасывается на целое число, его значение варьируется от нуля (что указывает DayOfWeek.Sunday) до шести (что указывает на DayOfWeek.Saturday).

Конечно, в то время как маловероятно, что они это сделают, Microsoft может изменить это в будущих выпусках.

+1

Microsoft вряд ли изменит это в будущих выпусках, учитывая, что A) это, вероятно, сломает много кода, B) Текущее поведение документировано. Явно допустимо полагаться на документированное поведение. – Brian

+0

@Brian хорошая точка, я отредактировал, чтобы уточнить это. Microsoft также хорошо относится к обратной совместимости. – BradleyDotNET

+0

Есть ли какая-то причина, по которой вы считали нужным назвать, что Microsoft может когда-нибудь изменить свое определение этого перечисления? То есть, почему бы вы даже упомянуть о возможности изменения поведения (но не упоминать об этом в любом другом ответе на любой другой вопрос)? – Brian

1

Так как это перечисление по умолчанию (как указано в BradleyDotNET answer), вы можете положиться на то, что значения будут последовательными и останутся такими, как они документированы (также, как правило, хорошая идея не полагаться на конкретные значения нумерации).

Чтобы получить первый день недели, вы должны указать DateTimeFormatInfo.FirstDayOfTheWeek.

Так что, если ваша текущая цель состоит в том, чтобы иметь список 1-седьмой день недели отображенной на DayOfWeek.Monday вам нужно использовать CultureInfo.DateTimeFormat, чтобы получить информацию и форматирования, чем цифры карты вы должны согласно FirstDayOfTheWeek собственности. Базовая + /% математика должна работать нормально, чтобы вычислить день.

Что-то вроде (непроверенный):

dayToEnumMap[1] = (DayOfWeek)(((int)(DayOfWeek.Sunday) + 
    (int)CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfTheWeek)) 
    % 7) 
1

Номер, присвоенные значения перечислений является культурой независимой. Ниже вы посмотрите на то, как можно это defined in the .Net framework:

[Serializable] 
[System.Runtime.InteropServices.ComVisible(true)] 
public enum DayOfWeek { 
    Sunday = 0, 
    Monday = 1, 
    Tuesday = 2, 
    Wednesday = 3, 
    Thursday = 4, 
    Friday = 5, 
    Saturday = 6, 
} 

Так воскресенье всегда равна 0, понедельник к 1 и так далее.

Смежные вопросы