【问题标题】:C# values between functions函数之间的 C# 值
【发布时间】:2015-11-05 11:30:31
【问题描述】:

所以我学习了基本的 C#,想知道如何从 AGE();NUMBER(); 返回 xy 并在 Name(); 中使用这些变量

现在Name(); 参数中的xy 是可以理解的错误,因为构造函数中没有局部变量。但我从函数中返回了xy。那么如何在 Name 函数中使用它们呢?

namespace CSharp_001
{
    class Program
    {
        public Program()
        {
            Name(x, y);
            AGE();
            NUMBER();
        }
        public int AGE()
        {
            int x;
            Console.WriteLine(" And enter age: ");
            x = Console.Read();
            return x;
        }
        public int NUMBER()
        {
            int y;
            Console.WriteLine(" And favorite number: ");
            y = Console.Read();
            return y;
        }
        public void Name(int x, int y)
        {
            Console.WriteLine("Enter your name: ");
            string test = Console.ReadLine();
            Console.WriteLine("Hi " + test);
        }
        static void Main(string[] args)
        {
            new Program();
            Console.ReadLine();
        }
    }
}

【问题讨论】:

  • Program() 中的 x 和 y 声明在哪里?我还建议稍微调整一下代码的格式。现在的方式与 C# 不太一致。
  • 你不会在Name方法中使用xy,那么为什么还要麻烦传递它们呢?
  • Console.Read 是错误的函数!

标签: c# variables return


【解决方案1】:

在 c# 中,值的 Type 非常重要。当您从控制台读取时,您会得到一个字符串。但是,您的 Age()NUMBER() 函数返回 ints。声明为返回 int 的函数不能返回 string。您需要将这些值转换为int,然后才能返回它们:

public int AGE() {
    Console.WriteLine(" And enter age: ");
    return int.Parse(Console.Read());
}

修复这两个功能后,您可以像这样调用Name()

public Program()
{
    int x = AGE();
    int y = NUMBER();
    Name(x, y);
}

或者像这样:

public Program()
{
    Name(AGE(), NUMBER());
}

在任何一种情况下,如果您想将这些值传递给Name() 函数,则必须在调用Name() 之前解析对AGE()NUMBER() 的调用。控制台文本表示您希望Name() 中的提示出现在第一位。在这种情况下,您可以这样做:

public void Name()
{
    Console.WriteLine("Enter your name: ");
    string test = Console.ReadLine();
    Console.WriteLine("Hi " + test);
    int age = AGE();
    int number = NUMBER();
}

public Program()
{
    Name();
}

【讨论】:

  • Console.Read 返回 int - 按下字符的 ASCII 码。
  • 糟糕...我在想 ReadLine()
【解决方案2】:

出于教育目的:

public Program()
{
    var age = AGE();
    var num = NUMBER(); 
    Name(age, num);
}

【讨论】:

    【解决方案3】:

    当一个函数返回一个值时,你需要存储它或立即使用它。如果你看看你的例子,在 AGE 方法中,你有

        x = Console.Read();
    

    Console.Read 正在返回您存储在 x 中的值。但是这个 x 对于 AGE 方法来说是本地的,没有其他被称为 x 的东西会有那个值(它的范围是 AGE 方法的本地)。 AGE 方法返回此值,但这并不意味着您可以在其他任何地方使用变量 x。

    在 Program 构造函数中调用 AGE 时,需要保存其返回值。如果您保存了该值,则可以将其作为参数传递给 Name。

        int age = AGE();
        Name(age, y);
    

    (假设 y 由您对 NUMBER 的调用设置)。当 Name 被调用时,您将能够使用 x,并且它将具有您传入的值(上面称为 age)。

    【讨论】:

      【解决方案4】:

      几个cmets:

      • Console.Read 只读取一个字符并返回该字符的 UTF-16 代码 - 您应该改用 Console.ReadLine 并在必要时解析结果。
      • 函数应该被命名来描述它们做什么,所以GetAgeGetName是更合适的函数名称
      • 构造函数只能用于将对象初始化为可用状态。您的代码应该在 Main 函数中或在 Main 调用的 Program 的单独函数中。
      • 变量应该有有意义的名字。 xy 没有说明它们代表什么。

      所以这样的事情会更合适:

      class Program
      {
          public void Run()
          {
              int age = GetAge();
              int number = GetNumber();
              GetName(age, number);
          }
          public int GetAge(){
              string age;
              Console.WriteLine(" And enter age: ");
              age = Console.ReadLine();
              return int.Parse(x); // or TryParse and loop until the parse succeeds
          }
          public int GetNumber(){
              string number;
              Console.WriteLine(" And favorite number: ");
              number = Console.ReadLine();
              return int.Parse(number); // or TryParse and loop until the parse succeeds
      
          }
          public void Name(int x, int y)
          {
              Console.WriteLine("Enter your name: ");
              string test = Console.ReadLine();
              Console.WriteLine("Hi " + test);
          }
          static void Main(string[] args) {
              new Program().Run();
              Console.ReadLine();
          }
      }
      

      【讨论】:

      • Console.Read 返回输入流中字符从输入流编码转换为 UTF-16 后的下一个 UTF-16 编码单元。 (或者,如果没有更多的代码单元,则为 -1。)例如,如果您使用“?”作为输入读取两次,那么您会得到 55377、56429。
      猜你喜欢
      • 1970-01-01
      • 2019-11-13
      • 2018-01-08
      • 1970-01-01
      • 1970-01-01
      • 2018-06-09
      • 1970-01-01
      • 2021-09-17
      • 1970-01-01
      相关资源
      最近更新 更多