情報科学屋さんを目指す人のメモ(FC2ブログ版)

何かのやり方や、問題の解決方法をどんどんメモするブログ。そんな大学院生の活動「キャッシュ」に誰かがヒットしてくれることを祈って。

ブログ内検索

スポンサーサイト このエントリーを含むはてなブックマーク

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
スポンサー広告 | 編集

C#からPowerPointを操作していてつまづいたことメモ このエントリーを含むはてなブックマーク

C#からCOMオブジェクト経由でPowerPointを操作していて困ったところを簡単にメモしておきます。

スポンサーサイト
.NET | コメント:0 | トラックバック:0 | 編集

C#での、正しいマルチスレッドプログラムの書き方を求めて(2011年11月版) このエントリーを含むはてなブックマーク

C#におけるマルチスレッドプログラミングの正しい作法が知りたい

そんなとき、やっぱりたよりになるのはmsdnだよねということで、msdnライブラリから、意外と散らばっているマルチスレッド関連ページをかき集めて、参考になりそうな資料を抜粋し、一覧にしたのがこのエントリです。

この記事は2009年の記事をベースに、一覧の内容を大幅にアップデートしたものです。内容は新しくなり、量も増えました。

丁寧な解説が良い

集めた資料にはマルチスレッド用のデザインパターンやガイドライン、 基礎的な用語の解説などが充実しており、とても参考になります。 クラスの解説だけでなく、 こういう場合はどれを使った方がよいという指針が明らかにされていて頼もしい限りです。

一つ一つ読むもよし、また、なんとなく興味を惹かれるタイトルのページを開いてみるのも面白いと思います。

C# | コメント:0 | トラックバック:0 | 編集

C#のアクセス修飾子を書かなかった場合に関して このエントリーを含むはてなブックマーク

背景

C#のアクセス修飾子(public, private, internal, protected など)については、C#の基本的事項として、入門書や入門者向けホームページにもほぼ間違いなく記載されている基本的な事項です。

しかし、(特にホームページで)publicやprivateを付けるとどうなるかの解説はほとんどの記事に含まれていますが、もし、何も付けなかったらどうなるかが書かれていないことがよく見受けられます。

また、それらはたいていメソッドや、フィールドプロパティなど、クラス内のメンバに関してであり、クラスにつけるprivateやpublicについてどうなるかについてもあまり記述がありません。

今回は、以上の2点が今ひとつ分からなかったため、それらを解決すべく、C#のアクセス修飾子(access modifier)についてC#の仕様書(C# Language Specification, 英語, 約500ページ)のアクセス修飾子に関する部分を読んでみましたC#の仕様書は、英語ですが簡単にダウンロードできます今回は、読んで私が先ほどの分からなかった点のうち、特に何も付けなかった場合に関する部分について理解したことをメモしておきます。詳細は直接仕様書へどうぞ。

メンバ(Members)とは

C#のコードには、名前空間の中にクラス、クラスの中にメソッドのように、階層構造があります。この階層構造があるということが重要です。そして、その最上位がグローバル名前空間(Global namespace)です。そして、各階層名前空間やクラスなどのすぐ下の階層にある要素クラスやメソッドなどのことをメンバ(Members)と呼びます。

ここではそれぞれの要素が持ちうるメンバーを示します。また、型(type)とは、構造体(struct)、列挙体(enumeration)、クラス(class)などを指しますが、話を省略するため、型の代表としてクラスを利用して説明します。

  • グローバル名前空間
    • 名前空間
    • クラス
  • 名前空間
    • クラス
  • クラス
    • クラス
    • 定数
    • フィールド
    • プロパティ
    • メソッド
    • イベント
    • インデクサ
    • 演算子

以降、名前空間AのメンバにクラスBがあるとき、名前空間Aを、クラスBの親メンバ、クラスBを名前空間Aの子メンバと呼ぶことで、わかりやすくしたいと思います。つまり、「この要素をメンバとして持つ要素」を「親メンバ」と呼びます。

5つのアクセシビリティ(Declared accessibility)

