мимо ref C # button_on_click - PullRequest
       10

мимо ref C # button_on_click

0 голосов
/ 18 октября 2018

Я создаю приложение для пожертвований, которое читает входные данные в текстовом поле и преобразует их в двойные.Затем, используя метод operatingCost, нужно взять это преобразованное удвоение и разделить его на 17% (операционные сборы).В настоящее время в методе у меня есть переменная dontationBFees, входящая, а затем деленная на 17 и создающая новую переменную afterFees.У меня проблема в том, что мне нужно передать ref в этом проекте, и я не могу получить доступ к переменной afterFees.Мне нужно получить ссылку afterFees и отобразить ее на моем afterFeesBox.Также у меня есть этот метод внутри моей кнопки on_click.Любая помощь будет оценена.Ниже мой код:

   private Double donationBFees = 0;


    private void button1_Click(object sender, EventArgs e)
    {
        String donationBeforeFees;
        Double aFees;
        String totalDonationRaised;

        donationBeforeFees = donationBox.Text;
        donationBFees = System.Convert.ToDouble(donationBeforeFees);

        void operatingCost(ref double afterFees)
        {
            afterFees = (donationBFees / 17);
        }


        afterFeesBox.Text = operatingCost(ref afterFees);


    }

Ответы [ 3 ]

0 голосов
/ 18 октября 2018

Несколько (надеюсь полезных) вещей:

void operatingCost(ref double afterFees)
{
    afterFees = (donationBFees / 17);
}

Это означает, что вы передаете ссылку на afterFees и, в методе, делаете вещи на afterFees (в данном случае,присваивая его donationBFees / 17) и ничего не возвращая.Однако эта строка:

afterFeesBox.Text = operatingCost(ref afterFees);

означает, что вы присваиваете Text результату этого метода, который не работает, поскольку его тип возвращаемого значения равен void.

Вы такженикогда не объявляйте afterFees, кроме как в этом методе (который не работает).Я полагаю, вы получаете сообщение об ошибке «Имя ... не существует в текущем контексте».Вам нужно объявить эту переменную локально (и переименовать ее, чтобы она не конфликтовала):

double partAfterFees = 0;
operatingCost(ref partAfterFees);

Итак, вы можете сделать несколько вещей:

1) вернуть тип (вы в настоящее время используете double но, как предлагается в комментариях, возможно, захотите использовать decimal).Тогда вы можете удалить ref, если хотите.Затем вы можете сделать что-то вроде:

double operatingCost(ref double afterFees)
{
    afterFees = (donationBFees / 17);
    return afterFees;
}
afterFeesBox.Text = operatingCost(ref partAfterFees).ToString();

Но это кажется странным, поэтому я могу просто сделать (учитывая то, что вы сказали):

double partAfterFees = 0;
operatingCost(ref partAfterFees);
afterFeesBox.Text = partAfterFees.ToString();

Обратите внимание, что есть "лучше«Решения, включающие рефакторинг и проверку правильности ввода и т. д. Но я думаю, что это отвечает на ваши вопросы.

0 голосов
/ 18 октября 2018

Я переместил метод из onClick, я изменил расчет для определения процента пожертвования (пользовательский ввод).Я также отформатировал вывод для отображения только двух знаков после запятой и отображения знака доллара.Мне все еще нужно создать обработчики ошибок для проверки ввода пользователя, но это не должно быть проблемой.У меня были проблемы с пропуском по реф, но я намного лучше понимаю, как это работает.Спасибо всем за помощь!

private decimal donationBFees = 0;

    void deductOperatingCost(ref decimal afterFeesParam)
    {
        afterFeesParam = afterFeesParam - (afterFeesParam  / 100 * 17);
    }


    private void Button_Click(object sender, RoutedEventArgs e)
    {
        String donationBeforeFees;
        Decimal aFees;
        String totalDonationRaised;

        donationBeforeFees = donationBox.Text;
        donationBFees = System.Convert.ToDecimal(donationBeforeFees);


        decimal afterFees = donationBFees;
        deductOperatingCost(ref afterFees);
        afterFeesBox.Text = afterFees.ToString("$###, ##0.00");

    }
0 голосов
/ 18 октября 2018

Вызов byref изменяет значение, которое передается в функцию, поэтому вам нужно передать переменную, которую вы не против изменить.

В этом примере у меня было две вещи, названные afterFees,поэтому я переименовал один, чтобы было очевидно, что он является параметром.

private Double donationBFees = 0;

void operatingCost(ref double afterFeesParam)
{
    afterFeesParam = (afterFeesParam / 17);
}

private void button1_Click(object sender, EventArgs e)
{
    String donationBeforeFees;
    Double aFees;
    String totalDonationRaised;

    donationBeforeFees = donationBox.Text;
    donationBFees = System.Convert.ToDouble(donationBeforeFees);

    double afterFees = donationBFees;
    operatingCost(ref afterFees);
    afterFeesBox.Text = afterFees;
}

Вы должны сказать своему профессору, что это не очень хорошее использование параметра byref.Это может иметь больше смысла, если функция вычитает эксплуатационные расходы:

void deductOperatingCost(ref double afterFeesParam)
{
    afterFeesParam = afterFeesParam - (afterFeesParam / 17);
}

Таким образом, вы даете ему значение, и оно возвращается немного меньше.

...