2007年10月31日

「C#プログラミングレッスン」続オブジェクト指向編

   このエントリーをはてなブックマークに追加 Clip to Evernote
Gushwell's C# Programing Page --「窓際プログラマーの独り言」別館で、メールマガジン『C#プログラミングレッスン』の「続オブジェクト指向編」をダウンロードできるようにしました。

interface, delegate, event, boxing について説明しいます。
  

Posted by gushwell at 20:10Comments(0)TrackBack(0)

2007年10月26日

C#3.0:Func デリゲート

   このエントリーをはてなブックマークに追加 Clip to Evernote
System名前空間に Func という味気ない名前のデリゲートがある。

public delegate TResult Func<TResult> ()
public delegate TResult Func<T, TResult>(T arg);
public delegate TResult Func<T1, T2, TResult> (T1 arg1,T2 arg2);
public delegate TResult Func<T1, T2, T3, TResult> (T1 arg1,T2 arg2,T3 arg3);
public delegate TResult Func<T1, T2, T3, T4, TResult> (T1 arg1,T2 arg2,T3 arg3,T4 arg4);

C#3.0では、このデリゲートの存在を知っていると何かと都合が良いらしい。
System.Linq 名前空間に定義されているメソッドも、このデリゲートを利用している。

このデリゲートは、引数を Tx型を受け取って、 TResult型を返すメソッドの定義なわけだが、
ちょっとこの使い方を試してみた。
C#1.1風に書くと、こんな感じだ。(もちろんC#1.1では、Genericが使えないので、コンパイルエラーになるが...)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication4 {
class Program {
static void Main(string[] args) {
ItemList<OrderDetail> details = GetDetails();

Func<OrderDetail, int> func = new Func<OrderDetail,int>(Foo);
int totalCount = details.Sum(func);
Console.WriteLine(totalCount);
}

static int Foo(OrderDetail detail) {
return detail.UnitCount;
}

static ItemList<OrderDetail> GetDetails() {
ItemList<OrderDetail> details = new ItemList<OrderDetail>();
details.Add(new OrderDetail(10, 50));
details.Add(new OrderDetail(5, 100));
return details;
}
}
class ItemList<T> : List<T> {
public int Sum(Func<T, int> selector) {
int sum = 0;
foreach (T item in this)
sum += selector(item);
return sum;
}

public double Sum(Func<T, double> selector) {
double sum = 0;
foreach ( T item in this )
sum += selector(item);
return sum;
}
}
class OrderDetail {
public int UnitCount;
public double UnitPrice;
public OrderDetail (int unitCount,double unitPrice) {
UnitPrice = unitPrice;
UnitCount = unitCount;
}
}
}

肝になるのは、Sumメソッドで、ここで、Funcを使っている。
何かの合計を求めるのだが、その「何か」を delegateとして外出ししてしまい、利用する側に指定させるというものだ。

以下の部分が、その利用する側の主要部分。

  Func<OrderDetail, int> func = new Func<OrderDetail,int>(Foo);
 int totalCount = details.Sum(func);

static int Foo(OrderDetail detail) {
return detail.UnitCount;
}


この部分を、順に C#3.0のやり方に書き換えていくと、

C#2.0の匿名メソッドを利用
  int totalCount = details.Sum(delegate(OrderDetail d) { return d.UnitCount; });

C#3.0のラムダ式を利用 (冗長版)
  int totalCount = details.Sum((OrderDetail d) => { return d.UnitCount; });

C#3.0のラムダ式を利用 (簡易版)
  int totalCount = details.Sum(d => d.UnitCount);

随分とすっきりした。

double totalUnits = details.Sum(d => d.UnitPrice * d.UnitCount);

といった使い方もできる。
  
Posted by gushwell at 22:02Comments(1)TrackBack(0)

2007年10月11日

外部dllをソリューションに追加

   このエントリーをはてなブックマークに追加 Clip to Evernote
あるVisual Studioのソリューションを見ていたら、以下のように、利用する外部dllをソリューションに追加していた。

