for WPF developers
Home Profile Tips 全記事一覧

Repeat 拡張メソッドで指定したオブジェクトをコピーしたシーケンスを生成する

(2017/03/14 10:28:38 created.)

Repeat 拡張メソッドは同一オブジェクトを指定した数だけ連続させたシーケンスを生成します。

Person.cs
  1. namespace Tips_Linq
  2. {
  3.     using System;
  4.  
  5.     /// <summary>
  6.     /// 人物データを表します。
  7.     /// </summary>
  8.     public class Person
  9.     {
  10.         /// <summary>
  11.         /// 氏名を取得または設定します。
  12.         /// </summary>
  13.         public string Name { get; set; }
  14.  
  15.         /// <summary>
  16.         /// 年齢を取得または設定します。
  17.         /// </summary>
  18.         public int Age { get; set; }
  19.     }
  20. }
Program.cs
  1. namespace Tips_Linq
  2. {
  3.     using System;
  4.     using System.Linq;
  5.  
  6.     class Program
  7.     {
  8.         static void Main(string[] args)
  9.         {
  10.             var n = 1;
  11.             var numbers = Enumerable.Repeat(n, 4);
  12.             foreach (var number in numbers)
  13.             {
  14.                 Console.WriteLine(number);
  15.             }
  16.  
  17.             Console.WriteLine("値を変更します。");
  18.             n = 3;
  19.             foreach (var number in numbers)
  20.             {
  21.                 Console.WriteLine(number);
  22.             }
  23.  
  24.             var person = new Person() { Name = "田中 淳平", Age = 37 };
  25.             var people = Enumerable.Repeat(person, 4);
  26.             foreach (var p in people)
  27.             {
  28.                 Console.WriteLine(p.Name + " (" + p.Age + ")");
  29.             }
  30.  
  31.             Console.WriteLine("プロパティ値を変更します。");
  32.             person.Name = "佐藤 淳平";
  33.             person.Age = 40;
  34.             foreach (var p in people)
  35.             {
  36.                 Console.WriteLine(p.Name + " (" + p.Age + ")");
  37.             }
  38.  
  39.             Console.ReadKey();
  40.         }
  41.     }
  42. }


上記の例では、始めに値型である int 型の変数 n を使ってシーケンスを生成しています。値がコピーされたシーケンスなので、シーケンス生成後に変数 n の値を変更しても生成したシーケンスに影響ありません。

一方、参照型である Person クラスの変数 person を使ってシーケンスを生成すると、値がコピーされて生成されるため、シーケンスの中のすべての要素は変数 person の参照先を参照することになります。したがって、シーケンス生成後に変数 person のプロパティ値を変更すると、生成したシーケンスのすべての要素に影響します。

値型と参照型の違いのイメージは次のようになります。

(a) 値型を対象とする Repeat 拡張メソッド

(b) 参照型を対象とする Repeat 拡張メソッド