2005年03月22日

配列の比較(2)


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

Posted by gushwell at 22:12Comments(0)TrackBack(0)C#

2005年03月17日

配列の比較


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)C#

2005年03月16日

文字列からbyte配列へ


備忘メモ

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

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

2005年03月15日

リソース


strings.resx と strings.ja-JP.resx という2つのリソースファイルがプロジェクトに追加されているときに、

Assembly asm = Assembly.GetExecutingAssembly();
Stream stm = asm.GetManifestResourceStream("MyApp.strings.resources");

で取得できるリソースと

Assembly asm = Assembly.GetExecutingAssembly();
ResourceManager rm = new ResourceManager("MyApp.strings", asm);

で取得するリソースが異なるようです。

後者だと、

Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");

とすれば、英語のリソース(もちろん、strings.en-Us.resxというファイル
があることが前提だけれど)を読み込んでくれますが、前者は、まったく変化がありません。
GetManifestResourceStream だと、常に、規定のリソースが読み込まれるのかな。
MSDNの説明を読んでも良くわからりません。
そもそも、MSDNに記載してある「マニフェストリソース」って何のこと? 疑問です。

分かったのは、 ResourceManager クラスを使って、リソースにアクセスすべき、だということ。  
Posted by gushwell at 21:25Comments(0)TrackBack(0).NET Framework

2005年03月11日

TypeDelegator


ある本を読んでいたら、こんなコードに出会いました。
TypeDelegator td = new TypeDelegator(this.GetType());
Type t = typeof(CatalogAttribute);
object[] attr = td.GetCustomAttributes(t,true);

TypeDelegator って何?MSDNのドキュメント読んでもさっぱりわかりません。
Type から派生したクラスってのはわかったけど、何の役に立つのかな?
疑問です。

ちなみに、上のコードは、以下のコードと同じだと思われます。 たぶん...
Type type = this.GetType();
Type t = typeof(CatalogAttribute);
object[] attr = type.GetCustomAttributes(t,true);

だれか教えて!  
Posted by gushwell at 21:50Comments(0)TrackBack(0)リフレクション

2005年03月10日

RealProxy


.NET Frameworkの RealProxy。このクラス、とんでもないことができるんですね。
まだ、詳細を理解していませんが、メソッドの呼び出しを捕捉できるみたいです。なぜ、そんなことができるのか、始めは不思議でしたが、調べるうちになんとなくわかってきました。Proxy という名前の通り、代理クラスとして働くので、メソッド呼び出しが捕捉できるみたいです。
これから勉強します。  
Posted by gushwell at 20:27Comments(2)TrackBack(0).NET Framework