2013-05-14 2 views
1

У меня есть простая проблема, но я застрял в качестве новичка.Настройка свойства только для чтения по методу

Мой метод SetGrade принимает параметр float, и я хотел бы, чтобы он возвращал char , а затем задал это значение для свойства Grade.

Я ничего не делаю правильно.

public Class Student { 
    private char grade; 

    public char Grade { get { return grade; } } 

    public char SetGrade(float score) { 
     char Mgrade; 
     if(score >= 90.0) { 
      return Mgrade = 'A'; 
     } 
     return Mgrade = 'F'; 
    } 
} 
+0

Что такое 'Mgrade' и почему вы пытаетесь его назначить? И почему свойство 'Grade' имеет капитал' P' в модификаторе доступа? (C# чувствителен к регистру.) –

+0

Вы действительно хотите вернуть «A» или «F» - или вы хотите вернуть «A», «B», «C», «D», «E» или «F» в зависимости от «класса»? –

ответ

2

Ваш синтаксис откусил:

public char SetGrade(float score) 
    { 
    if(score >= 90.0) 
    { 
     return 'A'; 
    } 
    return 'F'; 
    } 

Нет необходимости в Mgrade переменной, и вы должны просто вернуть персонаж хотел, вместо присваивания и возврата.

+0

нет необходимости в if-statement :) –

+0

@ taras.roshko - Если вы имеете в виду, что вы можете использовать условный оператор, конечно. – Oded

+0

да, но на самом деле я согласен с Эриком в том, что в этом коде есть много других проблем, в том числе странное присвоение имен (или отсутствие присвоения prop в методе SetGrade). –

6

Не нужно назначать свой символ промежуточной переменной char. Просто верните правильный характер, как это.

public char SetGrade(float score) 
{ 
    if(score >= 90.0) 
    { 
     return 'A'; 
    } 
    return 'F'; 
} 
+1

Содержимое всей функции может быть даже упрощено для 'return score> = 90.0 ? «A»: «F''; –

+1

@DavidS .: Данный код, вероятно, является упрощенной версией реального кода. –

+0

@EricLippert абсолютно, мне просто нравится указывать такие вещи, потому что я читал много ненужного длинного кода вокруг :) –

15

Существует множество проблем с этим кодом, но они могут быть не такими, какими вы считаете.

Прежде всего, Public неправ; C# требует public.

Во-вторых, использование местных Mgrade странно и не нужно, но достаточно интересно не на самом деле wrong; законно выполнять задание и возвращать за один шаг. Но в этом случае вам не нужно; только return 'A'; без местного задания.

В-третьих, метод неправильный, потому что не устанавливает Grade. Если вы собираетесь его установить класс, то он должен быть недействительным возвращения:

public void SetGrade(float score) 
{ 
    if(score >= 90.0) 
    { 
     this.grade = 'A'; 
    } 
    this.grade = 'F'; 
} 

Если вместо этого метод предназначен, чтобы быть переход от поплавков до символов, то оно должно быть статическим:

public static char ScoreToGrade(float score) 
{ 
    if(score >= 90.0) 
    { 
     return 'A'; 
    } 
    return 'F'; 
} 

Откровенно , Я был бы склонен делать то и другое:

public void SetGrade(float score) 
{ 
    this.grade = ScoreToGrade(score); 
} 

Там, у вас есть лучшее из обоих миров.

В-четвертых, это всего лишь стилистическая точка; Вы могли бы рассмотреть:

public char Grade { get; private set; } 

компилятор будет генерировать «невидимый» подкладочный поле для вас, так что вы не должны управлять сами. Этот синтаксис означает, что Grade может быть прочитан из любого места и написан с этого класса.

+0

А я вижу! Я действительно собирался назначить свойство класса. Спасибо Эрик! –

+0

@RickWalker: Добро пожаловать. И добро пожаловать в переполнение стека. –

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