teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

修正

2018/02/18 13:15

投稿

Zuishin
Zuishin

スコア28675

answer CHANGED
@@ -91,9 +91,11 @@
91
91
  ChangeNoRef() でパラメータである t を書き換えています。
92
92
  しかし t はメソッド内ローカルであり、もともとの s に影響を及ぼしません。
93
93
  ですから s を出力した結果は Hello になります。
94
+ s の値である string オブジェクト(参照型)を渡しているので値渡しです。
94
95
 
95
96
  ChangeRef() でも t を書き換えています。
96
97
  これにより s は t と同じ値である World になります。
98
+ s の値ではなく参照を渡しています。
99
+ これが参照渡しです。
97
100
 
98
- これが参照渡しです。
99
101
  string は参照型ですが、値型を用いても全く結果は同じです。

1

追記

2018/02/18 13:15

投稿

Zuishin
Zuishin

スコア28675

answer CHANGED
@@ -49,4 +49,51 @@
49
49
  ```
50
50
 
51
51
  メソッドの中で変数の中身自体を変えています。
52
- これが参照渡しです。
52
+ これが参照渡しです。
53
+
54
+ ### 追記
55
+
56
+ 質問の追記を受けて。
57
+
58
+ ```C#
59
+ void Start()
60
+ {
61
+ string s = "Hello";
62
+ Console.WriteLine(s); // Hello
63
+ ChangeNoRef(s);
64
+ Console.WriteLine(s); // Hello
65
+ ChangeRef(ref s);
66
+ Console.WriteLine(s); // World
67
+ }
68
+
69
+ void ChangeNoRef(string t)
70
+ {
71
+ t = "World";
72
+ }
73
+
74
+ void ChangeRef(ref string t)
75
+ {
76
+ t = "World";
77
+ }
78
+ ```
79
+
80
+ この場合、出力は次のようになります。
81
+
82
+ ```
83
+ Hello
84
+ Hello
85
+ World
86
+ ```
87
+
88
+ string は List<T> と同じく参照型です。
89
+ 同じ挙動になると思ってください。
90
+
91
+ ChangeNoRef() でパラメータである t を書き換えています。
92
+ しかし t はメソッド内ローカルであり、もともとの s に影響を及ぼしません。
93
+ ですから s を出力した結果は Hello になります。
94
+
95
+ ChangeRef() でも t を書き換えています。
96
+ これにより s は t と同じ値である World になります。
97
+
98
+ これが参照渡しです。
99
+ string は参照型ですが、値型を用いても全く結果は同じです。