風と博を書く---値のタイプと参照のタイプも話します

14823 ワード

ブログ園でダイビングして1年余り、半年前にブログを開いたのですが、ずっと放置されていて、この間趙さんのブログを見て、やっと真剣に何編か書くことにしました.ちょうど最近園子が「値タイプと参照タイプ」に関する話題を議論しているので、個人的な見解を話します.
直接実際のコードから出発して、まず最初のコードを見ます.
 

   
1 class Program
2 {
3 static void Main(string[] args)
4 {
5 int x = 1;
6 int y = x;
7 y = 2;
8
9 TestClass classX = new TestClass();
10 classX.Number = 1;
11
12 TestClass classY = classX;
13 classY.Number = 2;
14
15 Console.WriteLine("x:" + x);
16 Console.WriteLine("y:" + y);
17
18 Console.WriteLine("classX.Number:" + classX.Number);
19 Console.WriteLine("classY.Number:" + classY.Number);
20
21 }
22
23 public class TestClass
24 {
25 public int Number { get; set; }
26 }
27 }

ここでintは値タイプ、classは参照タイプである.コードの実行結果は次のとおりです.
x:1
y:2
classX.Number:2
classY.Number:2
値タイプxはyに割り当てられ、yの値が変更され、xは変更されないことがわかります.参照タイプclassXはclassYに値を割り当て、classYの属性値を変更し、classXの属性値も変更します.
コードを見てみましょう.
 

   
1 class Program
2 {
3 static void Main(string[] args)
4 {
5 TestStruct structX = new TestStruct();
6 structX.Number = 1;
7
8 AddStruct(structX);
9
10 Console.WriteLine("structX.Number:" + structX.Number);
11
12 TestClass classX = new TestClass();
13 classX.Number = 1;
14 AddClass(classX);
15
16 Console.WriteLine("classX.Number:" + classX.Number);
17
18 }
19
20 public class TestClass
21 {
22 public int Number { get; set; }
23 }
24
25 public struct TestStruct
26 {
27 public int Number { get; set; }
28 }
29
30 public static void AddClass(TestClass testClass)
31 {
32 testClass.Number += 1;
33 }
34
35 public static void AddStruct(TestStruct testStruct)
36 {
37 testStruct.Number += 1;
38 }
39 }

値タイプstructXと参照タイプclassXをそれぞれパラメータとして対応するメソッドに入力し、メソッドでNumber属性値を1加算します.コードの実行結果は次のとおりです.
structX.Number:1
classX.Number:2
その結果,メソッド実行後,値タイプstructXの属性値は変化せず,参照タイプの属性値は変化した.
 
実験結果と照らし合わせて、メモリ内の2種類の定義を見てみましょう.
値タイプインスタンスは、通常、スレッドのスタックに割り当てられ、インスタンスデータを指すポインタは含まれず、変数自体にインスタンスデータが含まれます.
参照タイプインスタンスは、管理スタック(managed heep)に割り当てられ、変数はインスタンスデータのメモリ参照を保存します.
私から見れば、参照タイプはc++のポインタのようなもので、参照タイプが変数に実際に値を割り当てるのはデータを指すメモリ参照アドレスです.
後で第1段のコードを分析して、classXはclassYに値を割り当てて、メモリの引用をclassYに値を割り当てることに相当して、2つの変数は同じアドレスを指して、だからclassYのNumber値が修正する時、classXの値もそれに従って変化します.
同様に第2セグメントコードを解析し,参照タイプをパラメータとしてメソッドに渡すと,実際のデータのメモリ参照が伝達される.メソッド内でメモリ参照が指す実際のデータを変更するとclassXの値も変化します.
 
値タイプと参照タイプの違いが分かったら、どの値タイプ、どの参照タイプを理解します.
.NETの値タイプはbyte,short,int,long,float,double,decimal,char,列挙enum,構造structなどである.
参照タイプはobject,string,class,interface,配列int[],依頼delegateなどである.
ここで最も特殊なのは参照タイプstringであり、上記の第1セグメントコードではclassをstringタイプに変更し、結果は値タイプintと同じである.分かりやすいように、とりあえずstringをnullとしてもよい値タイプと見なしましょう.
 
stringがなぜ特殊なのか、特殊なのはどこなのか、园子の早期に多くの优秀な文章があって、すべてひっくり返すことができて、ここは深く検讨しないで、私は王涛の本《あなたは知っていなければなりません.NET》を推荐して、この本はすでに印刷を停止して、しかし宝を洗ってコピー版を买うことができて、価格は半分安いです(海贼版を买うことを奨励しないで、しかしこれは正版を买うことができない仕方がありません彼を直接見に行くこともできます.
 
次に、値タイプに疑問符を付けてintなどの参照タイプになるなど、実際のプロジェクトでの値タイプと参照タイプの適用とテクニックを書いてみます.refやoutキーワードの使用など.「値タイプと引用タイプ」という腐った話題から自分のものを掘り出してほしい.