![](/img/trans.png)
[英]Following code throws Process is terminating due to StackOverflowException in the output. Why?
[英]Output of following code : Why would it return rainyday[1] = Sunday and not friday?
為什么返回雨天[1] =星期日而不是星期五? 在其他地方返回main()中定義的所有值
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攝氏度
由於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)根據引用類型保存結構在堆棧上的實際數據,該變量僅保存對堆上內存位置的引用(實際數據),而指針本身在堆棧上。 在下雨天[1] =星期日的情況下,您更改了原始數據,因為沒有副本,並且您正在處理原始數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.