【C#】StackTraceとStackFrameで遊んでみた。

JUGEMテーマ:コンピュータ

 static void Main(string[] args)
{
    var list = new List<object> {1L, 3L, 10L, 2L};
    var result = list.OrderBy<object, object>(Print).ToList();
}

static object Print(object item)
{
    var trace = new StackTrace();
    foreach (StackFrame frame in trace.GetFrames() ?? new StackFrame[0])
    {
        MethodBase methodBase = frame.GetMethod();
        Console.Write(methodBase.Name + " ");
        if (methodBase.Name == "Main")
            break;
    }
    Console.WriteLine();
    return item;
}

あそんでみた。



【C#】OrderByより例外

JUGEMテーマ:コンピュータ
var list = new List<object> { 1L, 6L, 4, 2L };
var sortedList = list.OrderBy(item => item).ToList();

上記のコードが実行されると例外が発生します。OrderByによるソートが実行された際にlong型でない値と比較しようとするためですが・・・

List<object>型なんぞ使わずにList<long>型でコンパイル時に安全が確認出来るようにするべきというのが、コーディング的には正しい方法だと思いますが、今回は、上記の実行時の挙動をもう少し観察したいと思います。

まず、デバック実行でわかる情報(プログラマが知り得る情報)を見てみたいと思います。

OrderBy例外

例外はArgumentExceptionで「オブジェクトは Int64 型でなければなりません。」というメッセージが表示されています。long型以外の型のオブジェクトが引数に渡されたため例外が発生したという事ですね。List<ojbect>型に対してOrderByしているのでobject型の比較でソートがかかるものだとおもったのですが、これは意外です。

さて更に細かく見ていきたいと思います。

System.ArgumentException はハンドルされませんでした。
  Message="オブジェクトは Int64 型でなければなりません。"
  Source="mscorlib"
  StackTrace:
場所 System.Int64.CompareTo(Object value)
場所 System.Collections.Comparer.Compare(Object a, Object b)
場所 System.Collections.Generic.ObjectComparer`1.Compare(T x, T y)
場所 System.Linq.EnumerableSorter`2.CompareKeys(Int32 index1, Int32 index2)
場所 System.Linq.EnumerableSorter`1.QuickSort(Int32[] map, Int32 left, Int32 right)
場所 System.Linq.EnumerableSorter`1.Sort(TElement[] elements, Int32 count)
場所 System.Linq.OrderedEnumerable`1.<GetEnumerator>d__0.MoveNext()
場所 System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
場所 System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
場所 Art55.OrderBy20100306.Program.Main(String[] args) 場所 C:¥Users¥art55¥Documents¥Visual Studio 2008¥Projects¥Art55.OrderBy20100306¥Art55.OrderBy20100306¥Program.cs:行 13
場所 System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
場所 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
場所 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
場所 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
場所 System.Threading.ThreadHelper.ThreadStart()
  InnerException:

上記は例外発生時のスタックトレースです。

上から順に詳しく見ていくと

場所 System.Int64.CompareTo(Object value)

System.Int64構造体のCompareToメソッドが呼ばれていることがわかります。

恐らく6Lが格納されたSystem.Int64構造体のオブジェクトのCompareToメソッドに指定された引数がStystem.Int32構造体だったためArgumentExceptionが発生したものと推測されます。

場所 System.Collections.Comparer.Compare(Object a, Object b)
場所 System.Collections.Generic.ObjectComparer`1.Compare(T x, T y)

二つを同時に見てみます。ObjectComparer<T>のT型が一体何になっているのかきになるところですが、わかりません(恐らくobject型)。Compare(Object a, Object b)メソッドは公開されているメソッドなので、動作検証できます。

object o1 = 6L;
object o2 = 4;
Comparer.Default.Compare(o1, o2);

上記のコードでobject型同士の比較をしても、内部でlong型同士の比較が実行されるようで、同じようにArgumentExceptionが発生します。

