【问题标题】:Difference between void method and return value methodvoid方法和返回值方法的区别
【发布时间】:2018-01-07 01:58:42
【问题描述】:

在以下示例中,我有两种方法可以做同样的事情:

 public class Program
{
    int result=0;
    int result2= 0;

    public void Add(int num1, int num2){

        result = num1 + num2;
    }

    public int Add2(int num1, int num2){

        return result2 = num1 + num2;
    }


    public static void Main(string[] args)
    {
        Program program = new Program();

        program.Add(5,6);
        Console.WriteLine(program.result);

        program.Add2(4,2);
        Console.WriteLine(program.result2);
    }
}

我知道 void 方法没有返回值,所以在上面的示例中,当我调用 Add(int num1, int num2) 时,它不会将结果返回给全局变量吗?

如果是这样,为什么当我打印变量时它会在添加后打印出结果?不应该打印出0吗?

【问题讨论】:

  • 它不会将任何类型返回给调用代码,但它会将添加的值赋给全局变量
  • void 方法没有返回任何东西。您正在设置本质上是全局变量的内容。 void 方法允许有副作用。
  • "不是将结果返回给全局变量吗?" - 好吧,它正在为result 字段分配一个值。这并不是真正的“返回结果”——它只是为变量赋值。请注意,当您调用 Add2 方法时,您忽略了返回值...碰巧在 return 语句中,您将值分配给 result2

标签: c#


【解决方案1】:
public class Program
{
    int result=0;
    int result2= 0;

public void Add(int num1, int num2){

    result = num1 + num2;
    Console.WriteLine(result);
}

public int Add2(int num1, int num2){

    return result2 = num1 + num2;
}


public static void Main(string[] args)
{
    Program program = new Program();

    program.Add(5,6);
    Console.WriteLine(program.result);

    program.Add2(4,2);

}

【讨论】:

    【解决方案2】:

    这两种方法是相同的,因为它们都有意想不到的副作用——通常是你真正想避免的。

    第一个方法不会立即返回结果——它只是设置全局变量。第二种方法既返回一个即时结果设置全局变量。方法不返回立即结果这一事实并不意味着它不能更改任何“全局”(类或实例级)字段。

    首选的变体是返回一个没有任何副作用的即时结果,如下所示:

    public static int Add(int a, int b)
    {
        return a + b;
    }
    

    在你的课堂上,你会这样称呼它

    result = Program.Add(6, 3);
    

    【讨论】:

      【解决方案3】:

      当我调用 Add.. 时,它不会将结果返回给全局变量吗?

      没有。您没有全局变量。您有 2 个类字段。在内部,您的两种方法都做同样的事情!他们将计算结果分配给类字段。因此结果被保存并可以在main方法中访问:

      Console.WriteLine(program.result2);
      

      不应该打印出0吗?

      否,因为类字段已使用结果值初始化。

      第二种方法是在计算和赋值后额外返回变量result2!真正的区别在于,您可以立即在 main 中使用第二种方法的返回值:

      int n = program.Add2(4,2);
      

      【讨论】:

        【解决方案4】:

        在你的主要方法中你可以做

        public static void Main(string[] args)
        {
            Program program = new Program();
        
            int addedValue = Add2(4,2);
            //Work with addedValue
            Console.WriteLine(addedValue);
        }
        

        但是如果你尝试int addedValue = program.Add(5,6);,你会得到一个编译器错误。

        【讨论】:

          【解决方案5】:

          您的Add 方法正在设置一个成员变量(结果),因此为什么在您执行该方法并打印出结果后值为 11。

          【讨论】:

            【解决方案6】:

            void 方法不会将任何类型返回给调用代码,但它会将加法的值赋给全局变量。

            无效消息会影响类中字段的状态/值

            【讨论】:

              【解决方案7】:

              方法本身不返回任何值,但这并不意味着它不能更改实例字段的值。您有一个名为 result 的字段,并且您在方法中为其分配了一个值,因此该值存储在 result 中,这就是它在控制台中打印的原因。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2015-10-03
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-11-24
                • 1970-01-01
                • 1970-01-01
                • 2016-02-12
                相关资源
                最近更新 更多