对于将变量和值从一种方法传递到另一种方法感到困惑

时间:2017-06-19 12:54:56

标签: c# variables inheritance methods out

我正在编写一个简单的练习程序,允许用户输入各种形状的角的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;
}

我是否需要在GetLength()方法中使用out关键字?问题是我尝试访问GetArea()方法中的变量的方式?两者都是吗?我完全违反了继承规则吗?什么是更好的方法呢?

3 个答案:

答案 0 :(得分:0)

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
        ....
    }

答案 1 :(得分:0)

这里你已经在GetLength()方法中编写了局部变量,即side1length,side2length,...等等,所以你不能在GetArea()方法中使用它们。 您应该首先阅读此内容,然后再次尝试解决方案。 https://docs.thunderstone.com/site/vortexman/variable_scope_global_vs_local.html

答案 2 :(得分:0)

首先,永远不会调用GetLength(),因此不会计算side*length。{/ p>

其次,side*length是局部变量,您最好首先查看变量范围。

有几种方法可以解决你的问题,Koby回答了一个问题。如果您愿意,也可以使用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 / class并作为变量返回。下面是使用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
}

此外,如果是我,我不会在功能中加入互动。最好在“main”函数中询问用户交互,而不是单个实用程序函数。例如:

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
}

这仍然不是最好的做法,但现在比你的好。但是,我会在这个阶段离开你,因为显然你是一个初学者,如果你被推得太深,它可能会弄乱你的想法。

最后,请考虑更好地命名变量。