MySolution
Library (ソリューションフォルダ)
  Microsoft.Practices.EnterpriseLibrary.Common.dll
Microsoft.Practices.EnterpriseLibrary.Logging.dll
Microsoft.Practices.ObjectBuilder.dll
...


物理フォルダも、Libraryというフォルダが作成してある。

なるほど。
これで、利用するdllをソース管理の対象にしているわけだ。
そうすれば、次回のレベルアップ時に、同じバージョンのdllを使うことができる。
それに、どんなdllを使っているのかも一目りょう然だ。

で、僕も同じような構造にしてみたのだけれど、いざ、プロジェクトで[参照の追加]をやろうとしたら、参照の追加ダイアログの[プロジェクト]タブのページには、上記dllは表示されない。

結局、[参照]タブのページで、フォルダを指定してあげなければいけない。
ちょっと面倒だな。まあ、でもそれには目をつむろう。
  
Posted by gushwell at 22:51Comments(2)TrackBack(0)

2007年10月10日

AssemblyInformationalVersion

   このエントリーをはてなブックマークに追加 Clip to Evernote
随分前の記事で、製品バージョンを設定するのに、

[assembly: AssemblyInformationalVersion("Version 1.2")]

のような記述ができるって書いたけど、

[assembly: AssemblyInformationalVersion("4.5.6.7")]

て書けば、
FileVersionInfoオブジェクトのProductMajorVersionm, ProductMinorVersionなどのプロパティで、数値を取得できる。
ちなみに、FileVersionInfoは、FileVersionInfo.GetVersionInfoで取得できる。  
Posted by gushwell at 22:10Comments(0)TrackBack(0)

2007年10月09日

項目テンプレートのバグ

   このエントリーをはてなブックマークに追加 Clip to Evernote
独自の項目テンプレート(ZIPファイル)を作成し、これを、

My Documents\Visual Studio 2005\Templates\ProjectTemplates\ItemTemplates\Visual C#

のフォルダ下にサブカテゴリ用に独自のフォルダを作成し配置します。

このやり方は、MSDNに載っているやり方なのですが、こうすると、

ソリューションエクスプローラのコンテキストメニューで、「クラスの追加」を選択しても、独自のサブカテゴリが開いた状態になってしまい、クラスアイコンが選択状態になりません。
「フォームの追加」なども同様です。

いちいち、上位フォルダに戻って、「クラス」を選択しなおさなくてはなりません。

これは、Visual Studio 2005 のバグです。

この回避方法は、独自フォルダの中に、よく利用する標準の項目テンプレートZIPファイルをコピーすればよいのですが、あまり良い方法ではありません。

修正予定もないそうです。

でも、次期製品である Visual Studio 2008 では、このバグは直っているようです。ベータ版で確認しました。

  
Posted by gushwell at 21:22Comments(0)TrackBack(0)

2007年10月03日

Vista:昇格確認ダイアログを無効化

   このエントリーをはてなブックマークに追加 Clip to Evernote
Vistaに乗り換えたのだが、UACはやはり鬱陶しい。
今まで利用していたプログラムをスタートアップに入れたら、いちいち昇格ダイアログが出てくる。これじゃ使えない。

この昇格ダイアログを出さなくする方法ってないのだろうか。
調べてみたら、こんなページが見つかった。
UAC を無効化しないで 管理者での昇格確認ダイアログを表示させない方法

これと、UACを無効にする違いがよく分からない。
今まで、Vistaについては全く無関心だったが、もうすこしアンテナの感度を高めることにしよう。
  
Posted by gushwell at 23:56Comments(0)TrackBack(0)

2007年10月02日

応答なし

   このエントリーをはてなブックマークに追加 Clip to Evernote
Visual Studio 2005 のチームエクスプローラを Vista にインストールしたら、
コピー中のダイアログのタイトルが...

これはないんじゃないの?


TFSインスト

  
Posted by gushwell at 22:59Comments(0)TrackBack(0)