MSDNライブラリーを覗いてみると
http://msdn.microsoft.com/ja-jp/library/system.collections.comparer.compare.aspx

例外
ArgumentException
条件
a と b が、いずれも IComparable インターフェイスを実装していません。
または
a と b の型が異なっていて、両者を比較できません。

解説

aIComparable を実装する場合は、a .CompareTo ( b ) が返されます。逆に、bIComparable を実装する場合は、符号反転した b .CompareTo ( a ) が返されます。

nullNothingnullptrnull 参照 (Visual Basic では Nothing) を任意の型と比較できます。このような比較を行っても、IComparable を使用した場合に例外が生成されることはありません。並べ替え処理では、nullNothingnullptrnull 参照 (Visual Basic では Nothing) は、他のすべてのオブジェクトより小さいと見なされます。

文字列比較の結果は、カルチャに応じて異なる場合があります。カルチャ固有の比較の詳細については、System.Globalization 名前空間のトピックおよび「エンコーディングとローカリゼーション」を参照してください。

渡された引数のうちIComparebleが実装されているオブジェクトを選んで、CompareToメソッドを呼び出すという事がわかりました。


ブログをかいてる途中で、もやもや感が解消したので、ここでいったん止めます(笑)


--------------
追記

object o = 4;
long d = (long) o;

上記のようなキャストは実行時にエラーになるので
下記のような修正はできません。

var list = new List<object> { 1L, 6L, 4, 2L };
var sortedList = list.OrderBy(item => (long) item).ToList();

List<object>のリストを作成した意図がなんなのか考慮した上で修正する必要があります。

※実行時にエラーはでなくなるけど、意図した動きとは違う動きをしてしまう例(↓)
var list = new List<object> { 1L, 6L, 4, 2L };
var sortedList = list.OfType<long>().OrderBy(item => item).ToList();



【WPF】使い続け気付いたこと。Styleに使いどころ。

JUGEMテーマ:コンピュータ
 WPFライブラリーを使い続けて2年くらいたったと思いますが、実際のアプリケーションを作っていく際にStyleは作業効率を上げるうえでも、アプリケーションのUI部分の完成度を上げるうえでも非常に重要な役割を担っていると感じています。Style重要です。

2年前、当初、私の意識はStyleとは見た目を一括して変更するものだという程度の認識でした。現在はどちらかというとプロパティを一括して管理するもの。そのアプリケーションで使用するコントロールに対して、個々のアプリケーション固有の標準やコントロール間の関係を定義するものといった認識です。

なんじゃそりゃって感じた方ごめんなさい。口で表現するのは非常にむずかしいのですが、もうちょっと気合いが入ったら、ソースコードと実際のアプリケーションの振る舞いと私が頂くWPFの設計思想とを説明したいと思います。

家の開発環境が崩壊中なので(・・・物理的に(笑))また今度


Visual Studio 2010 RC

 http://www.microsoft.com/japan/visualstudio/try/default.mspx

Visual Studio 2010 RC

普段のコーディングでは2008とReshaperがあれば何も困ることはありませんが、
やっぱり新しいものが使いたいですよね。


ずいぶん間が空きました。

こんばんわ生きてます。
毎日コーディングしてます。
そろそろVS2010もリリースされそうなので
Blogも再開してみようと思います。


うわー最悪。

 現在使用しているロリポップサーバからBlogの移行をしろというメールが来たので(ここから金払ってるのに移行作業をユーザにやらせるって何なんだって思ってたんですが)無事なんとか移行したものBlogを開いてびっくり・・・一番上に広告が・・・ちょっとふざけすぎ。


【Book】プログラミングMicrosoft LINQ

プログラミングMicrosoft LINQ (マイクロソフト公式解説書 Microsoft Visual Studi)
プログラミングMicrosoft LINQ (マイクロソフト公式解説書 Microsoft Visual Studi)
小高 太郎,(株)オーパス・ワン


