Запутался в переносе переменных и значений из одного метода в другой

Я пишу простую учебную программу, которая позволяет пользователю вводить координаты x/y для углов для различных фигур, а затем программа расскажет пользователю основные факты об описанных формах (площадь, периметр и т. Д.). Я создал класс под названием У TRIANGLE и меня есть метод, который определяет длину каждой стороны (и назначает длину каждой стороны их собственной переменной) и периметр. Я пытаюсь написать другой метод, который будет сравнивать эти переменные длины, чтобы определить, на какой стороне находится гипотенуза, высота и основание. Это код, который я до сих пор:

public void GetLength()
{
    string choice;
    double side1length = Math.Sqrt(((corner1.x - corner2.x) + (corner1.y - corner2.y) * (corner1.x - corner2.x) + (corner1.y - corner2.y)));
    double side2length = Math.Sqrt(((corner2.x - corner3.x) + (corner2.y - corner3.y) * (corner2.x - corner3.x) + (corner2.y - corner3.y)));
    double side3length = Math.Sqrt(((corner3.x - corner1.x) + (corner3.y - corner1.y) * (corner3.x - corner1.x) + (corner3.y - corner1.y)));
    Console.WriteLine("Which side do you want the length of? (first, second, third, perimeter)");
    choice = Console.ReadLine();
    switch (choice)
    {
        case "first":
            Console.Write($"The first side is {length1} units long");
            break;
        case "second":
            Console.Write($"The second side is {length2} units long");
            break;
        case "third":
            Console.Write($"The third side is {length3} units long");
            break;
        case "perimeter":
            Console.Write($"The perimeter is {length1 + length2 + length3}");
            break;
    }
}

public void GetArea()
{
    double hypotenuse, height, Base;
    if (side1length > side2length)
        if (side1length > side3length)
            hypotenuse = length1;
}

Нужно ли использовать ключевое слово out с GetLength() метод? проблема в том, как я пытаюсь получить доступ к переменным в GetArea() метод? Это как? Я полностью нарушил правила наследования? Что было бы лучшим способом сделать это?

3 ответа

GetArea() никогда не звонит GetLength()и его переменные имеют вид privateтак что нет пути GetArea() можете использовать их. Либо использовать out параметры или область видимости переменных как частные для класса, а не метод:

    private double side1length;
    private double side2length;
    private double side3length;

    public void GetLength()
    {
        string choice;
        side1length = ...;
        side2length = ...;
        side3length = ...;
        ...
    }
    public void GetArea()
    {
        GetLength();

        // Now you can use the variables here
        ....
    }

Прежде всего, GetLength() никогда не назывался, таким образом, ни один из side*length будет рассчитан.

Во-вторых, side*length являются локальными переменными, вам лучше сначала посмотреть на область видимости переменных.

Есть несколько способов решения вашей проблемы, ответил Коби. Вы также можете использовать out если хотите, но не забудьте объявить переменные перед вызовом GetLength()

public void GetLength(out double side1length, out double side2length, out double side3length) {
    // ...
}

public void GetArea() {
    double side1length, side2length, side3length;
    GetLength(out side1length, out side2length, out side3length);
    // ...
}

Вы также можете объявить структуру / класс и вернуть в качестве переменной. Ниже приведен пример использования struct.

public struct SideLengths {
    public double side1;
    public double side2;
    public double side3;
}
public SideLengths GetLength() {
    SideLengths sl;
    sl.side1 = Math.Sqrt(((corner1.x - corner2.x) + (corner1.y - corner2.y) * (corner1.x - corner2.x) + (corner1.y - corner2.y)));
    // ...
    return sl;
}
public void GetArea() {
    SideLengths sl = GetLength();
    // use sl.side1 instead side1length in your original code
}

Кроме того, если бы это был я, я бы не вкладывал взаимодействие в функции. Было бы лучше задавать вопросы взаимодействия с пользователем в "основной" функции, а не в отдельных служебных функциях. Например:

public double GetLength(string which) {
    double retVal;
    // calculating length
    return retVal;
}
static void Main() {
    // other code
    Console.WriteLine("Which side do you want the length of? (first, second, third, perimeter)");
    choice = Console.ReadLine();
    double length = GetLength(choice);
    // print out the length
}

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

И наконец, рассмотрите лучшую практику именования переменных.

Здесь вы написали локальные переменные, а именно side1length,side2length,... и т. д. внутри метода GetLength(), поэтому вы не можете использовать их в методе GetArea(). Вы должны сначала прочитать это, и попробуйте снова для решения. https://docs.thunderstone.com/site/vortexman/variable_scope_global_vs_local.html

Другие вопросы по тегам