C#プログラミングレッスン  RSSを登録する

C#を基礎から解説するメールマガジンです。このメールマガジンで、C#プログラミングをマスターしましょう。
バックナンバーは、こちら(http://gushwell.ifdef.jp/magArchive.html)からダウンロードできます。

最新号をメルマガでお届けします    
登録 解除

規約に同意して

登録した方には、まぐまぐの公式メルマガ(無料)をお届けします。
2009/12/15

【C#プログラミングレッスン】 No.235-FxCopに学ぶ(17): CA1000

■━ [C#プログラミングレッスン] ━━━━━━━━━━━━━ No.235 ━□
  
 「FxCopに学ぶ編」 -- CA1000: 
                      Do not declare static members on generic types
                                                         by Gushwell  
□━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━■

今回が「FxCopに学ぶ編」の最終回です。
実は「FxCopに学ぶ編」をはじめるにあたって、20ほどのルールをピックアッ
プし、下書きは書いたもののボツにしたルールがいくつかあります。それらの
ルールについては、僕のブログ(http://gushwell.ldblog.jp/)のほうで紹介し
ていますので、併せてそちらもご覧ください。

1).シールされた型にプロテクト メンバを宣言しないでください
   http://gushwell.ldblog.jp/archives/51925853.html
2).標準の例外コンストラクタを実装します
   http://gushwell.ldblog.jp/archives/51925858.html
3).シリアル化コンストラクタを実装します
   http://gushwell.ldblog.jp/archives/51928152.html
4).ISerializable を正しく実装します
   http://gushwell.ldblog.jp/archives/51930014.html
5).破棄できるフィールドは破棄します
   http://gushwell.ldblog.jp/archives/51931175.html
6).IDisposable を正しく実装します
   http://gushwell.ldblog.jp/archives/51931181.html
7).Dispose メソッドから基本クラスの破棄を呼び出します
   http://gushwell.ldblog.jp/archives/51937020.html

では、本題に入りましょう。

■□─────────────────────────────────
■□ CA1000: Do not declare static members on generic types

以下のコードの問題点は?

 public static class Hoge<T> {
     public static T[] Foo(T obj, int n) {
         T[] array = new T[n];
         for (int i = 0; i < n; i++)
             array[i] = obj;
         return array;
     }
 }


問題となるのは、ジェネリッククラスの中に、静的なメソッドが定義してある
点です。これを利用するコードは、たとえば、以下のようなコードになります。

 var x = Hoge<string>.Foo("Hello", 10);

でも、いちいち <string>と型を指定するのは面倒です。
型指定を省略させるには、Hogeクラスを以下のように変更します。

 public static class Hoge {
     public static T[] Foo<T>(T obj, int n) {
         T[] array = new T[n];
         for (int i = 0; i < n; i++)
             array[i] = obj;
         return array;
     }
 }

ジェネリッククラスを通常のクラスに戻し、メソッドをジェネリックメソッド
にします。こうすれば、コンパイル時にメソッドの型推論が働きます。
     
 var x = Hoge.Foo("Hello", 10);
 
と書けますので、いちいち<string>と書く必要がなくなります。

ジェネリッククラスに静的なメソッドを定義したくなったら、上記のようにジ
ェネリックなメソッドにできないかを考える必要があります。
とは言っても、他のメソッドとの関係から、ジェネリッククラスとして定義し
たい場合もあります。このとき、staticメソッドも必要ならば、このstaticメ
ソッドだけを別クラスに移動することも検討してください。


このルールは絶対に守らなくてはいけないルールではありません。しかし、型
推論を有効に働かせるためのテクニックとして知っておいたほうが良いと思い
ます。

■ 参照MSDNページ
  CA1000: ジェネリック型の静的メンバを宣言しません
  http://msdn.microsoft.com/ja-jp/library/ms182139.aspx


----------------------------------------------------------------------
今回で、「FxCop編」はおしまいです。
いかがでしたでしょうか。紹介したものは、FxCopのルールの1割にも満たなか
ったと思いますが、この「FxCop編」が行儀の良いコードとはを考えるきっか
けになっていただけたのではないでしょうか。

----------------------------------------------------------------------
さて次回ですが、今年いっぱいお休みをいただいた後に、「どう書く?org編」
を始めようと思います。
「どう書く?org編」では、「どう書く?org」(http://ja.doukaku.org/) と
いうサイトで出されているプログラムのお題をGushwellが書くとどういったコ
ードになるかを簡単な解説と共に示していこうと考えています。

それでは、来年お会いしましょう。少し早いですが、みなさん良いお年を!

 ☆メールマガジンの感想、ご意見、励ましのメールお待ちしています☆
  http://gushwell.ifdef.jp/mail.html

---- PR --------------------------------------------------------------
NETのクラス設計ガイドライン 108のコーティング標準と設計パターン
Krzysztof Cwalina Bard Abrams (著) 
http://www.amazon.co.jp/exec/obidos/ASIN/4891006765/csharplesson-22/


───────────────────────────────────
『C#プログラミングレッスン』  (ぼぼ週刊)
───────────────────────────────────
 Published by Gushwell.
  Copyright (C) 2004-2009 Gushwell All rights reserved.
  Microsoft MVP - Visual C#(Apr 2005 - Mar 2010)

 <<■ Gushwell's Page ■>>
 窓際プログラマ─の独り言  :http://gushwell.ldblog.jp/
 窓際プログラマ─の読書三昧:http://gushwell.jugem.jp/
 Gushwell's F# Programming Diary : http://techbank.jp/gushwell/
 Gushwell's C# Programming Page  :http://gushwell.ifdef.jp/
  C#デザインパタ─ン : http://gushwell.ifdef.jp/dp/csdpindex.html

 <<■ コミュニティtechbank.jp (http://techbank.jp/Community/) ■>>
 Gushwellが参加している技術系コミュニティです。
 マイクロソフト系テクノロジー&製品に特化したコミュニティで、Webサイト
 では、VB、C#、VC++、SQL Server, BizTalk Server などの技術情報を公開し
 ています。皆さんの参加をお待ちしています。
 ブロガーさんも募集中です。
───────────────────────────────────
最新号をメルマガでお届け
登録 解除

規約に同意して

登録した方には、まぐまぐの公式メルマガ(無料)をお届けします。
上へ戻る