2005年03月31日

C#プログラミングレッスン 読者数

   このエントリーをはてなブックマークに追加 Clip to Evernote
メルマガ「C#プログラミングレッスン」読者数が499名となり、500名まであと1名となりました。毎週、少しずつですが、読者数が増えており、ありがたいことです。
今後も、継続して発行していけるよう頑張ります。  

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

2005年03月29日

構成ファイル(1)

   このエントリーをはてなブックマークに追加 Clip to Evernote
構成ファイルについて調べていたら、意外と奥が深いのに驚いてしまいました。通常は、
ConfigurationSettings.AppSettings[key];
でお手軽にデータを取得できますが、
<appSettings>
<add key="TempFolder" value="C:\MyApp\Temp\" />
<add key="MaxItems" value="100" />
<add key=“DEMO" value=“true" />
</appSettings>

と構成ファイルの記述がちょっと冗長です。これを
<myAppSettings
TempFolder="C:\MyApp\Temp\"
MaxItems="100"
DEMO="true" />

と書きたい場合に、AppSettingsは使えません。
では、どうするかというと...
続きは、明日以降 (最近ネタを探すのが大変なので(^^; ...  
Posted by gushwell at 21:47Comments(0)TrackBack(0)

2005年03月28日

ダブルディスパッチ

   このエントリーをはてなブックマークに追加 Clip to Evernote
ダブルディスパッチのサンプルとして、じゃんけんクラスを作ってみました。

public enum JyankenResult { Win, Lose, Draw }

public abstract class JyankenHand {
public abstract JyankenResult Fight(JyankenHand oponent);
public abstract JyankenResult FromChoki(Choki oponent);
public abstract JyankenResult FromGoo(Goo oponent);
public abstract JyankenResult FromPaa(Paa oponent) ;
}

public class Goo :JyankenHand {
public override JyankenResult Fight(JyankenHand hand) {
return hand.FromGoo(this);
}

public override JyankenResult FromChoki(Choki oponent) {
return JyankenResult.Lose;
}

public override JyankenResult FromGoo(Goo oponent) {
return JyankenResult.Draw;
}

public override JyankenResult FromPaa(Paa oponent) {
return JyankenResult.Win;
}

public override string ToString() {
return "グー";
}
}

public class Choki: JyankenHand {
public override JyankenResult Fight(JyankenHand hand) {
return hand.FromChoki(this);
}

public override JyankenResult FromChoki(Choki oponent) {
return JyankenResult.Draw;
}

public override JyankenResult FromGoo(Goo oponent) {
return JyankenResult.Win;
}

public override JyankenResult FromPaa(Paa oponent) {
return JyankenResult.Lose;
}

public override string ToString() {
return "チョキ";
}
}

public class Paa : JyankenHand {
public override JyankenResult Fight(JyankenHand hand) {
return hand.FromPaa(this);
}

public override JyankenResult FromChoki(Choki oponent) {
return JyankenResult.Win;
}

public override JyankenResult FromGoo(Goo oponent) {
return JyankenResult.Win;
}

public override JyankenResult FromPaa(Paa oponent) {
return JyankenResult.Lose;
}

public override string ToString() {
return "パー";
}
}

使い方はこんな感じ。
JyankenHand h1 = new Goo();
JyankenHand h2 = new Choki();
JyankenResult r = h1.Fight(h2);

if文が無いのに比較できるって、面白いですね。  
Posted by gushwell at 21:00Comments(1)TrackBack(0)

2005年03月26日

環境変数

   このエントリーをはてなブックマークに追加 Clip to Evernote
久しぶりに、環境変数を眺めて見たら、こんな、環境変数があることに気が付きました。
NUMBER_OF_PROCESSORS=1
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_IDENTIFIER=x86 Family 15 Model
PROCESSOR_LEVEL=15
PROCESSOR_REVISION=000a

へー、今は、環境変数で、プロセッサの数が分かるんだ。
そう言えば、DOSのころは、環境変数にアクセスするのに、自分で環境変数にアクセスするためのライブラリを書いたっけ。

今は、
 string s = Environment.GetEnvironmentVariable("NUMBER_OF_PROCESSOR");

で、一発だから簡単ですね。
ところで、やっぱり環境変数を書き変えるメソッドは無いんですね。まあ、そんな必要も、もう無いけどね。  
Posted by gushwell at 20:20Comments(0)TrackBack(0)

2005年03月23日

配列の比較(3)

   このエントリーをはてなブックマークに追加 Clip to Evernote
前々回の記事で、ArrayComp関数を載せましたが、さらに汎用化することもできます。

private bool CollectionComp(IEnumerable enumerable1, IEnumerable enumerable2) {
IEnumerator e1 = enumerable1.GetEnumerator();
IEnumerator e2 = enumerable2.GetEnumerator();
while ( e1.MoveNext() ) {
if ( !e2.MoveNext() )
return false;
object o1 = e1.Current;
object o2 = e2.Current;
if ( !o1.Equals(o2) )
return false;
}
return !e2.MoveNext();
}


このように記述しておけば、IEnumerableを実装しているクラスならば、配列だろうと、ArrayListだろうと何でも比較できます。

でも、このような関数って、C#の場合、どういったクラスに入れるべきなんだろう。Utils クラスのstaticメソッドなのだろうか。あんまり美しくないな。  
Posted by gushwell at 22:05Comments(0)TrackBack(0)

2005年03月22日

配列の比較(2)

   このエントリーをはてなブックマークに追加 Clip to Evernote
.NET Framework の Array.Equalsは、なぜ、配列の各要素を比較する実装になっていないのか、考えてみると、オブジェクトのコピー問題(シャローコピーとディープコピーどちらがいいのか)と同じ問題があることに気がつきます。
まあ値型が格納されている場合は、前回示した実装で何も問題ないのですが、参照型のオブジェクトが配列に格納されている場合には、一概のこの実装でよいかどうかはわかりません。
結局、どうすべきかは、そのアプリケーションの要件によって異なるわけですから、Array.Equals が各要素の比較になっていないのは、賢明な選択なのかもしれません。
  
Posted by gushwell at 22:12Comments(0)TrackBack(0)

2005年03月17日

配列の比較

   このエントリーをはてなブックマークに追加 Clip to Evernote
byte[] b1;
byte[] b2;
...
if ( b1.Equals(b2) )
// 等しい

なんて、書ければ良いな、と思ったのですが、やはりダメでした。自分で、比較するコードを書く必要があるようです。

汎用的に書けば、以下のようになるかな?

bool ArrayEquals(Array b1, Array b2) {
if ( b1.Length != b2.Length )
return false;
for ( int i = 0; i < b1.Length; i++ ) {
if ( !b1.GetValue(i).Equals(b2.GetValue(i)) ) {
return false;
}
}
return true;
}


追記  2012/2/15
C#3.0以降を使っている場合は、「C#3.0での配列の比較」もご覧ください。

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

2005年03月16日

文字列からbyte配列へ

   このエントリーをはてなブックマークに追加 Clip to Evernote
備忘メモ

文字列からbyte配列へ
byte[] bytes = Encoding.Unicode.GetBytes(str);

byte配列から文字列へ
string s = Encoding.Unicode.GetString( bytes );
  
Posted by gushwell at 19:27Comments(0)TrackBack(0)