Hatena::ブログ(Diary)

当面C#と.NETな記録 このページをアンテナに追加 RSSフィード

2008/1/30 (水)

[] もっとオブジェクト初期化子  もっとオブジェクト初期化子を含むブックマーク  もっとオブジェクト初期化子のブックマークコメント

昨日、nsharp さんにコメントで教えてもらった、

> initializerはクラスのフィールド宣言部でも使えることに最近気づいたり。

が、使ってみたらとても印象的だったのでちょっと長めのコードを載せてみます。

デザイナで生成したコードを切り貼りして作った恣意的なサンプルですが、これ C#!?ってぐらいには強烈だと思います。

using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
  public class Form2 : Form
  {
    private TextBox textBox1 = new TextBox {
      Location = new Point( 12, 27 ),
      Multiline = true,
      Size = new Size( 268, 144 ),
      TabIndex = 0
    };

    private Label label1 = new Label {
      AutoSize = true,
      Location = new Point( 12, 9 ),
      Size = new Size( 31, 15 ),
      TabIndex = 1,
      Text = "メモ:"
    };

    private Button button1 = new Button {
      Location = new Point( 109, 177 ),
      Size = new Size( 75, 23 ),
      TabIndex = 2,
      Text = "書き込む",
      UseVisualStyleBackColor = true
    };

    public Form2()
    {
      ...
    }
  }
}

ちょっと with 文っぽいですね。

オブジェクト初期化子の中でプロパティ/フィールドの名前がインテリセンスで出るけど、ゲッターしかないものも候補に挙がるのがいけてないトコ。

コンストラクタの中で使っても、オブジェクトごとに初期化がそれぞれブロックの中に入って、ごちゃごちゃしがちな初期化がスッキリしました。

惚れました…。

2008/1/29 (火)

[] オブジェクト初期化子とコレクション初期化子  オブジェクト初期化子とコレクション初期化子を含むブックマーク  オブジェクト初期化子とコレクション初期化子のブックマークコメント

なんだか LINQ to Object を使っていて、従来はごちゃごちゃした手続きだったものが、きれいな一つの写像を表現する式になったりするなぁと不思議に思ってたんですが、縁の下の力持ちが誰なのかわかりました。

オブジェクト初期化子とコレクション初期化子が LINQ を支える影の大黒柱だったんですね。

あまり意識してなかったけど、こいつらの効果は絶大で、こいつらがあってこそ LINQ が活用できてますね。

ちょっと褒めすぎかw でも、単なる短く書ける構文ってだけじゃなく、

  • 初期化ということの範囲をコンストラクタからもうちょっとゆるやかに広げた
    • 最初にも書いたけど、これによってごちゃごちゃした一連の手続きが一つの初期化を表す式にできる
  • 式になったことで LINQ の中に組み込める

その結果、できあがった一つの式を改めて見ると、ごちゃごちゃした一連の手続きはつまるところ写像だった、みたいな抽象的な視点でコードが見えるようになるわけですな。

# コンバーターを使いこなしていれば従来でも達成できてたことなんだろうけど、ええうまく使えてませんよorz

関連ネタ。

id:NyaRuRu:20071230:p1 (すばらしすぎるエントリー。そして式であることの意味は使っているうちにじわじわとわかってきてます)

http://www.kmonos.net/wlog/81.html

