2010-10-26 2 views
0

Я уверен, что это просто, но я слишком долго смотрел на нее, и мне нужен ответ в ближайшее время. Я новичок в C#. Если я ставлю GetCommission() в структуры я получаюC# инициализация структуры с неполными параметрами + формула

ошибка CS0188: «это» объект не может быть использован, прежде чем все ее поля присваиваются

вне структуры

ошибка CS0038: не удается получить доступ к нестатический члену внешнего типа «Ex5._3.CommissionForm» с помощью вложенного типа «» Ex5._3.CommissionForm.salespersonFigures

Как это сделать? Оговорка: часть задания заключалась в том, что комиссия рассчитывается по методу. Ни один из обучающих программ, которые я нашел, не связан с назначением одного члена на основе значения другого. Он должен быть кошерным, поскольку вычисления используют только статические данные. Правильно?

// Declare class variables and constants 
private const decimal WEEKLY_BASE_SALARY = 250m; 
private const decimal WEEKLY_QUOTA = 1000m; 
private const decimal COMMISSION_RATE = .15m; 

public struct salespersonFigures 
{ 
    // Fields 
    private string salesperson; 
    private decimal weeklySales; 
    private decimal commission; 
    private decimal pay; 

    // Constructor 
    public salespersonFigures(string name, decimal sales) 
    { 
     salesperson = name; 
     weeklySales = sales; 
     commission = GetCommission(sales); // error occurs at this line 
     pay = WEEKLY_BASE_SALARY + commission; 
    } 

    // Property 

    public decimal Sales 
    { 
     get 
     { 
      return weeklySales; 
     } 
     set 
     { 
      weeklySales = value; 
     } 
    } 

    public string Name 
    { 
     get 
     { 
      return salesperson; 
     } 
     set 
     { 
      salesperson = value; 
     } 
    } 

    // Method 

    public decimal GetCommission(decimal sales) 
    { 
     if (sales > WEEKLY_QUOTA) 
      return sales * COMMISSION_RATE; 
     else return 0m; 
    } 
} 
+1

Почему это должно быть на структуру? Кажется, это то, что я создал класс для ... – Kendrick

+0

Как он сказал, он, вероятно, является новичком в C# и, вероятно, из C/C++-фона, кажется, что структуры будут логическим выбором для структура данных –

+0

Возможно, это не повод, но мы еще не дошли до этой части книги. – slomobile

ответ

1

Конструктор:

// Constructor 
public salespersonFigures(string name, decimal sales) 
{ 
    salesperson = name; 
    weeklySales = sales; 
    commission = GetCommission(sales); 
    pay = WEEKLY_BASE_SALARY + commission; 
} 

интерпретируется как:

// Constructor 
public salespersonFigures(string name, decimal sales) 
{ 
    this.salesperson = name; 
    this.weeklySales = sales; 
    this.commission = this.GetCommission(sales); 
    this.pay = WEEKLY_BASE_SALARY + this.commission; 
} 

Таким образом, проблемы, которые можно было бы сталкивающиеся можно решить, выполнив две вещи:

// Constructor 
public salespersonFigures(string name, decimal sales) 
{ 
    salesperson = name; 
    weeklySales = sales; 
    var tempCommission = GetCommission(sales); 
    commission = tempCommission 
    pay = WEEKLY_BASE_SALARY + tempCommission; 
} 

И сделайте GetCommissio n метод статический

+0

Большое спасибо Маккей. Я забыл, что когда я переместил GetCommission() вне структуры, мне пришлось сказать, к какому объекту принадлежит GetCommission(). Это очень помогло понять, как интерпретируется мой код. Я изменил эти строки в своей программе:/n var tempCommission = CommissionForm.GetCommission (sales); комиссия = tempCommission;/n – slomobile

+0

Это побудило intelisense предложить создать метод заглушки, в результате чего: внутренний статический десятичный GetCommission (десятичные продажи) { if (sales> WEEKLY_QUOTA) return sales * COMMISSION_RATE; else return 0m; throw new NotImplementedException(); } Не могли бы вы объяснить, почему метод должен быть статичным? Что изменилось? – slomobile

+0

Статические элементы не обязательно должны иметь экземпляр объекта, который будет использоваться. Но это также означает, что они не могут получить доступ к членам экземпляра. C# имеет условие: «Объект« this »не может использоваться до того, как все его поля будут присвоены« Чтобы защитить вас от использования структуры до ее готовности. Отвечает ли это на ваши вопросы? – McKay

0

Действительно ли вам поле для комиссионных?

private decimal commission; 

Вы можете удалить его, и у вас есть метод в структуре. И я думаю, что вам не нужен параметр продаж в методе yout GetComission.

+0

Возможно, мне следовало бы назвать этот метод CalculateCommission() тем, что он действительно делает, - это выяснить комиссию, основанную на параметре продаж, переданном ему. Поэтому параметр продаж абсолютно необходим, так как этот метод также будет использоваться с данными, отличными от структуры. Поля, которые я выбрал для включения в структуру, представляют данные, которые я буду использовать позже различными способами. Я хочу выполнить вычисления сейчас и хранить результаты неограниченно, а не откладывать обработку до тех пор, пока они не будут просмотрены, и тогда некоторые из констант могут измениться. – slomobile

+0

Вы можете использовать поле продаж, уже существующее в вашей структуре вместо параметра. –

+0

Это сделает способ непригодным для использования другим обработчиком событий в форме, которая позволяет продавцу видеть, какова будет их комиссия, если бы они сделали определенный уровень продаж. Также не затрагивает мою проблему. – slomobile

0

Очень простой обходной путь/хак:

public salespersonFigures(string name, decimal sales) 
{ 
     salesperson = name; 
     weeklySales = sales; 
     // initialize pay and commission 
     pay = 0m; 
     commission = 0m; 
     commission = GetCommission(sales); 
     pay = WEEKLY_BASE SALARY + commission; 
} 

И вам не нужна else часть статьи в getCommission, просто сделать это:

public decimal GetCommission(decimal sales) 
{ 
    if (sales > WEEKLY_QUOTA) 
     return sales*COMMISSION_RATE; 
    return 0m; 
} 

Еще одна вещь, почему вы используете decimal? Вы, вероятно, следует использовать double «с или float» S вместо этого, потому что все больше полагаются на методы float х и doubles-х и преобразования между может быть дорогостоящим

+0

Это действительно не решает мою проблему. Спасибо за усилия, хотя. – slomobile

+0

Как это не так? EDIT: я исправил это ... –

+0

Я вижу, что опускание else также работает, но приводит ли это к улучшению производительности? Я чувствую, что другое улучшает читабельность кода, однако я оставлю его в будущих ситуациях, если это оптимизация. Я использую десятичное значение из-за его точного характера и более приятных вариантов форматирования при работе с валютой. Это рекомендуется моим инструктором и учебником. Я осознаю его стоимость в памяти, его не нужно отбрасывать на другие типы. Хотя ваше отредактированное решение может работать, если метод оставлен внутри структуры, я решил оставить его снаружи. – slomobile

0

Почему бы не просто сделать GetCommission() в собственность: Комиссия.

Там нет необходимости хранить комиссию в качестве поля, он должен быть запрос к SalespersonFigures объекта

+0

Как я уже упоминал в предыдущем комментарии, комиссия должна быть сохранена, поскольку она представляет собой сумму, которая будет выплачена в определенный момент времени. Если в какой-то будущий день будет изменена константа для WEEKLY_QUOTA, CMMISSION_RATE или периода оплаты, тогда все записи ранее оплаченных комиссий будут потеряны. – slomobile

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