数ヶ月前に購入して、これはおもしろそうだ!って思いつつも本の山の中に・・・最近、やる気が戻りつつあるので、読もうと思います。


【Expression】Expression Studio 3無事インストール完了

どういう訳か家のPCにExpression Studio 3がインストールに失敗すること数度、半ばあきらめていたのですが、今日再チャレンジしてみるとなんなくインストールに成功しました。もしかして、ダウンロードファイルがこわれてた??よくわかりませんが、なんとかインストールできました。

さて早速Blend3を起動していたのですが、UI部分作り直されてますよね?

Marginのサイズなどが微妙に違うような・・・気のせいか?

「新しいプロジェクト」のダイアログをみて、ちょっと目から鱗。

Expression Blend 3 タブの動き

Expression Blend 3 タブの動き

「プロジェクトの種類」の表示/非表示の切り替えですが、この動きありですよね。

画面の動きとしては、画面左端のインタラクションなので、Window左端に広げるためのインタラクションボタンがあってもおかしくありませんが、この場合は、意味合い的にはテンプレートを階層分け表示するためのインタラクションボタンなので、Blend3の位置はナイスポイントですよね?

使ってみて、わかりやすいと思いました。初期表示で隠れているとわかりづらいか?どちらにしても、ちょっと斬新だけど「ありだなー」って思いました。ええ。それだけ。です。


【WPF】Styleを使用時に気をつけること。

Source and Project

Styleを使用することで、特定コントロールを一括してプロパティを変更することができます。文字通りスタイルを決定することが出来るわけですが、気をつけなければならないことがあります。

コントロールの特定のプロパティによっては、期待しない結果が変えることがあります。たとえば、DataGridがコンテンツにある場合にButtonのMinWidthを設定すると・・・

<Window.Resources>
 <Style TargetType="Button">
  <Setter Property="MinWidth" Value="100" />
 </Style>
</Window.Resources>
<Grid>
 <Grid.RowDefinitions>
  <RowDefinition Height="*" />
  <RowDefinition Height="*" />
 </Grid.RowDefinitions>
 <Controls:DataGrid x:Name="dataGrid" ItemsSource="{Binding}" />
 <ListView Grid.Row="1" ItemsSource="{Binding}">
  <ListView.View>
   <GridView>
    <GridViewColumn Header="ヘッダー" DisplayMemberBinding="{Binding [0]}" />
    <GridViewColumn Header="ヘッダー" DisplayMemberBinding="{Binding [1]}" />
    <GridViewColumn Header="ヘッダー" DisplayMemberBinding="{Binding [2]}" />
    <GridViewColumn Header="ヘッダー" DisplayMemberBinding="{Binding [3]}" />
   </GridView>
  </ListView.View>
 </ListView>
</Grid>

DatGridにButton.MinWidthをStyleから設定

画像を見ていただければわかりあすが、カーソルがある部分はButtonになっています。この部分のMinWidthが設定されてしまうため、残念なDataGridになってしまっています。この結果を受けてわかることは

1.Styleを設定する場合は自分が意図しないものまで変更されていないか注意する必要がある。
2.コントロールを作成する際はStyleで意図しない変更を受けないようにする必要がある。


という2点だと思います。ちなみにButton.Widthを設定してもDataGridは残念な結果にはなりません。

Source and Project


【ライセンス】Expression Studio 3 (x86) - CD (Japanese)

1、2ヶ月前の話ですが、MSDN Premium Subscription からExpression Studio(1,2,3)がダウンロードできるようになってますよね。前はBlendとWebしか落とせなかったのに!買ってしまったではないか!

使えるようになったのはうれしいけど・・・くやしいっす!


calendar
 123456
