Repeat 拡張メソッドで指定したオブジェクトをコピーしたシーケンスを生成する
(2017/03/14 10:28:38 created.)
Repeat 拡張メソッドは同一オブジェクトを指定した数だけ連続させたシーケンスを生成します。
Person.cs
namespace Tips_Linq
{
using System;
/// <summary>
/// 人物データを表します。
/// </summary>
public class Person
{
/// <summary>
/// 氏名を取得または設定します。
/// </summary>
public string Name { get; set; }
/// <summary>
/// 年齢を取得または設定します。
/// </summary>
public int Age { get; set; }
}
}
Program.cs
namespace Tips_Linq
{
using System;
using System.Linq;
class Program
{
static void Main(string[] args)
{
var n = 1;
var numbers = Enumerable.Repeat(n, 4);
foreach (var number in numbers)
{
Console.WriteLine(number);
}
Console.WriteLine("値を変更します。");
n = 3;
foreach (var number in numbers)
{
Console.WriteLine(number);
}
var person = new Person() { Name = "田中 淳平", Age = 37 };
var people = Enumerable.Repeat(person, 4);
foreach (var p in people)
{
Console.WriteLine(p.Name + " (" + p.Age + ")");
}
Console.WriteLine("プロパティ値を変更します。");
person.Name = "佐藤 淳平";
person.Age = 40;
foreach (var p in people)
{
Console.WriteLine(p.Name + " (" + p.Age + ")");
}
Console.ReadKey();
}
}
}
上記の例では、始めに値型である int 型の変数 n を使ってシーケンスを生成しています。値がコピーされたシーケンスなので、シーケンス生成後に変数 n の値を変更しても生成したシーケンスに影響ありません。
一方、参照型である Person クラスの変数 person を使ってシーケンスを生成すると、値がコピーされて生成されるため、シーケンスの中のすべての要素は変数 person の参照先を参照することになります。したがって、シーケンス生成後に変数 person のプロパティ値を変更すると、生成したシーケンスのすべての要素に影響します。
値型と参照型の違いのイメージは次のようになります。
Tweet