C#値渡しと参照渡し

1.はじめに

  C#でパラメーターを渡す方法は、値渡しと参照渡しの2つのカテゴリーに分けることができます。パラメータの種類によってさらに細かく分類すると、大きく分けて次の4つの種類があります。

  • 値渡し
  • 参照型の値渡し
  • 参照による値
  • 参照渡し

  文字列型は特別な参照型であり、パラメータとして渡された場合、そのパフォーマンスは他の参照型と一致しないと考える人もいます。しかし、現象を通して本質を見ると、深く分析し、文字列型がパラメーターとして渡すことに関して他の参照型と変わらないことがわかります。

第二に、4つの配信方法の分析

  1.値ごとの転送

  値渡しの場合、過去は値型インスタンスのコピーです。

1 public static int Add(int i、int j)
 2 { 
 3 i = i + 1; 
 4 Console.WriteLine(i); 
 5 i + jを返します。
 6} 
 7 ...... 
 8 static void Main(string [] args)
 9 { 
10 int a = 1; 
11 Add(a、5); 
12 Console.WriteLine(a); 
13}    

  結果は次のとおりです。

  2.参照型は値で渡される

  値渡しの場合、過去は参照型インスタンスの参照のコピーであり、明確ではない可能性があり、誤解を招きやすい。いわゆる参照は、スタック上に割り当てられた小さなメモリ領域であり、マネージヒープ上の参照型インスタンスのアドレスを格納します。参照型が値で渡されると、実際には参照がスタックにコピーされてからメソッドに渡されます。これにより、スタック上の2つの参照がマネージヒープ上の同じインスタンスを指すようになります。したがって、これは、次の2つの方法の結果に一貫性がない理由を説明できます。

1クラスPerson 
 2 { 
 3 public string Name {get; セットする; }     
 4} 
 5 ...... 
 6 static void ChangePerson(Person person)
 7 { 
 8 person = new Person(); 
 9 person.Name = "名前の変更"; 
10 Console.WriteLine(person.Name); 
11} 
12 
13 static void ChangeName(Person person)
14 { 
15 person.Name = "Changing Name"; 
16 Console.WriteLine(person.Name); 
17}   
18 ...... 
19 //引用型の型
20名person person = new Person(){Name = "Old"}; 
21 ChangeName(person);
22 Console.WriteLine(person.Name); 
23
24 //参照型の値渡し
25 person = new Person(){Name = "Old"}; 
26 ChangePerson(person); 
27 Console.WriteLine(person.Name);

操作結果は次のとおりです。

  3.参照渡しの値タイプ

  参照渡しのコピー操作はありません。ご存知のとおり、値型インスタンスはスタックに割り当てられるため、値型が参照渡しされると、スタック上のインスタンスのアドレスが実際に渡されます。方法。

1 public static int Add(ref int i、int j)
 2 { 
 3 i = i + 1; 
 4 Console.WriteLine(i); 
 5 return i + j; 
 6} 
 7 ...... 
 8 //値タイプ参照により
 9 int a = 1; 
10 Add(ref a、5); 
11 Console.WriteLine(a);  
操作結果は次のとおりです。

  4.参照型の参照渡し

  参照型の参照渡しプロセスは値型のプロセスと似ており、コピー操作はなく、スタック上の「このインスタンスの参照」のアドレスのみがメソッドに渡されます。

1クラスPerson 
 2 { 
 3 public string Name {get; セットする; }     
 4} 
 5 ...... 
 6 static void ChangeNameRef(ref Person person)
 7 { 
 8 person.Name = "Changing Name"; 
 9 Console.WriteLine(person.Name); 
10} 
11 static void ChangePerson(ref Person person)
12 { 
13 person = new Person(); 
14 person.Name = "名前の変更"; 
15 Console.WriteLine(person.Name); 
16}     
17 //引用型の添引用
18 person = new Person(){Name = "Old"}; 
19 ChangeNameRef(参照者); 
20 Console.WriteLine(person.Name);
21 
22 person = new Person(){Name = "Old"}; 
23 ChangePerson(ref person); 
24 Console.WriteLine(person.Name);

操作結果は次のとおりです。

PS:一部の人々は、参照型の参照による受け渡しは値による受け渡しと何ら変わりはなく、参照型にrefとoutを追加しても意味がないと考えています。上記の計算結果を比較することで知ることができ、実はこの理解は間違っています。

3.文字列型は、パラメーターの受け渡しに関して他の参照型と異なりますか?

  文字列型は特別な参照型です。その特殊性は何ですか?これは主題とはほとんど関係がありません。その特性の1つを理解するだけで済みます。文字列型の値が変化すると、それは他の型を実行することと同等です参照タイプの新しい操作は正確ではないため、ここで詳しく説明する必要はありません。文字列型の特殊性を理解する必要があります、Baiduをご自身で作成してください!)これはまさにこの機能が原因です。値で渡す場合、文字列型と他の参照型の外観は少し異なります。しかしながら、文字列型のこの特性によれば、値による文字列型の第2の方法の実行は、値による上記の参照型の第2の方法の実行と同じである。

1 //文字列型は値によって渡されます
 2 static void ChangeStr(string aStr)
 3 { 
 4 aStr = "Changing"; 
 5 Console.WriteLine(aStr); 
 6} 
 7 //文字列型は参照によって渡されます
 8 static void ChangeStrRef(ref string aStr)
 9 { 
10 aStr = "Changing"; 
11 Console.WriteLine(aStr); 
12} 
13 ...... 
14 //文字列型の値渡し
15 string str = "Old"; 
16 ChangeStr(str ); 
17 Console.WriteLine(str); 
18 
19 //文字列型は参照渡し
20 str = "Old"; 
21 ChangeStrRef(ref str);
22 Console.WriteLine(str);

操作結果は次のとおりです。

この記事は次から転送されます:https : //www.cnblogs.com/Suanzhai/p/4052545.html

 

おすすめ

転載: www.cnblogs.com/YourDirection/p/12700948.html