ここでは、まず要素の持ちうる5種類のアクセシビリティを紹介します。要素に対してこの5つ以外のアクセシビリティが与えられることはありません。必ず要素はいずれかのアクセシビリティを持ちます。あくまでアクセス修飾子と区別するために、すべて大文字にしてあります

  • PUBLIC
    アクセスは「制限されない」("access not limited")
  • PROTECTED
    アクセスは、「親メンバ内部」および「親メンバクラスを継承した型の内部」に制限される("access limited to the containing class or types derived from the containing class")
  • INTERNAL
    アクセスは、「この要素が含まれるプログラム(アセンブリ, .exe, .dll)」に制限される("access limited to this program")
  • PROTECTED INTERNAL
    アクセスは、「この要素が含まれるプログラム」および「親メンバクラスを継承した型」に制限される("access limited to this program or types derived from the containing class")
  • PRIVATE
    アクセスは、「親メンバ」に制限される"access limited to the containing type"

あとは、それぞれの要素がどのアクセシビリティを持つかが問題です。

アクセシビリティの決定方法

ここでは、どのアクセシビリティになるかがどう決まるかを説明します。基本は簡単です。

  • public, protected, internal, protected internal, privateのアクセス修飾子があるばあいは、それぞれPUBLIC, PROTECTED, INTERNAL, PROTECTED INTERNAL, PRIVATEのアクセシビリティとなる。
  • アクセス修飾子が存在しない場合は、それぞれのデフォルトアクセシビリティとなる。ここで、それぞれの要素のデフォルトアクシビリティは次のように定義される。ただし、要素のデフォルトアクセシビリティが、その要素の親メンバのアクセシビリティとは無関係に事前に決められていることに注意
    • 名前空間
      PUBLIC
    • (入れ子にされていないクラス、構造体など)
      INTERNAL
    • クラスの子メンバ(メソッド、入れ子にされた型など)
      PRIVATE
    • 構造体の子メンバ
      PRIVATE
    • インターフェイス
      PUBLIC
    • 列挙型
      PUBLIC

以上を使うことで、すでに記述されているC#のコードのアクセシビリティを判断できると思います。実は、これ自体だけでは、結局正確にどこからアクセス可能かは判断できません。それに関しては、あまりに量が多いのでもうあきらめます。

ところで、これだけでは、自分でコードを記述するときに、どのようなアクセス修飾子を記述可能なのかは分かりません。それについては次です。

