方法始终返回0

时间:2017-12-14 23:43:56

标签: c#

我试图使用(DisplayMessage)方法调用一个方法(ChooseDecoration)并返回1,2或其他值的值但是现在方法只是每次都返回0告诉。

我尝试了各种方法,例如在DisplayMessage方法中获取装饰值,但程序规范需要一个单独的方法来查找它们。

namespace ConsoleApp6
{
public class ChristmasCard : ChristmasCardTesting
{
    static void Main()
    {
        ToAndFrom();
        double decorate = ChooseDecoration();

        DisplayMessage(decorate);
        Console.ReadLine();
    }

    public static void ToAndFrom()
    {
        Console.WriteLine("Please enter who you are sending the card to");
        string to = Console.ReadLine();
        Console.WriteLine("Please enter who it is from");
        string from = Console.ReadLine();

    }
    public static void SetBorderCharacter()
    {

    }
     static double ChooseDecoration()
    {
        Console.WriteLine("Please Choose decoration 1 or 2 ");
       double decoration = Convert.ToDouble(Console.Read());
        return decoration;

    }
    public static void DisplayMessage(double decoration)
    {

        if (decoration == 1)
        {
            ChristmasCardTesting.SantaA();
        }
        else if (decoration == 2)
        {

            ChristmasCardTesting.SantaB();
        }
       // else
        //    ChristmasCardTesting.SantaA();

    }
    public static void DoPromt()
    {

    }
    public static void AddMessage()
    {

    }
    public static void ClearMessage()
    {

    }




}

public class ChristmasCardTesting
{

    public static void SantaA()
    {
        Console.WriteLine(@" ||::|:|| .--------, ");
        Console.WriteLine(@" |:||:|:| |_______ / .-. ");
        Console.WriteLine(@" ||::|:|| .'` ___ `'. \|('v')|/ ");
        Console.WriteLine(@" \\\/\///: .'` `'. ;____`( )'____ ");
        Console.WriteLine(@" \====/ './ o o \|~ ^' '^ // ");
        Console.WriteLine(@" \\// | ())) . | Season's \ ");
        Console.WriteLine(@" || \ `.__.' /| // ");
        Console.WriteLine(@" || _{``-.___.-'\| Greetings \ ");
        Console.WriteLine(@" || _.' `-.____.- '`| ___ // ");
        Console.WriteLine(@" ||` __ \ |___/ \_______\ ");
        Console.WriteLine(@" .' || (__) \ \| / ");
        Console.WriteLine(@" / `\/ __ vvvvv'\___/ ");
        Console.WriteLine(@" | | (__) | ");
        Console.WriteLine(@" \___/\ / ");
        Console.WriteLine(@" || | .___. | ");
        Console.WriteLine(@" || | | | ");
        Console.WriteLine(@" ||.-' | '-. ");
        Console.WriteLine(@" || | ) ");
        Console.WriteLine(@" || ----------'---------' ");
        Console.ReadLine();


    }
    public static void SantaB()
    {
        Console.WriteLine(@" ");
        Console.WriteLine(@" .------, ");
        Console.WriteLine(@" .\/. |______| ");
        Console.WriteLine(@" _\_}{_/_ _|_Ll___|_ ");
        Console.WriteLine(@" / }{ \ [__________] .\/. ");
        Console.WriteLine(@" '/\' / \ _\_\/_/_ ");
        Console.WriteLine(@" () o o () / /\ \ ");
        Console.WriteLine(@" \ ~~~ . / '/\' ");
        Console.WriteLine(@" _\/ \ '...' / \/_ ");
        Console.WriteLine(@" \\ {`------'} // ");
        Console.WriteLine(@" \\ /`---/',`\\ // ");
        Console.WriteLine(@" \/' o | |\ \`// ");
        Console.WriteLine(@" /' | | \/ /\ ");
        Console.WriteLine(@" __,. -- ~~ ~| o `\| |~ ~~ -- . __ ");
        Console.WriteLine(@" | | ");
        Console.WriteLine(@" \ o / ");
        Console.WriteLine(@" `._ _.' ");
        Console.WriteLine(@" ^~- . - ~^ ");
        Console.WriteLine(@" ");
        Console.ReadLine();
    }


}
}

2 个答案:

答案 0 :(得分:7)

Console.Read会返回int,但这不是数字键 - 它是char值,或-1表示EOF 。所以:问题不在于它返回零。问题是它返回密钥的ASCII值。你需要转换。例如:

int i = Console.Read();
if(i < 0) return 0;
char c = (char)i;
return (int)(c - '0');

答案 1 :(得分:3)

使用Console.Read方法时应谨慎,因为它只读取标准输入流中的下一个键,但会阻塞,直到用户按下Enter。然后,通过后续调用Console.Read返回第一个之后的任何其他字符。

看看下面的例子:

Console.WriteLine("Enter 1 or 2: ");
int i = Console.Read(); // Here the user types: 12[Enter]
// The value of 'i' is now 49 (the ASCII value of 1)

// Later we do this:
Console.WriteLine("Enter 3 or 4:");
int j = Console.Read();
// The value of 'j' is now 50 (the ASCII value of 2), and the code keeps running!
// There is no pause to wait for user input, since there was already some in the cache

你应该做什么

有两种更常见的方式可以从用户那里获得输入:Console.ReadLine(),它返回用户输入的整个字符串(按'Enter'后),或Console.ReadKey(),返回{ {1}}他们按下的键的表示。

您可以将ConsoleKeyInfo与您的代码完全一致地使用,这可能是最好的:

ReadLine

但是,如果您不希望他们必须按'Enter',您可以执行以下操作,通过调用{{1}上的double decoration = Convert.ToDouble(Console.ReadLine()); 获取用户键入的下一个字符的字符串表示形式ToString()对象的属性:

KeyChar

添加一些验证

但是如果用户输入的字符串无法转换为double,会发生什么?在这种情况下,ConsoleKeyInfo将抛出异常。为避免这种情况,我们可以使用double decoration = Convert.ToDouble(Console.ReadKey().KeyChar.ToString()); ,如果转换成功则返回Convert.ToDouble并将double.TryParse参数设置为转换后的值。现在我们可以这样做,检查输入是否有效:

true

但我们现在必须要求他们再次输入,对吗?如果它再次失败......好吧,我们需要一个循环:

out

现在它将继续循环,直到用户输入有效的双精度。

使代码可重复使用

好的,好的,现在我们有办法验证输入,但是每次我们需要从用户那里获得双倍时,我们是否真的想编写该循环代码?一个更好的想法可能是创建一个为我们做的方法,它接受一个字符串提示显示给用户,并返回正确的类型。我们甚至可以添加一些“边界”参数,以强制数字介于最小值和最大值之间:

double decoration;

if (!double.TryParse(Console.ReadLine(), out decoration))
{
    Console.WriteLine("The value you entered is not a valid double.");
}

现在,使用此代码,我们需要做的就是:

double decoration;

while (!double.TryParse(Console.ReadLine(), out decoration))
{
    Console.WriteLine("The value you entered is not a valid double.");
    Console.Write("Please Choose decoration 1 or 2: ");
}