2015-09-02 7 views
3

Для школьного задания я должен сделать класс времени, который может хранить время в часах, минутах и ​​секундах. Все работает нормально, но свойства всегда возвращают 0, когда только объявляют get; и установить;Получить; не работает должным образом

private int seconds, minutes, hours; 
    public int Seconds { get; set; } 
    public int Minutes { get; set; } 
    public int Hours { get; set; } 

Если я определяю, что возвращать в поглотителе, он работает правильно:

private int seconds, minutes, hours; 
    public int Seconds { get { return this.seconds; } set { this.seconds = value; } } 
    public int Minutes { get { return this.minutes; } set { this.minutes = value; } } 
    public int Hours { get { return this.hours; } set { this.hours = value; } } 

Я не возражаю писать этот дополнительный код, но, к моему пониманию, первая часть кода должна работать просто отлично. Что здесь происходит?

+3

Первый фрагмент кода * работает * отлично - если вы установите 'Seconds', а затем получите' Seconds', вы получите то же значение обратно. Он не будет иметь ничего общего с полем 'seconds', хотя ... –

ответ

9

Код, который вы показываете, недостаточно, но это означает, что вы не понимаете, как работает auto-properties. Они не магически связаны с вашими поддерживающими полями (seconds, minutes, hours) - они создают свои собственные.

Таким образом, единственный способ изменить фоновое поле - использовать setter - Seconds = 42;. Я предполагаю, что вы используете seconds = 42;, что не может работать; вы меняете совершенно отдельное поле, которое не связано с свойством Seconds.

+0

Ну, это был быстрый ответ, спасибо за объяснение. Я уже думал, что странно, что C# мог магически связывать «секунды» с «секундами», но так мне объяснялось, или, может быть, как я это интерпретировал. – Connor

+0

@Connor Это вполне возможно, что вы неправильно поняли или услышали, или даже, что ваш учитель не понимает, чему они учат достаточно хорошо (я, конечно, видел многих таких учителей) - ключевой момент - смотреть на путаницу, отпустите, пока вы не поймете, что на самом деле происходит. Научитесь любить это чувство замешательства - это то, что говорит вам, что есть чему поучиться: P – Luaan

+0

Это именно то, что я пытался сделать, еще раз спасибо! – Connor

0

Get работает, и он возвращает вас 0, что является правильным значением. Потому что вы не присвоили какой-либо ценности своим свойствам. вы должны назначить значение свойствам, чтобы создавать полные свойства, используя локальные переменные, такие как следующий код. И используйте локальную переменную, как вы упоминаете. когда вы присвоите значение локальной переменной или свойству, вы получите это значение другим образом, вы будете получать значение по умолчанию 0 каждый раз.

private int seconds, minutes, hours; 

    public int Hours 
    { 
     get { return hours; } 
     set { hours = value; } 
    } 

    public int Minutes 
    { 
     get { return minutes; } 
     set { minutes = value; } 
    } 

    public int Seconds 
    { 
     get { return seconds; } 
     set { seconds = value; } 
    } 
1

В первом примере, почему у вас есть частные секунды, минуты, часы?

Если вы просто попробовать:

public int Seconds {get;set;} 

Это должно работать.

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