要素に付けて良いアクセス修飾子(C#言語仕様 3.5.1節より)

アクセス修飾子(public, protected, internal, protected internal, private)は、付けて良い場所と、付けては行けない場所があります。付けていけない場所に付けると、「名前空間で定義された要素は明示的に private、protected、または protected internal に宣言することはできません」のようなコンパイルエラーが発生してしまいます。以下、それぞれの要素に付けられるアクセス修飾子をまとめました。

  • 名前空間
    付けられない
  • (入れ子にされていないクラス、構造体など)
    publicinternal
  • クラスの子メンバ(メソッド、入れ子にされた型など)
    publicprotectedinternalprotected internalprivate
  • 構造体の子メンバ
    publicinternalprivate
  • インターフェイス
    付けられない
  • 列挙型
    付けられない

まとめ

以上、メモでしたが、このエントリのタイトル「C#のアクセス修飾子を書かなかった場合に関して」、つまり、public, protected, internal, protected internal, privateのいずれもしていなかったときどうなるかは、次のようにまとめられます。

  • 名前空間
    PUBLIC
  • (入れ子にされていないクラス、構造体など)
    INTERNAL
  • クラスの子メンバ(メソッド、入れ子にされた型など)
    PRIVATE
  • 構造体の子メンバ
    PRIVATE
  • インターフェイス
    PUBLIC
  • 列挙型
    PUBLIC

見ての通り、前述した、「デフォルトアクセシビリティ」になる、ということですね。

感想

本当に困ったら、言語仕様を読むのが一番よさそうですね。ただ、次に紹介するmsdnには、同じことが優しく書いてあったりするので、そちらをまず参考にすることをおすすめします。

参考文献

書籍で読みたいなら、定番の「Programming C#」もしくは、その訳著「プログラミング C#」がおすすめ。msdnで十分だとは思うけど、本がいい人向け。

おまけ

Programming C# 4.0Programming C# 第6版 として2010年4月15日(@amazon)に発売されます。もちろん、英語ですが、これの日本語版が出るのはだいぶ先と思われます。C# 4.0の増えた部分が結構多いので、チェックしてみては。

C# | コメント:2 | トラックバック:0 | 編集

Control.BeginInvokeとControl.Invoke(System.Windows.Forms)メモ このエントリーを含むはてなブックマーク

GUIアプリを.NETで作成するとき、GUIを操作するのは常にメインスレッドであって、サブスレッドから操作してはいけないというのが鉄則なんですが、そのときに便利なBeginInvokeとInvoke。ちょっとmsdnライブラリで見てみたら、

BeginInvoke
コントロールの基になるハンドルが作成されたスレッド上で、指定したデリゲートを非同期的に実行します。

Invoke
コントロールの基になるウィンドウ ハンドルを所有するスレッド上で、デリゲートを実行します。

と、なっていました。msdnを見てちょっとスッキリ。

ちなみに、「作成」と「所有」になにか違いはあるのだろうかと思って、英語(en-us)で見てみると、

BeginInvoke
Executes a delegate asynchronously on the thread that the control's underlying handle was created on.

Invoke
Executes a delegate on the thread that owns the control's underlying window handle.

となっていて、やっぱりちょっと違います。とりあえず、同期と非同期の違いだと思っておけばいいんですかね。

それにしても、GUIをきれいに構成する方法が知りたい。複雑になると拡張性を無視したコードになっちゃう。うーん、まぁ、やってるうちに少しずつよくなればいいのかな。

.NET | コメント:0 | トラックバック:0 | 編集

Microsoft公式「.NET Framework 開発ガイド」がWebで登場 このエントリーを含むはてなブックマーク

「.NET Framework 開発ガイド」が、Microsoftから公開されました。内容は、.NET Framework

「.NET Framework の仕組みを紹介した ".NET Framework 開発ガイド ブック" が Web で登場」
.NET Framework 開発ガイド ブックは .NET Framework の動作の仕組みを分かりやすく説明したコンテンツです。.NET Framework の心臓部である CLR (Common Language Runtime) を中心に、.NET Framework をしっかり理解するための情報が満載です。.NET Framework をより深く学びたい開発者にも、.NET Framework を初めて学ぶ人にもピッタリなコンテンツです。ぜひ、.NET Framework スペシャリストへの第一歩としてご活用ください。

というわけで、読んでみました。→「Microsoft .NET Framework 開発ガイドブック

Microsoft .NET Framework 開発ガイドブック

.NET Frameworkの仕組みや、構成、概要がよく分かります。目次は以下のようになっています。

  1. .NET Framework の概要
  2. アセンブリの仕組み
  3. .NET アセンブリのバージョン管理
  4. セキュリティ機構
  5. CLRの機能
  6. アプリケーションの実行までの流れ
  7. アプリケーションの配置
  8. Side-by-Side 実行

全体としては短いですが、ボリュームはたっぷりで、これを読むだけで、.NET Frameworkの知識が一気に手に入ります。図も多く、読みやすいです。

どの章も興味深いのですが、気になったところを抜粋して紹介します。

ildasm.exe

ILDASMは、MSIL Disassemblerの略であり、MSILとは、Microsoft Intermediate Languageのことです。つまり、ILDASM.exeは、MSIL(.NETでの中間言語)で記述されたファイル(.exe、.dll)の内容を読み取ることができるツールと言えます。

実際に、ildasm.exeを利用してみます。ildasm.exeの場所は、少し探すのが大変ですが、次のようなパスにありました。

C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\ildasm.exe

ダブルクリックで簡単に実行可能です。

ダブルクリックで実行すると、ウィンドウが表示されるので、「ファイル」から、EXEファイルや、DLLファイル(もちろん、.NET Frameworkを利用したもの)を読み込んでみます。すると、ツリー構造が表示されます。

MANIFESTダブルクリックするとDLLもしくはEXEに埋め込まれたマニフェスト(ファイルに関する情報)を表示することができます。

また、「表示(V)>メタ情報(M)>表示!(S)」をクリックすることで、ファイルのメタ情報(どのような型が宣言されているかなど)が表示されます。表示する必要があるかは別として、ファイルにどのような情報が格納されているかが見られるというのは勉強になります。

はじめにファイルを開いたときに表示されたツリーをたどっていくことでもどのようなメソッドやクラスが定義されていて使用可能であるかが分かります。

ほかにもたくさんの機能がありますが、とくにおもしろいものとしては、「表示(V)>統計値(I)」から見られる統計情報です。ファイル自体の何パーセントがどのような要素から校正されていて、いくつのメソッドが宣言されているか、そのサイズはどれくらいかなどの詳細な情報をチェックできます。これまた、実用的な意味があるかは別にしても、とても興味深いです。

.NET | コメント:0 | トラックバック:0 | 編集
 | HOME |  OLD >>
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。