(オブジェクト初期化子が広げた初期化の範囲と、stationary field で広げた「初期化処理中」と範囲が似てるなーとか。読み取り専用かどうかは別の話だけど。しかもオブジェクト初期化子は初期化中はよそから触れない → id:siokoshou:20071123:p1C# にコンストラクタとオブジェクト初期化子だけで初期化を認める stationary フィールドを追加するのって簡単かも?あ、でも、ずっと後から初期化するフィールドは救えないか…却下ですねw)

nsharpnsharp 2008/01/29 21:53 初期化の文脈を隔離できるってのはいいですよね。

initializerはクラスのフィールド宣言部でも使えることに最近気づいたり。

class Form1 : Form {

  Button button = new Button() {
    Bounds = new Rectangle(100, 100, 90, 30),
    Text = ”Click”
  };

みたいな感じで。

siokoshousiokoshou 2008/01/29 22:24 おぉ!気づいてませんでした。よくできてるな〜。明日から使えるテクニックですな。

2008/1/28 (月)

[] もう一つの Enum<T>  もう一つの Enum<T>を含むブックマーク  もう一つの Enum<T>のブックマークコメント

id:siokoshou:20080127:p2 の菊池さんのコメントを受けて、速度を改善した Enum<T> を考えてみたんですが、これでいいような気がしました。

public static class Enum<T> where T : struct
{
  private readonly static T[] values;
  private readonly static string[] strings;

  static Enum()
  {
    Debug.Assert( typeof( T ).IsEnum );
    Debug.Assert( !Attribute.IsDefined( typeof( T ),
      typeof( FlagsAttribute ) ) ); // 1/28追加
    values  = Enum.GetValues( typeof( T ) ).Cast<T>().ToArray();
    strings = Enum.GetNames(  typeof( T ) );
    Array.Sort<string, T>( strings, values ); // 1/28追加
  }

  public static T Parse( string value )
  {
    int n = Array.IndexOf<string>( strings, value );
    if ( n < 0 )
      throw new ArgumentException();
    return values[ n ];
  }

  public static IEnumerable<T> GetValues()
  {
    foreach ( var item in values )
    {
      yield return item;
    }
  }
}

GetValues() を IEnumerable<T> にしたのは id:ladybug さんの id:ladybug:20061212 を参考にさせていただきました。

手元では100万回ループで試すと10数倍速いです。キャッシュ用にメモリを食うのが嫌ですが…。あ、今気づいたけど Dictionary 使えばもっと簡単だったかも。

(追記)菊池さんのコメントを受けて2行追加。

kikuchiKkikuchiK 2008/01/28 11:41 T[] は IEnumerable<T>実装してなかったっけ? return values; だけでよさそうな気がする>GetValues
Enumの規模が大きいならstrings をソートしておいてソート順にvaluesを保持しとけば
バイナリサーチが使えてO(N)->O(logN)になるような。Enumの規模次第ですけど。
Flagsなら蹴っ飛ばすとか付けば完璧…注文多いよ>俺

siokoshousiokoshou 2008/01/28 23:00 >return values; だけでよさそうな気がする
これは書き換え防止のため yield しました。return values; だけだとキャストして書き換えできてしまうので。そこまでする人もいないと思うけどw
>バイナリサーチが使えてO(N)->O(logN)になるような。
さすが!私にはこういう視点が欠けてるようです。しかもこれ一行でできますね。
>Flagsなら蹴っ飛ばすとか付けば完璧
この案もいただきますw
>注文多いよ>俺
これからもビシビシ、レビューお願いしますw

トラックバック - http://d.hatena.ne.jp/siokoshou/20080128

2008/1/27 (日)

[] 次期 C# の新機能 Dynamic Lookup  次期 C# の新機能 Dynamic Lookupを含むブックマーク  次期 C# の新機能 Dynamic Lookupのブックマークコメント

http://blogs.msdn.com/charlie/archive/2008/01/25/future-focus.aspx

一言で言うと late binding。動的言語と COM とリフレクションを呼ぶのが簡単になるそうな。呼ぶ側から見るとこれらが同じ問題を抱えてたという目の付け所がおもしろい。

[] Enum<T> クラス  Enum<T> クラスを含むブックマーク  Enum<T> クラスのブックマークコメント

id:siokoshou:20080124 に続いて再び enum ネタ。偶然すばらしいものを発見してしまったので。

ネタ元 : http://devlicious.com/blogs/christopher_bennage/archive/2007/09/13/my-new-little-friend-enum-lt-t-gt.aspx

こないだは enum の具体的な実装、例えば enum MyEnum としたときの MyEnum と拡張メソッドは相性がいいってネタだったけど、今回は Enum クラスのメソッド Parse とかをきれいに書くネタ。

Parse よく使いますが、見た目が汚いんですよね。ネタ元から引用すると

MyEnum enumValue = (MyEnum) Enum.Parse(typeof (MyEnum), stringValue);

これを Enum<T> クラスでくるんでしまってきれいにするという卓越したアイデア。再び引用。

MyEnum enumValue = Enum<MyEnum>.Parse(stringValue);

スッキリ! Enum<T> の実装も引用。

public static class Enum<T>
{
  public static T Parse(string value)
  {
    return (T) Enum.Parse(typeof (T), value);
  }

  public static IList<T> GetValues()
  {
    IList<T> list = new List<T>();
    foreach (object value in Enum.GetValues(typeof (T)))
    {
      list.Add((T) value);
    }
    return list;
  }
}

すばらしすぎ! class Enum と class Enum<T> がそれぞれ存在できるっていう目の付け所がイイ。標準に入れてもらいたいところ。

where T : enum と制約できれば最高なんだけどそれは無理なので、struct 制約つけたり、static コンストラクタで T が enum かチェックしたりすればもっとよいかも。あとは残りのメソッドを一つずつくるんでいけばOK。

GetValues() などは LINQ なら一行で書けるので LINQ の練習にどうぞ。

でも、速度の問題は未解決(-_-)。

kikuchiKkikuchiK 2008/01/27 16:35 メタデータ舐めてParseのExpression-Treeを吐き出すpost-compiler的解決が比較的有効かも
(3項演算子ずらっと並べて出すだけですし)

kikuchiKkikuchiK 2008/01/27 16:36 ↑速度の問題については

siokoshousiokoshou 2008/01/27 21:52 おぉ、菊池さんだ。コメントありがとうございます。
>メタデータ舐めてParseのExpression-Treeを吐き出すpost-compiler的解決が比較的有効かも
おもしろそうですね!ちょっとやってみます。

2008/1/26 (土)

[] bc はインタプリタだった  bc はインタプリタだったを含むブックマーク  bc はインタプリタだったのブックマークコメント

割りとどうでもいいことなんですが、今のいままで知らなくて、びっくりしたので記念に書いときます。

Unix の bc コマンドって知ってます?そう、コマンドラインの電卓です。あれ、実はインタプリタだったんですね。インタプリタと言ってもピンキリだけど、どうやらちゃんとした言語のようです。ただの電卓と思うなよってとこでしょうかw 詳しくは man bc で。

記念に FizzBuzz 書いてみました。Cygwin の bc で動きました。bc 入れてなくて取ってきたんですけどねw

for ( i = 0; i < 20; i++ )
{
  if ( i % 15 == 0 )
  {
    print "FizzBuzz\n";
    continue;
  }

  if ( i % 5 == 0 )
  {
    print "Buzz\n";
    continue;
  }

  if ( i % 3 == 0 )
  {
    print "Fizz\n";
    continue;
  }

  print i;
  print "\n";
}
quit

次に使うことがあるのかどうか…(^^;

# はてなシンタックス・ハイライトに bc があった…w

トラックバック - http://d.hatena.ne.jp/siokoshou/20080126

2008/1/25 (金)

[] 配列やコレクションやIEnumerableなどの汎用 IsNullOrEmpty  配列やコレクションやIEnumerableなどの汎用 IsNullOrEmptyを含むブックマーク  配列やコレクションやIEnumerableなどの汎用 IsNullOrEmptyのブックマークコメント

id:siokoshou:20071208LINQ の限定子に重要なもの一つ追加。

Any() ってシーケンスに要素が含まれているかどうかどうかチェックする演算子でした。

Console.WriteLine( new int[] {}.Any() );     // false
Console.WriteLine( new int[] { 1 }.Any() );  // true

名前からわからんよw

配列やコレクションでは null 使うなとは言うけれど、初期値が null だけに現実には混じってしまうんですよね…。そんなときに null を渡すと例外じゃ困るので IsNullOrEmpty を書いてみました。これは便利かも。バグや改良案があればコメントください。

using System;
using System.Collections;
using System.Collections.Generic;

public static class Lib
{
  public static bool IsNullOrEmpty( this IEnumerable source )
  {
    //Console.Write( "x " ); // どっちが呼ばれた?

    if ( source == null )
      return true;

    return source.Cast<object>().IsNullOrEmpty();
  }

  public static bool IsNullOrEmpty<T>( this IEnumerable<T> source )
  {
    if ( source == null )
      return true;

    return !source.Any();
  }
}

使ってみる。

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

namespace IsNullOrEmpty
{
  class Program
  {
    static void Main()
    {
      int[] array0 = null;
      int[] array1 = { };
      int[] array2 = { 1 };
      int[] array3 = { 1, 2, };

      Console.WriteLine( array0.IsNullOrEmpty() );
      Console.WriteLine( array1.IsNullOrEmpty() );
      Console.WriteLine( array2.IsNullOrEmpty() );
      Console.WriteLine( array3.IsNullOrEmpty() );
      Console.WriteLine();

      var list0 = null as ArrayList;
      var list1 = new ArrayList() { };
      var list2 = new ArrayList() { 1 };
      var list3 = new ArrayList() { 1, 2 };

      Console.WriteLine( list0.IsNullOrEmpty() );
      Console.WriteLine( list1.IsNullOrEmpty() );
      Console.WriteLine( list2.IsNullOrEmpty() );
      Console.WriteLine( list3.IsNullOrEmpty() );
      Console.WriteLine();

      var dic0 = null as Dictionary<string, int>;
      var dic1 = new Dictionary<string, int> { };
      var dic2 = new Dictionary<string, int> { { "a", 1 } };
      var dic3 = new Dictionary<string, int> { { "a", 1 }, { "b", 2 } };

      Console.WriteLine( dic0.IsNullOrEmpty() );
      Console.WriteLine( dic1.IsNullOrEmpty() );
      Console.WriteLine( dic2.IsNullOrEmpty() );
      Console.WriteLine( dic3.IsNullOrEmpty() );
      Console.WriteLine();

      Console.WriteLine( Enumerable.Empty<double>().IsNullOrEmpty() );
      Console.WriteLine( Enumerable.Range( 0, 0 ).IsNullOrEmpty() );
      Console.WriteLine( Enumerable.Range( 0, 1 ).IsNullOrEmpty() );
      Console.WriteLine( Enumerable.Range( 0, 2 ).IsNullOrEmpty() );

      Console.ReadKey();
    }
  }
}

ちゃんと動きました。

# そういえば string.IsNullOrEmpty のコンパイラのバグはどうなったんだろ

渋木宏明(ひどり)渋木宏明(ひどり) 2008/01/25 14:27 .NET Framework 2.0 SP1 に修正が含まれているようです。

http://hidori.spaces.live.com/blog/cns!F11BB9FD8E1BC5F9!424.entry

siokoshousiokoshou 2008/01/25 15:22 直ったんですね!
#.NETのSPって、もちょい短い周期で出して欲しいなぁ。

トラックバック - http://d.hatena.ne.jp/siokoshou/20080125

2008/1/24 (木)

[] Enum と拡張メソッド <3  Enum と拡張メソッド <3を含むブックマーク  Enum と拡張メソッド <3のブックマークコメント

Enum と拡張メソッドって相性がいいですね。MSDN ライブラリでも取り上げられてますけど。

enum MyEnum { A, B } と定義した enum を文字列化するときに日本語にしたいことがよくあって、static な関数を書いてたけど、拡張メソッドでちょっとだけきれいになりますね。

using System;

class Program
{
  static void Main()
  {
    var e = MyEnum.A;

    Console.WriteLine( e.ToString() );
    Console.WriteLine( e.ToStringExt() );

    Console.ReadKey();
  }
}

public enum MyEnum { A, B }

public static class MyEnumExt
{
  public static string ToStringExt( this MyEnum e )
  {
    switch ( e )
    {
    case MyEnum.A: return "え〜";
    case MyEnum.B: return "びぃ";
    default: throw new ArgumentOutOfRangeException( "e" );
    }
  }
}

拡張メソッドの名前は ToString だと enum の ToString が呼ばれてしまったので、ToStringExt にしました。無念。

enum の ToString はめちゃくちゃ遅いのでご注意を。MSDN ライブラリにも明記されています。↑の拡張メソッドと ToString のマイクロベンチしてみたら、拡張メソッドのほうが878倍ハヤカッタ。

bleis-tiftbleis-tift 2008/08/12 00:06 enumではないですが、こんなのはどうですか?

public sealed class MyEnum
{
public readonly string Str;
private MyEnum(string str) { Str = str; }

public static readonly MyEnum A = new MyEnum(”え〜”);
public static readonly MyEnum B = new MyEnum(”びぃ”);
}

MyEnumのオブジェクトにnullが入っちゃう可能性があるのは痛いですけど、速いですよ。

siokoshousiokoshou 2008/08/20 00:14 コメントに気づくの遅れてごめんなさい(> <)
enum だと機能が足りないとき、こういうのいいですよね。ときどき使ってます。
それはそれとして、機能の過不足ない実装でいいですね、このコード。素敵です。

2008/1/21 (月)

[] .NET Framework 3.5  .NET Framework 3.5を含むブックマーク  .NET Framework 3.5のブックマークコメント

何かと必要になるのでリンクをメモ。

Microsoft .NET Framework 3.5

(IA64 のみ追加で Microsoft .NET Framework 3.5 日本語 Language Pack )

# もしかして IA64 以外は「日本語 Language Pack」は一つ目のパッケージに含まれてる? → Yes (正確には一緒にインストールされる)

id:shiba-yan さんのコメントを受けて一部修正済み

[] more Dynamic LINQ  more Dynamic LINQを含むブックマーク  more Dynamic LINQのブックマークコメント

今日、東京に来たらしい ScottGu さんの Dynamic LINQ に対抗してみました。動的に LINQ クエリーを組み立てる例はあちこちでたくさんの人がそれぞれ違う方法でやってますが(^^;、末席に加わります。

動的といっても Where に渡す条件を式木で組み立てて渡すだけのサンプルです。必要だったので式木の練習がてら書いてみました。きっと Where 条件組み立てって一番使うよね?式木のドキュメントはもっと充実させて欲しいところ…

まずはデータ。いつぞやのもの。

var persons = new[] {
  new Person { Name = "Wataru Abe", Gender = Gender.Male, IsActive = true },
  new Person { Name = "Masao Sueda", Gender = Gender.Male, IsActive = true },
  new Person { Name = "Sae Nakarai", Gender = Gender.Female, IsActive = true },
  new Person { Name = "Shiori Yamamoto", Gender = Gender.Female, IsActive = true },
  new Person { Name = "Satoshi Hatakeyama", Gender = Gender.Male, IsActive = false },
};

このデータにこんなクエリーを投げたいとします。

var list1 = from p in persons
            where p.Gender == Gender.Male && p.IsActive
            select p.Name;
list1.ToList().ForEach( Console.WriteLine );

このクエリーの where の条件「p.Gender == Gender.Male && p.IsActive」を式木を使って動的に組み立ててみます。

static Func<Person, bool> GetPredicate()
{
  // パラメータ
  var param = Expression.Parameter( typeof( Person ), "p" );

  // 条件式木のリスト
  var predList = new List<Expression>();

  // 条件(1) p.Gender == Gender.Male 組み立て
  var left = Expression.PropertyOrField( param, "Gender" );
  var right = Expression.Constant( Gender.Male );
  predList.Add( Expression.Equal( left, right ) );

  // 条件(2) p.IsActive 組み立て
  predList.Add( Expression.PropertyOrField( param, "IsActive" ) );

  // p.Gender == Gender.Male && p.IsActive 組み立て
  var body = predList.Aggregate(
    ( l, r ) => Expression.MakeBinary( ExpressionType.AndAlso, l, r ) );

  // パラメータと本体をくっつけて、実行コード生成
  return Expression.Lambda<Func<Person, bool>>( body, param ).Compile();
}

簡単なサンプルにしたかったので固定値で組み立ててます。必ず同じ条件式のデリゲートができあがるだけですが、それでも十分ややこしいので。ここがわかれば変数に応じて組み立てることはできるハズ。

条件(1)の BinaryExpression、条件(2)の MemberExpression を作ってリストに入れていき、最後に AndAlso でリスト中の式をくっつけてます。コメントと変数名でいろいろわかると思いますが、詳細は書ききれないのでMSDNライブラリをどうぞ。

式とか木とか二項演算子とか、いかにも情報処理って感じですねw 細々と面倒ですが、ブロックで遊んでるみたいなもんです。珍しく Aggregate が使えたのがうれしかったり。

あとは組み立てた条件を使ってクエリーを投げるだけです。

var list2 = from p in persons
            where GetPredicate()( p )
            select p.Name;
list2.ToList().ForEach( Console.WriteLine );

GetPredicate() はデリゲートが帰ってくることに注意。LINQ to SQL などで、Expression が欲しければ GetPredicate() の最後の Compile() せずに Expression<Func<Person, bool>> を返せば OK。

最後に全文。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;

class Program
{
  static void Main()
  {
    var persons = new[] {
     new Person { Name = "Wataru Abe", Gender = Gender.Male, IsActive = true },
     new Person { Name = "Masao Sueda", Gender = Gender.Male, IsActive = true },
     new Person { Name = "Sae Nakarai", Gender = Gender.Female, IsActive = true },
     new Person { Name = "Shiori Yamamoto", Gender = Gender.Female, IsActive = true },
     new Person { Name = "Satoshi Hatakeyama", Gender = Gender.Male, IsActive = false },
    };

    var list1 = from p in persons
                where p.Gender == Gender.Male && p.IsActive
                select p.Name;
    list1.ToList().ForEach( Console.WriteLine );
    Console.WriteLine();

    // Expression Tree を使って条件を組み立てるサンプル
    var list2 = from p in persons
                where GetPredicate()( p )
                select p.Name;
    list2.ToList().ForEach( Console.WriteLine );

    Console.ReadKey();
  }

  static Func<Person, bool> GetPredicate()
  {
    // Expression Tree を使って条件を組み立てるサンプル

    // パラメータ
    var param = Expression.Parameter( typeof( Person ), "p" );

    // 条件式木のリスト
    var predList = new List<Expression>();

    // 条件(1) p.Gender == Gender.Male 組み立て
    var left = Expression.PropertyOrField( param, "Gender" );
    var right = Expression.Constant( Gender.Male );
    predList.Add( Expression.Equal( left, right ) );

    // 条件(2) p.IsActive 組み立て
    predList.Add( Expression.PropertyOrField( param, "IsActive" ) );

    // p.Gender == Gender.Male && p.IsActive 組み立て
    var body = predList.Aggregate(
      ( l, r ) => Expression.MakeBinary( ExpressionType.AndAlso, l, r ) );

    // パラメータと本体をくっつけて、実行コード生成
    return Expression.Lambda<Func<Person, bool>>( body, param ).Compile();
  }
}

public enum Gender { Male, Female }

sealed class Person
{
  public string Name { get; set; }
  public bool IsActive { get; set; }
  public Gender Gender { get; set; }
}

Aggregate のところは、こんなヘルパー関数を用意してしまうのもいいかも。

public static class ExpressionExt
{
  public static Expression MakeBinary(
    this IEnumerable<Expression> exprs, ExpressionType binaryType )
  {
    if ( exprs == null )
      throw new ArgumentNullException( "exprs" );

    return exprs.Aggregate(
      ( l, r ) => Expression.MakeBinary( binaryType, l, r ) );
  }
}

shiba-yanshiba-yan 2008/01/21 12:27 1つ目のパッケージに日本語 Language Pack も入ってるので、同時にインストールされますね。
http://blogs.msdn.com/dd_jpn/archive/2007/11/13/6172535.aspx
の下のほうに書いてあります。

siokoshousiokoshou 2008/01/21 18:07 ありがとうございます、助かりました!本文を一部修正しました。

トラックバック - http://d.hatena.ne.jp/siokoshou/20080121

2008/1/20 (日)

[] 脱線しすぎた  脱線しすぎたを含むブックマーク  脱線しすぎたのブックマークコメント

イベントベースの非同期パターンってどうやって元のスレッドで完了通知を実行してるんだろ?

Control.BeginInvoke もどうやってるんだろ?

WinForm なら、ウィンドウにメッセージ投げればできるのかも

これって .NET 以前でも同じことだよなぁ

Advanced Windows を読みふける

ウィンドウメッセージのキューはスレッド毎と知る。 な、なんだってー!

using System;
using System.Threading;
using System.Windows.Forms;

namespace WindowsForms2
{
  static class Program
  {
    [STAThread]
    static void Main()
    {
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault( false );

      Thread a = new Thread( Start );
      a.Start();

      Thread b = new Thread( Start );
      b.Start();

      Application.Run( new Form1() );
    }

    public static void Start()
    {
      Application.Run( new Form1() );
    }
  }
}

Form1 は適当に用意してください。なお、中途半端な知識に基づいているため、これは正しいものなのかわかりません。

本当に3つの Form が出て動いた…びっくり

そういえば STA って、これと何か関係あるの?

STA がウィンドウメッセージを使用してメソッドの呼び出しを行ってることを知る。 な、なんだってー!

mozilla の COM もどきも同じ仕組みなの?

コード見てみるもどこが何だかわからず…。あれ、何してたんだっけ? ← 今ここ

.NET 以前は Windows プログラムって数えるほどしか書いたことなくて、知識が穴だらけです。ガンガル。

NyaRuRuNyaRuRu 2008/01/20 22:17 さらにその後には SynchronizationContext や IHostTaskManager::Sleep といった大物が控えてますな.
http://msdn.microsoft.com/msdnmag/issues/06/04/deadlocks/default.aspx
http://msdn2.microsoft.com/ja-jp/library/ms231952.aspx

siokoshousiokoshou 2008/01/20 22:26 調べてるうちに SynchronizationContext には出会いました。WindowsFormsSynchronizationContext がカギなのかなーと思いつつも何がなんだかわからずw
IHostTaskManager は初めてききました。なんだろこれ?URLの資料読んでみます!ありがとうございます(^^)

siokoshousiokoshou 2008/01/20 23:24 うわ、これってCLRをホストするアレですか。概要だけで撃沈されますたw

トラックバック - http://d.hatena.ne.jp/siokoshou/20080120

2008/1/18 (金)

[] .NETソースコード  .NETのソースコードを含むブックマーク  .NETのソースコードのブックマークコメント

http://blogs.msdn.com/sburke/archive/2008/01/16/configuring-visual-studio-to-debug-net-framework-source-code.aspx

一日送れですが、ソースコードキター!と思ったら Express には来てなかったw 財政難ですが、ステップ実行したいなぁ。2月を待ちます。

[] object と呼ぶのは詭弁のような気がしてきた  object と呼ぶのは詭弁のような気がしてきたを含むブックマーク  object と呼ぶのは詭弁のような気がしてきたのブックマークコメント

↓これ、最近書いたクラスなんですが、このインスタンスを object モノ と呼ぶのは無理があるよね。

using System.Collections.Generic;
using System.IO;

namespace TMR.Vanapedia.Util
{
  /// <summary>FileInfoをファイル名で比較するクラス</summary>
  public class FileInfoNameEqualityComparer : IEqualityComparer<FileInfo>
  {
    public bool Equals( FileInfo x, FileInfo y )
    {
      return x.Name == y.Name;
    }

    public int GetHashCode( FileInfo obj )
    {
      return obj.Name.GetHashCode();
    }
  }
}

関数を2つまとめて渡すための便利な方法ではあるんだけど。モノというより演算子かな。2つは切り離せないので、まとめる何かとしては必要。そういう意味では、今ある便利な整理法というところ?

振る舞いをクラスにしたりとか、それってモノじゃないよなぁ。モノってところから離れてもいいんじゃない?とか、Func デリゲートを多用しててなんとなく思ったことでした。

artonarton 2008/01/18 23:23 最近というか、ここ1年くらい、僕はobjectの日本語訳は「モノ」ではなく「(メソッド呼び出しの)対象」とみなしてます。
そのほうが割り切りやすいと思うのですよ。

渋木宏明(ひどり)渋木宏明(ひどり) 2008/01/19 06:03 所詮(て言うほどマイナスイメージでもないけど)、クラスは「「オブジェクト(=いわゆるオブジェクト指向のオブジェクト)」をプログラミング言語で表現するための1つの方法」でしかなく、その実体は単なる「メンバの集合を定義するもの」でしかないってことなんじゃないかと

どんな括りでメンバを集約するかは設計者任せなので、後々遺恨が残らなければどーでもいいんじゃないかと (^^;

それよりもむしろ「いわゆるオブジェクト指向」を説明する際に、「オブジェクトを実在のモノや生物なんかにみたてて説明する」という手法がみられますが、これが口当たりこそよいものの、それほど「「いわゆるオブジェクト指向(のオブジェクト)」を正確に言い表していない」てとこが問題なんじゃないですかね。

siokoshousiokoshou 2008/01/19 09:48 おぉ。大御所お二方からコメントをいただけるなんて!ありがとうございます。

artonさん、いつもblog読んでます。
>「(メソッド呼び出しの)対象」
これいいですね!演算子でも振る舞いでもヨットでも牛でもしっくりきます。さすがです!
でも、私のようになんとなくモノと思ってた人には、一度↑のような例と向き合って、その考えを壊してからじゃないと「対象」と言われてもすっと流してしまいそうですね。いや、それでも別に何も困らないのかもしれないけど(^^;

渋木宏明(ひどり)さん、いつもblog読んでます。
>プログラミング言語で表現するための1つの方法」でしかなく
激同です。

>どんな括りでメンバを集約するかは設計者任せなので、後々遺恨が残らなければどーでもいいんじゃないかと (^^;
「どんな括りでメンバを集約するか」ってのが難しいなーと。.NETフレームワークのようにうまく部品化するにはどうしたらいいんだろ?ってあたりに最近興味を持ってます。抽象化とか直交性の成分が自分には欠けてますw

>「オブジェクトを実在のモノや生物なんかにみたてて説明する」
マズイですよねぇ。牛とか出てくるプログラムなんか書いたことないしw
実際に.NETフレームワークを使ってみるってあたりから徐々に始めたりすればいいのかも?

トラックバック - http://d.hatena.ne.jp/siokoshou/20080118

2008/1/16 (水)

[] 今年も…  今年も…を含むブックマーク  今年も…のブックマークコメント

今年もよろしくお願いします。今頃になって(^^;

そして今日は一日アポーの話題の日ってことで。

http://japanese.engadget.com/2008/01/15/macbook-air-multi-touch/

マルチタッチってプログラミングでどう扱うんだろ。ってか、欲しいなぁ。でもちょっと高いなぁ。Secondary Clickって何だろ。


http://japanese.engadget.com/2008/01/15/macbook-air-video/

これはやばい。便利すぎじゃね?触ってみたい…。


http://gigazine.net/index.php?/news/comments/20080116_itunes_movie_rentals/

なによりもiTunesでムービーレンタルにはまりそうで怖いw

トラックバック - http://d.hatena.ne.jp/siokoshou/20080116
2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 06 | 09 | 11 | 12 |
2007 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 08 | 09 | 10 | 12 |
2009 | 01 | 03 | 04 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 07 |
2011 | 04 | 07 | 10 |
2012 | 04 | 12 |
2013 | 08 |
2014 | 03 | 08 |
2017 | 09 |