以下代码的输出:为什么会返回rainyday [1] =星期日,而不是星期五?

问题描述:

它为什么会返回rainyday [1] =星期日而不是星期五?和其他地方返回在主()定义的所有值以下代码的输出:为什么会返回rainyday [1] =星期日,而不是星期五?

Namespace ConsoleApp_toTestYourself 
    { 
     public struct forecast 
     { 
      public int temp { get; set; } 
      public int press { get; set; } 
     } 


     class structStaticTest 
     { 
      public static void cts(string weather) { weather = "sunny"; } 
      public static void cta(string[] rainyDays) { rainyDays[1] = "Sunday"; } 
      public static void ctsr(forecast f) { f.temp = 35; } 

      static void Main(string[] args) 
      { 
       string weather = "rainy"; 
       cts(weather); //calling static method 
       Console.WriteLine("the weather is " + weather); 

       string[] rainyDays=new[]{"monday","friday"}; 
        cta(rainyDays); calling static method 
       Console.WriteLine("the rain days were on "+rainyDays[0]+" and "+ rainyDays[1]); 

       forecast f = new forecast { press = 700, temp = 20 }; 
       ctsr(f); //calling static method 
       Console.WriteLine("the temperature is " + f.temp + "degree celcius"); 
       Console.ReadLine(); 
      } 
     } 
    } 

它的输出是: 下雨天 星期一周日 20摄氏度

+1

您更改了rainyDays [1] =“Sunday”的值 – Peyman 2015-03-19 06:03:16

由于cta方法设置rainyDays[1]至周日:

public static void cta(string[] rainyDays) { rainyDays[1] = "Sunday"; } 

并且在写入控制台之前调用它:

cta(rainyDays); //calling static method 
Console.WriteLine("the rain days were on "+rainyDays[0]+" and "+ rainyDays[1]); 

编辑:关于你的静态方法之间的差异。其他方法不会更改传递的对象。

首先,cts不会改变字符串对象:

weather = "sunny"; 

不改变原有对象。它创建新的字符串对象"sunny"并将其分配给变量(方法参数)。

更多关于这个话题:

其次,ctsr接受结构forecast作为参数。结构体通过值传递,方法接收并操作原始结构体的副本。因此,您的更改对主要方法中的weather没有任何影响。

更多关于这个话题:

这是因为在C#中引用类型和值类型之间的差异,结构是值类型,当您收到一个结构作为一个参数会创建一个不同的副本,所以如果您更改其中一个副本,另一个不会更改。变量(f)保存堆栈中的结构实际数据,而不是引用类型,变量只保存对堆中的存储器位置(实际数据)的引用,并且指针本身位于堆栈上。如果是rainyday [1] =星期日,您更改了原始数据,因为没有副本,并且您正在处理原始数据。