78910111213
14151617181920
21222324252627
28293031   
<< March 2010 >>
あわせて読みたい
あわせて読みたいブログパーツ
selected entries
categories
archives
recent comment
recent trackback
recommend
キャット・シッターの君に。
キャット・シッターの君に。 (JUGEMレビュー »)
喜多嶋 隆
私のイラストレータデビュー本です。
recommend
ビジュアライジング・データ ―Processingによる情報視覚化手法
ビジュアライジング・データ ―Processingによる情報視覚化手法 (JUGEMレビュー »)
Ben Fry
javaぽい言語Processingを用いたビジュアライジングデータ。タイトルの通りいかにデータを視覚化するかというところを解説した本、手法やプロセスに対して丁寧でかつ具体的な例を挙げているのでわかりやすく、また応用が利きます。すばらしい本です。
recommend
recommend
recommend
recommend
recommend
recommend
Essential .NET ― 共通言語ランタイムの本質
Essential .NET ― 共通言語ランタイムの本質 (JUGEMレビュー »)
ドン・ボックス,クリス・セルズ,Don Box,Chris Sells,吉松 史彰
recommend
recommend
recommend
Design rule index―デザイン、新・100の法則
Design rule index―デザイン、新・100の法則 (JUGEMレビュー »)
William Lidwell,Kritina Holden,Jill Butler
ユーザインターフェイス、ユーザビリティなどを考えたいならこの本をヒントにしてみるのも良いかと思います。
recommend
リファクタリング―プログラムの体質改善テクニック (Object Technology Series)
リファクタリング―プログラムの体質改善テクニック (Object Technology Series) (JUGEMレビュー »)
マーチン ファウラー,Martin Fowler,児玉 公信,平澤 章,友野 晶夫,梅沢 真史
Javaで書かれていますが、良本です。言語を覚えたら、まずこの本を読んでみましょう。
recommend
集合知プログラミング
集合知プログラミング (JUGEMレビュー »)
Toby Segaran
・・・挫折中の一本。
recommend
C#ではじめるWebサービスプログラミング
C#ではじめるWebサービスプログラミング (JUGEMレビュー »)
山崎 秀,笠原 一浩
動くモノが作れるから楽しい、この本で実現しましょう!
recommend
C#クックブック 第3版
C#クックブック 第3版 (JUGEMレビュー »)
Jay Hilyard,Stephen Teilhet
C#2.0からの移行を考えているならこの本がお勧めです。
recommend
LINQテクノロジ入門~Microsoft Visual Studio 2008による新たなクエリ構築技法~ (マイクロソフトコンサルティングサービステクニカルリファレンスシリーズ) (マイクロソフトコンサルティングサービステクニカルリファレンスシリーズ)
LINQテクノロジ入門~Microsoft Visual Studio 2008による新たなクエリ構築技法~ (マイクロソフトコンサルティングサービステクニカルリファレンスシリーズ) (マイクロソフトコンサルティングサービステクニカルリファレンスシリーズ) (JUGEMレビュー »)
赤間信幸
LINQ最強の入門本です。LINQの処理をイメージをわかりやすく解説されています。また、著者の赤間さんはわかりやすい解説をされることで超有名です。
recommend
Pro LINQ: Language Integrated Query in C# 2008 (Windows.Net)
Pro LINQ: Language Integrated Query in C# 2008 (Windows.Net) (JUGEMレビュー »)
Jr. Rattz Joseph C.
LINQをしっかり学びたい方にお勧めします。
recommend
recommend
WPF Recipes in C# 2008: A Problem-Solution Approach (Expert's Voice in .Net)
WPF Recipes in C# 2008: A Problem-Solution Approach (Expert's Voice in .Net) (JUGEMレビュー »)
Sam Noble,Sam Bourton,Allen Jones
WPFの基礎を一通り学習したら、この本を手に取りましょう。WPFのHowToやDeepな情報を得ることが出来ます。かなりお勧めです。
(注意:サンプルコードのレイアウト設計は間違ってるので注意です)
links
profile
search this site.
others
mobile
qrcode
powered
無料ブログ作成サービス JUGEM
JUGEMのブログカスタマイズ講座