2016-05-03 4 views
-2

Я использую C# и Visual Studio 2015.C# Параметры класса с параметром объекта класса

У меня есть два класса BankAccount и кошелек. Класс Кошелька имеет метод передачи, который вызывает экземпляр BankAccount. Тем не менее, по моему коду формы, когда я отправляю эти параметры, он не снимает средства с исходных и целевых балансов.

Способ передачи:

public void TransferFund(BankAccount source, BankAccount destination, double amount) 
{ 
    double Source = source.Balance; 
    double Destination = destination.Balance; 

    if (Source > amount) 
    { 

     Source -= amount; 
     Destination += amount; 

    } 
    else 
    { 
     throw new ArgumentException("Insufficient funds for transfer."); 
    } 

} 

на форме кнопки мыши:

   BankAccount from = lbTransferFrom.SelectedItem as BankAccount; 
       BankAccount to = lbTransferFrom.SelectedItem as BankAccount; 

       Wallet wall = new Wallet(); 
       double amount = Convert.ToDouble(tbAmount.Text); 
       wall.TransferFund(from, to, amount); 

Вопрос: Как получить объекты источника и назначения на самом деле изменить баланс, как должно?

+2

'Wallet wall = null;' Есть ваше исключение для ссылочной ссылки –

+0

Разве вы не задали вопрос по тому же самому коду? А еще пару вчера? Почему я чувствую, что вы ищете кого-то, чтобы просто написать весь код для вас? – jitendragarg

+0

jitendra garg: Я учусь, и это те аспекты, которые я не знаю, как это сделать. Учитывая, что 90% моего фактического кода принадлежит моему, нет, я бы, конечно, сказал, что нет. Я также смог извлечь эти вещи и применить их в других учебных проектах. – Thisone

ответ

2

Эти две линии

double Source = source.Balance; 
double Destination = destination.Balance; 

являются копирование значение .Balance переменной. В дальнейшем вы меняете значение этих копий баланса, но вы никогда не переназначаете баланс каждой из счетов. Вместо копирования значения просто сделают

if (source.Balance >= amount) { 
    source.Balance -= amount; 
    destination.Balance += amount; 
} else { 
    throw new ArgumentException("Insufficient funds for transfer."); 
} 

В C# вы можете разделить значения на ведра. Типы значений и типы ссылок. Когда вы когда-либо передаете ссылочную типизированную переменную, любое присвоение или другое изменение состояния будет отражено всеми ссылками («переменными») на один и тот же объект. При использовании типов значений (большинство простых типов и всех структур) каждый раз, когда вы назначаете переменную другому или передаете ее в качестве параметра, вы копируете значение и передаете копию . Любые изменения в копии отражаются только в этой копии, и вы часто обнаружите, что типы значений на самом деле неизменяемы, поэтому в вашем случае оба назначения double Source = source.Balance и Source -= amount создают копию и присваивают эту вновь созданную копию переменной Source

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

+0

Я также думаю, что это всего лишь учебный проект, но если это не так, я бы также добавил, что кто-то должен положить ему ногу и быть уверенным, что не следует моделировать банковские счета как поле «двойной суммы», как бухгалтерский учет временных транзакций (и модельные денежные суммы как ints/decimals, а не плавающие) – kai

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