在下面的例子中,我有两个方法可以做同样的事情:
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 :(得分:2)
这两种方法都是平等的,因为它们会产生意想不到的副作用 - 通常是你真正想要避免的。
第一种方法不会返回立即结果 - 它只是设置全局变量。第二种方法都返回立即结果和设置全局变量。方法不能立即返回结果的事实并不意味着它不能改变任何"全局" (类或实例级)字段。
首选变体是返回立即结果,没有任何副作用,如下所示:
java.lang.Object.hashCode()
在你的课堂上,你会称之为
public static int Add(int a, int b)
{
return a + b;
}
答案 1 :(得分:1)
方法本身不返回任何值,但这并不意味着它不能更改实例字段的值。您有一个名为result
的字段,并且您在方法中为其分配了一个值,因此该值存储在result
中,这就是它在控制台中打印的原因。
答案 2 :(得分:1)
当我调用Add ..是不是将结果返回给全局变量?
没有。您没有全局变量。你有2个类字段。在内部,你的方法都做同样的事情!他们将计算结果分配给类字段。因此保存结果,可以在主方法中访问:
Console.WriteLine(program.result2);
它不应该打印出来吗?
否,因为类字段已使用结果值初始化。
第二种方法是在计算和赋值后另外返回变量result2
!真正的区别在于你可以在main中使用第二种方法的返回值:
int n = program.Add2(4,2);
答案 3 :(得分:0)
void methodf不会将任何类型返回给调用代码,但它会将添加的值分配给全局变量。
Void消息可能会影响Class
中字段的状态/值答案 4 :(得分:0)
您的Add
方法正在设置成员变量(结果),因此在执行该方法并打印出结果后,为什么值为11。
答案 5 :(得分:0)
在你的主要方法中,你可以做到
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);
,则会出现编译错误。
答案 6 :(得分:-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);
}