Подскажите почему Switch case 1 возвращает 0 в переменную result

Написал вот такой калькулятор, консольный выбор так же нашел тут, пока только разбираюсь как он работает, вопрос собственно в том, что после сложения в переменную result помещается ноль и соответственно дальше код работает не верно.

using System.Security.Cryptography.X509Certificates;

namespace ConsoleApp3
{
    public class Program
    {
        
        public static int val1 = 1;
        public static int val2 = 2;
        public static int result;
        public static bool ActionResult = false;

        static int Slozhenie(int val1, int val2, int result, bool ActionResult)
        {
            ActionResult = true;
            result = val1 + val2;
            return result;
        }

        static int Vychitanie(int val1, int val2, int result)
        {
            result = val1 - val2 ;
            bool ActionResult = true;
            return result;
        }

        static int Umnozhenie(int val1, int val2, int result)
        {
            result = val1 * val2;
            bool ActionResult = true;
            return result;
        }

        static int Delenie(int val1, int val2, int result)
        {
            result = val1 / val2;
            bool ActionResult = true;
            return result;
        }

        static int SlozhenieAfter(int val2, int result, bool ActionResult)
        {
            ActionResult = true;
            result = result * val2;
            return result;
        }
        public static int Start()
        {
            ActionResult = true;
           // done: // запускает все сначала
            string[] menuItems = new string[] { "Сложение", "Вычитание", "Деление", "Умножение" };

            Console.WriteLine("Меню\n");

            int row = Console.CursorTop;
            int col = Console.CursorLeft;
            int index = 0;
            while (true)
            {
                DrawMenu(menuItems, row, col, index);
                switch (Console.ReadKey(true).Key)
                {
                    case ConsoleKey.DownArrow:
                        if (index < menuItems.Length - 1)
                            index++;
                        break;
                    case ConsoleKey.UpArrow:
                        if (index > 0)
                            index--;
                        break;

                    case ConsoleKey.Enter:

                        switch (index)

                        {
                            case 0:
                                Console.WriteLine("\nРезультат сложения равен: " + Slozhenie(val1, val2, result, ActionResult));
                                return 1;
                            case 1:
                                Console.WriteLine("\nРезультат вычитания равен: " + Vychitanie(val1, val2, result));
                                return Vychitanie(val1, val2, result);
                            case 2:
                                Console.WriteLine("\nРезультат деления равен: " + Delenie(val1, val2, result));
                                return Delenie(val1, val2, result);
                            case 3:
                                Console.WriteLine("\nРезультат умножения равен: " + Umnozhenie(val1, val2, result));
                                return Umnozhenie(val1, val2, result);
                        }

                        break;

                }
            }
        }

        public static int StartAfter ()
        {
        done1: // запускает все сначала
            string[] menuItems = new string[] { "Сложение", "Вычитание", "Деление", "Умножение" };

            Console.WriteLine("Меню\n");

            int row = Console.CursorTop;
            int col = Console.CursorLeft;
            int index = 0;
            while (true)
            {
                DrawMenu(menuItems, row, col, index);
                switch (Console.ReadKey(true).Key)
                {
                    case ConsoleKey.DownArrow:
                        if (index < menuItems.Length - 1)
                            index++;
                        break;
                    case ConsoleKey.UpArrow:
                        if (index > 0)
                            index--;
                        break;

                    case ConsoleKey.Enter:

                        switch (index)

                        {
                            case 0:
                                Console.WriteLine("\nРезультат сложения равен: " + SlozhenieAfter(val2, result, ActionResult));
                                return 1;

                            case 1:
                                Console.WriteLine("\nРезультат вычитания равен: " + Vychitanie(val1, val2, result));
                                goto done1;
                            case 2:
                                Console.WriteLine("\nРезультат деления равен: " + Delenie(val1, val2, result));
                                goto done1;
                            case 3:
                                Console.WriteLine("\nРезультат умножения равен: " + Umnozhenie(val1, val2, result));
                                goto done1;
                        }

                        break;

                }
            }
        }
        static void DrawMenu(string[] items, int row, int col, int index)
        {
            Console.SetCursorPosition(col, row);
            for (int i = 0; i < items.Length; i++)
            {
                if (i == index)
                {
                    Console.BackgroundColor = Console.ForegroundColor;
                    Console.ForegroundColor = ConsoleColor.Black;
                }
                Console.WriteLine(items[i]);
                Console.ResetColor();
            }
            Console.WriteLine();
        }

        public static void Main(string[] args)
        {
            while (true) {
            if (ActionResult)
            {

                StartAfter();

                }
            else
            {

                    Start();
                }
            }
        }
    }
}


Ответы (2 шт):

Автор решения: CrazyElf

Вы разберитесь сначала что такое локальные переменные, что такое статические поля класса, что такое поля экземпляра класса. У вас одинаковое название у статических полей класса result, ActionResult, val1 и val2 и у аргументов методов класса. Из-за этого у вас путаница. Ваш result, который вы возвращаете из методов класса, никуда не присваивается, а только выводится в консоль. Поэтому когда вы дальше делаете какие-то действия, передавая в ваши методы статическое поле класса result, вы передаёте 0, которым это поле типа int по дефолту инициализировано.

static int Slozhenie(int val1, int val2, int result, bool ActionResult)
{
    // аргументы метода - это локальные переменные
    ActionResult = true; // это присваивание в аргумент метода ничего не поменяет
    result = val1 + val2; // тут result - это опять аргумент метода
    return result; // _значение_ результата вернули, но см. ниже
}
// ...
// результат вызова метода, который вернули, тут никуда не записался
Console.WriteLine("\nРезультат сложения равен: " + Slozhenie(val1, val2, result, ActionResult));

По-хорошему вообще вам нужно избавляться от статических полей класса и присваивать все значения в явном виде. Вернули result из метода класса - присвоили его в переменную. Дальше эту переменную передали в какую-то функцию. Так у вас будет понимание, что вообще происходит с вашими переменными. Когда разберётесь с функциональным стилем программирования, когда всё явно передаётся и возвращается - тогда можете переходить к ООП, инкапсуляции и обращению с полями класса. А там может и до статических полей дело дойдёт. Но не раньше, чем вы разберётесь с обычными переменными, аргументами функций/методов, передачей значений в методы/функции, возвратом и присваиванием куда-то этих значений.

А сейчас вы просто путаетесь в разных типах переменных, из-за чего у вас и проблемы. Начните с простых типов (локальных переменных) и потом уже переходите к сложным понятиям: ООП, классы и их поля, методы и т.д.

→ Ссылка
Автор решения: Василий Волгин

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

Можно например поправить так:

static int Slozhenie(int val1, int val2)
{
    ActionResult = true;
    return val1 + val2;
}

и еще:

static int Vychitanie(int val1, int val2)
{
    ActionResult = true;
    return val1 - val2;
}

В общем:

  1. result не сохраняется – методы получают его копию, а не изменяют глобальную переменную. Нужно убрать result из параметров и записывать результат в result в Start().

  2. ActionResult внутри методов не меняет глобальное значение – из-за объявления новой переменной. Нужно просто присваивать ActionResult = true; без создания новой.

  3. Результат вычислений не сохраняется – программа выводит его на экран, но не записывает. Нужно после вызова метода присваивать result = Slozhenie(val1, val2);.

→ Ссылка