匿名クラス

匿名クラスの作成を利用すると「名前のないクラス」を定義できる。以下例
           StackPanel1.DataContext = new
           {
               Person = new[]
               {
                   new {FirstName="生徒",LastName="山下"},
                   new {FirstName="先生",LastName="太郎"},
               }
           };
上記の様に「new {};」でガワを作り中身「First="生徒"」を書くという感覚で作成すると良い。
配列の場合は「new[] {};」として、中身でもう一度「new {},」を作る感じ

これをWPFで利用する場合
   <StackPanel x:Name="StackPanel1">
       <DataGrid ItemsSource="{Binding Path=Person}" IsSynchronizedWithCurrentItem="True"/>
       <TextBlock Text="{Binding Person/LastName}"/>
   </StackPanel>
等のようにできて便利である

<匿名クラスの制限>
定義可能なのはパブリック (public) メンバーのみ
全てのフィールドは初期化が必須
static に出来ない
メソッドの定義も出来ない

プロパティを利用するメリットとは?

参考資料:連載! とことん C#: 第 5 回 フィールド (メンバ変数) とプロパティはここが違う 言語: C#
「アクセサとして使用する」の項目に注目。「アクセサを "付ける/付けない" で大幅に構文が変化してしまうようなプログラミング言語では、「最初から必ずアクセサを付ける習慣を身に付けておきましょう」という原則が提唱されることがあります。しかし、上記のように、利用する構文がほぼ同じ C# では、「必要とされるまでアクセサを付ける行為を延期させてもよい」と考えることができます。」との一文がアリ。
プロパティ化して「エラー 変数ではないため、'~' の戻り値を変更できません。」というようなエラーを出して悩むより /// <summary> を充実させるほうを優先した方がいいと個人的に思う
なお外部に公開するメンバー変数や構造体は頭文字を大文字にしてプロパティとあわせておくと、後の改変がやりやすいと思われる

foreach内での注意点

foreachループ内で参照しているコレクションの要素をremoveなどするとコンパイラーはエラーを出す(その点でforeachは読み出し専用もしくは抽出専用のループと考えるべき?)
基本的にループ内でコレクションの要素に対し削除や追加を行う場合はforループを利用する必要がある
削除した際はインデクサがズレるのでインデクサのインクリメントの位置や条件を工夫する事

<例>
           for (int i = 0; i < elementListProvider.ElementList.Count;) 
           { 
               Element item=elementListProvider.ElementList[i]; 
               item.Update(gameTime); 
               if (item.IsFinish)      //ここでIsFinishを確認してtrueならコレクションから取り除く 
               { 
                   elementListProvider.ElementList.Remove(item); 
               } 
               else 
               { 
                   i++; 
               } 
           } 

0の除算

「0を割る」のはOKだが、「0で割る」のはNG
           int test = 0;
           test = 0 / 2;   //OK
           test = 2 / 0;   //NG!

usingを利用したリソースの解放

C#言語ではusingを利用することで自動的にIDisposableインターフェイスを実装するオブジェクトを開放します

<例>
using Microsoft.Xna.Framework;

namespace XNATest2
{
   class Test
   {
       public static void Main()
       {
           using (Game game = new Game())
           {
               game.Run();
           }
       }
   }
}
using文はブロックを抜け出す時に指定したIDisposableを実装するオブジェクトのDisposeメソッドを自動的に呼び出します
これによりガベージコレクションに任せず任意にアンマネージ、マネージに関わらずリソースの確保、解放が可能となります

<用語>
ガベージコレクション プログラムが動的に確保したメモリ領域のうち、不要になった領域を自動的に解放する機能。プログラマが明示的にメモリの確保・解放を行う必要がなくなる
マネージリソース .NET Frameworkから見て管理内のリソース
アンマネージリソース .NET Frameworkから見て管理外のリソース

Disposeメソッドを持つ(IDisposableインタフェースを実装している)クラスのオブジェクトは SafeHandleやSecureString、FileStream、StreamReader/StreamWriter、Socket、Graphicなど.NET Framework上に多数あります(これらは内部に他のマネージリソースなりアンマネージリソースなりを保持しています)
最終更新:2012年10月25日 01:12