[C#]データの参照を切りたいとき。

あるデータから一時的なデータを作成したい、とか一時変数にコピーし一時変数だけをいじりたい・・・なんてことを考えたりすることがあります。また、あるデータを引数とする関数を作ったんだけど、その関数内では引数を加工したりするけど、もとのデータ自体には影響したくないぜ!とかあると思う。

ここで問題なのはあるデータというのが何かってこと。値、構造体、クラス・・・。
値渡しや参照渡しっていう言葉を知らなかったり、他の言語の振る舞いになれてしまうと、うっかり変えたくないデータの値が変わってしまうという場合がよくあります。

データクラス

class Person
{
    public string Name{get;set;}
    public string Address{get;set;}
    public string Tel{get;set;}
}

class Persons
{
    public int ManageNumber{get;set;}
    public Person[] List{get;set;}
}

一時的な変数用を用意してからマスターデータをコピーし、一時変数をいじるようにする。

Persons master = GetPersons();

Persons temp = master;

temp.ManageNumber = 4;

上記の方法ではC++では意図した動きになるけど、C#では参照として渡されるだけなので、temp == マスターデータになる。

マスターデータを一時的な引数にして使いたい。

void SetNewData(Persons temp)
{
    tmep.ManageNumber = 4;
}

SetNewData(master);

上記の場合も同じ。C#ではクラス渡しは参照を渡していることと同じなので、マスターデータはそのまま書き換わる。

データのコピーはCloneインタフェースを使用したり、値型で構成された構造体にしたりすることで実現可能だけど、ちょっと面倒くさい。
そこで、少し条件があるけど、マスターデータの値をまるごとコピーする方法を使用する。

どんなオブジェクトでもコピーできる汎用のディープコピー処理
http://d.hatena.ne.jp/tekk/20100131/1264913887

こちらの方のやり方を使用すればデータをまるごとコピーできるので、もとのデータへの参照をぶった切ることができる。
使い方は簡単。object型の拡張メソッドだと次のやり方でOK。

一時変数にコピーする。

Persons master = GetPersons();

Persons temp = (Persons)master.DeepCopy();

temp.ManageNumber = 4;

引数として渡す。


void SetNewData(Persons temp)
{
    tmep.ManageNumber = 4;
}

SetNewData((Persons)master.DeepCopy());

ただし、これには元のデータのクラス宣言に属性を加えないといけない。自分でいじれるクラスでないと使用できないので注意。
Serializable属性を加えたデータクラス

[Serializable()]
class Person
{
    public string Name{get;set;}
    public string Address{get;set;}
    public string Tel{get;set;}
}

[Serializable()]
class Persons
{
    public int ManageNumber{get;set;}
    public Person[] List{get;set;}
}

このデータいじりたくねぇなぁとか、ちょっととっておく、とかいろいろ使い道があるので便利。

[上原ひろみ]Move Japan Tour 2012 高崎公演。

行ってきました。上原ひろみ ザ・トリオ・プロジェクト Move Japana Tour 2012 高崎公演。ひろみちゃんの高崎音楽祭に出演は2回目。前回は2007年のHiromi’s Sonicbloomの時でした。そのときひろみちゃんのMCは高崎の印象が出身地の浜松みたいって言っていたのを覚えています。

とにかく最高でした。その一言につきます。お客さんののりもよかったなぁ、年々思うことだけど、聞くほうのテンションが確実に熱くなっている!!今回のMoveはけっこうきめきめのりのりの曲が多いからかもしれないけど。すばらしかった。
ひろみちゃんのMCは、「高崎駅についたとき、駅前にも音楽祭のステージがあって街全体で音楽祭をやるのはすばらしいと思う」「前回出演したときに青のだるまをもらったけど、顔色が悪いのかなぁって思った。まただるまを持ち帰りたい」など、高崎のことについてふれていたのがよかったです。今回はちょっとMC少なめだったけど、曲に集中できたって感じでした。

最新アルバムMoveと前回のVoiceの曲をミックスしたセットリストでした。席がひろみちゃんの手元がよく見える席だったので、もうガン見。ひたすらガン見。やっぱりすげーなぁ、とか、頭おかしい、とか、人間じゃないとか、あーFFのボス戦のBGMきたー、とか、頭の中を駆け巡りました。

個人的に楽しみだったのが、Suite Escapismの組曲。ひろみちゃんの曲では組曲があったりしますが、この曲も全部で約30分という長い曲。1曲目のRealityは激しく、2曲目はFantasyはスローな感じ、そして3曲のIn Between でまた超絶テンション高い曲。この緩急のジェットコースターに乗っている感ったらなかった。2曲目以外に、For文のbreakがないんです。だから、ソロパートが終わったときの拍手ができないんです。もうなんていうか曲中に拍手する感じ。最高に気持ちよかったし、客席全体がのめりこんでいる感じがとても良かった。やったぜー群馬県民。もうグンマーなんて言わせない。

ひろみちゃんのソロはPlace to be。久々に聞きました。最近のひろみちゃんの傾向ですが、特にソロ曲はイントロを聞いただけでは何の曲か分かりません。Place to beはインプロのパートが少ないメロディな曲。ひろみちゃんってダイナミックな感じだけど、実はとてもスタティックな演奏もひとつの特徴。

アンコールは11:49PM。この曲はフジロックのときにも聞きました。フジロックの最前列で聞いていたとき、ちょっと客席から高いステージを上からライトが光の筋で照らしていて、神々しく思えた曲。最後のちょっとスローテンポなところのメロディがほんとにぐっとくる曲。Moveと11:49PMはほんとに最初と最後って感じがするなぁ。

次は、東京国際フォーラム。わーい♪