2012年

【6月6日】「Visual Studio Express 2012から見える「デスクトップ世界の終焉」」において以下のような誤りがありました。お詫びして訂正させていただきます。

Visual Studio 2010 Express for Windows Phone(英語版のみ)
Visual Studio 2010 Express for Windows Phone(+Windows Phone SDK 7.1.1へのアップデート

【5月11日】「F#言語の基礎文法」において以下のような誤り(=記事中の関数factが階乗にならない誤り)がありました。お詫びして訂正させていただきます。

「letキーワードを用いたコード例」における「else fact (x - 1)」というコードの一部
else x * fact (x - 1)

「このプログラムを実行すると、何が表示されるか?」というコードの一部
else x * fact (x - 1)

実行すると、5の階乗(5 * 4 * 3 * 2 * 1)である「120」ではなく、「4」が表示されたはずだ。
実行すると、5の階乗(5 * 4 * 3 * 2 * 1)である「120」ではなく、「20」が表示されたはずだ。

 2011年

【11月21日】「連載:人気順に説明する初めてのHTML5開発 第5回 双方向通信を実現! WebSocketを使いこなそう」において以下のような誤りがありました。お詫びして訂正させていただきます。

追記 WebSocketプロトコルはラストコール以降も改訂が勧められ、2011年11月の段階でhybi-17まで改訂が進んでいる。

Firefox: 6以降
Firefox: 7以降

【11月14日】連載:人気順に説明する初めてのHTML5開発 第5回 双方向通信を実現! WebSocketを使いこなそう」において以下のような誤りがありました。お詫びして訂正させていただきます。

以下の表はセキュリティ・ホールを解決したDraft(draft-ietf-hybi-thewebsocketprotocol-10)以降のDraft(=仕様の草案)に対応しているブラウザだ。現在、リリースされている主要ブラウザではChromeのみの実装となるが、2011年9月29日付で、WebApps Working Groupから、WebSocketの草案がラストコール(=最終勧告)として公開されている。
 以下の表はWebSocketプロトコルのラストコール(=最終勧告)となるDraft(draft-ietf-hybi-thewebsocketprotocol-07)以降のDraft(=仕様の草案)に対応しているブラウザだ。現在、リリースされている主要ブラウザではChromeとFirefoxのみの実装となるが、2011年9月29日付で、WebApps Working Groupから、WebSocket APIの草案もラストコールとして公開されている。
 なお、2011年11月の段階ではFirefoxでWebSocketを利用する際にWebSocketではなく、「MozWebSocket」と記載する必要がある。

Firefox: 未実装
Firefox: 6以降

// WebSocketオブジェクトの生成
var ws = new WebSocket("ws://localhost:4502/chat");
// WebSocketオブジェクトの生成
var ws;
if ("WebSocket" in window) {
  ws = new WebSocket("ws://localhost:4502/chat");
} else if ("MozWebSocket" in window) {
  ws = new MozWebSocket("ws://localhost:4502/chat");
}

【8月29日】「アプリケーションのギアを上げよう 第3回 WPFアプリケーション・チューニング」の「●DataGridコントロールにおける「UIの仮想化」」において以下のような誤りがありました。お詫びして訂正させていただきます。

では、DataGridコントロールに対して同様にVirtualizingStackPanelの添付プロパティであるVirtualizationModeとIsVirtualizingの値を以下のように変更して、再度プロセスを起動して計測するとどうなるだろうか?
.NET Framework 4の標準の(WPFの)DataGridコントロールにもVirtualizingStackPanelの添付プロパティであるVirtualizationModeとIsVirtualizingがあるが、そのほかに、テーブルの列と行に対する仮想化を有効化するためのプロパティであるEnableColumnVirtualizationとEnableRowVirtualizationがある。これらのプロパティを以下のように変更して、再度プロセスを起動して計測する。

このように、DataGridコントロールにおいても「UIの仮想化」を行うことで、その性能に改善が見られる。しかしながら、これでも時間がかかっている。.NET Framework 4標準の(WPFの)DataGridコントロールでは、UI仮想化は行方向のみに対して行われており、列方向には行われないからだ。
DataGridコントロールにおいても「UIの仮想化」を行うことで、性能に改善が見られる。しかしながら、筆者が試した範囲では、速くなるときは今回の例のように半分程度の負荷になるが、遅くなるときはUI仮想化を行っていないときとほとんど変わらない速度になることもあった。上に示した画面ではほとんど速度差がないように見えるが、今回のような描画性能の測定を行うときは複数回採取して確認してほしい。

【7月23日】「特集:人気言語でのデータ処理の比較」の「Table 2 データ処理用のメソッド比較表」において以下のような誤りがありました。お詫びして訂正させていただきます。

scanLeft
foldLeft

訂正 ScalaにもgroupByがある

訂正 rubyは1.9系でflat_mapが追加された

【5月14日】「Windowsフォーム・アプリケーションの配布方法」において以下のような誤りがありました。お詫びして訂正させていただきます。

インストーラ作成時だけではなくインストーラ実行時にも英語表記なので、配布先によってはそれだけで利用できなくなることもある。早急に改善してもらいたい問題点だ。
デフォルトの設定では、インストーラ作成時だけではなく、インストーラ実行時にも英語表記になってしまう。これを日本語表記にするには、ウィザードによるインストーラ定義後に図23のように[General Information]ウィンドウで[Setup Language]プロパティを「Japanese: 日本語」に変更すればよい。

 このプロパティ設定を行ったインストーラは、次の画面のように日本語表記になる。

【4月2日】「.NETでスマホ向けWebアプリ開発を始める前の基礎知識」の「○Sencha Touch」の説明において以下のような誤りがありました。お詫びして訂正させていただきます。

商用ライセンス(3万1395円から。※2011年4月1日時点)を購入する必要がある。
商用ライセンス(無料。※2011年4月1日時点)を購入する必要がある。

【3月15日】「改訂版 C#入門 第7章 キャストとデータ変換」において以下のような誤りがありました。お詫びして訂正させていただきます。

見て分かるとおり、実数から整数にキャストで変換する場合は、「その値を超えない最大の整数に変換される」ということになる。四捨五入に慣れたVisual Basicプログラマーなどは要注意である。
見て分かるとおり、実数から整数にキャストで変換する場合は、「小数点以下を切り捨てる」ということになる。四捨五入に慣れたVisual Basicプログラマーなどは要注意である。

【1月21日】「連載:WPF入門 第7回 WPF UI要素の基礎とレイアウト用のパネルを学ぼう」において以下のような誤りがありました。お詫びして訂正させていただきます。

Freezableクラスは、オブジェクトの状態を固定(freeze)して読み取り専用にできる(読み取り専用/書き込み可能を切り替えられるので、不変(immutable)ではなく固定可能(freezable)と呼ぶ)。
Freezableクラスは、オブジェクトの状態を固定(freeze)して読み取り専用にできる(書き込み可能なものを途中から読み取り専用に切り替えられるので、不変(immutable)ではなく固定可能(freezable)と呼ぶ)。

 2010年

【12月21日】「特集:Visual Studio 2010で社内C/Sシステム開発(前編)」において以下のような誤りがありました。お詫びして訂正させていただきます。
また、「【コラム】Gridパネルのセルにコントロールを追加する方法」を追記しました。

「Gridパネルを新規に追加するには、WPFデザイナへドラッグ&ドロップ」といきたいところなのだが、残念ながらまだWPFデザイナがこれに完全に対応していないようだ(目的のセルではなく、<Grid>要素全体に対して、コントロールが追加されてしまう。今後の機能改善に期待したい)。
「Gridパネルを新規に追加するには、WPFデザイナへドラッグ&ドロップ」といきたいところなのだが、Gridパネル内の目的のセルにコントロールを追加するには少しコツが必要だ(この方法は、後述の「【コラム】Gridパネルのセルにコントロールを追加する方法」で説明する)。

【11月28日】「特集:初めてのWPF/Silverlightデータグリッド開発」において以下のような誤りがありました。お詫びして訂正させていただきます。

SOAP形式のXML Webサービス
REST形式のWCFサービス(バイナリ・メッセージ)

http://localhost:<ポート番号>/Services/<Webアプリケーション・プロジェクト名>-<ドメイン・サービス・クラス名>.svc
(例:http://localhost:37494/Services/DataGridSampleSL-Web-DomainService1.svc)
http://localhost:<ポート番号>/Services/<Webアプリケーション・プロジェクト名>-<ドメイン・サービス・クラス名>.svc/binary/
(例:http://localhost:37494/Services/DataGridSampleSL-Web-DomainService1.svc/binary/)
(ちなみに、「http://localhost:37494/Services/DataGridSampleSL-Web-DomainService1.svc」にもアクセスできる。)

【09月06日】「連載:VBで実践! 外部コンポーネント活用術」の「全文検索エンジン『Lucene.Net』を使う」で配布しているJapaneseAnalyzerというライブラリにおいて、メモリ・リークを引き起こす不具合がありました。お詫びして修正したプログラムを配布させていただきます。この不具合は、読者により報告されたもので、その読者により詳しい情報が提供されていますので、併せてご参照ください。

【04月13日】「開発者が知っておくべきIE9の新機能」において以下のような誤りがありました。お詫びして訂正させていただきます。

登録者ベース
レジスタ・ベース

【02月07日】「安い? 高い? Windows Azure Platformの料金体系」において以下のような誤りがありました。お詫びして訂正させていただきます。

いうまでもないが、Windows Azureコンピュートへの課金が発生するのは、ロール・インスタンスが実行されている時間である。つまり、Windows Azureポータルで、ロール・インスタンスの[実行(Run)]ボタンを押したときから、[停止(Suspend)]ボタンもしくは[削除(Delete)]ボタンを押したときまでの時間である。
Windows Azureコンピュートへの課金が発生するのは、(最新の情報によると)Windows Azureポータルにロール・インスタンスが配置(Deploy)されている時間である(※ただし、課金発生は筆者が試して検証したわけではない。正確には、Microsoft Online Servicesカスタマー・ポータルにお問い合わせいただきたい)。

【01月08日】「.NET TIPS:SHA-1/SHA-2/MD5ハッシュ値を計算するには?」において以下のような誤りがありました。これに伴い、RIPEMD160クラスとRIPEMD160Managedクラスに関する記述を追加しました。お詫びして訂正させていただきます。

.NET Frameworkでは次の6つのハッシュ・アルゴリズムが利用できる。
.NET Frameworkでは主に次の6つのハッシュ・アルゴリズムが利用できる。

【01月08日】「.NET TIPS:SHA-1/SHA-2/MD5ハッシュ値を計算するには?」において以下のような誤りがありました。お詫びして訂正させていただきます。

以上のようにさまざまなハッシュ・アルゴリズムの選択肢があるわけだが、現時点での対応OSや安定性、利便性などを総合的に考えると、やはりサンプルで示したSHA256CryptoServiceProviderクラスが最も使い勝手がよいだろう。
以上のようにさまざまなハッシュ・アルゴリズムの選択肢がある。CSPについては、すべてのOSですべてのアルゴリズムが利用できるわけではない。SHA256CryptoServiceProviderクラスSHA512CryptoServiceProviderクラスは、Windows 9xやWindows XPには対応していないので注意してほしい(対応OSについて詳しくは、MSDNのページを参照してほしい)。

 

 2009年

【12月14日】「特集:安い? 高い? Windows Azure Platformの料金体系」および「特集:Windows Azure Platformの新機能」において以下のような誤りがありました。お詫びして訂正させていただきます。

アムステルダム(南ヨーロッパ)
アムステルダム(西ヨーロッパ)

【11月24日】「連載:[完全版]究極のC#プログラミング Chapter8 部分クラスと静的クラス」の練習問題の選択肢において以下のような誤りがありました。お詫びして訂正させていただきます。

5. 分割されたすべてのクラス定義にpartialキーワードを付加する必要がある
5. 分割されたすべてのクラス定義にpartialキーワードを付加する必要はない

【8月5日】「連載:〜ScottGu氏のブログより〜」の「ASP.NET MVC V2プレビュー1がリリースPage2において、原文にある「concurrency control」を「並行制御」と訳していましたが、これは「同時実行制御」の方が適切であるため、お詫びして訂正させていただきます。

【7月24日】「.NET TIPS:コンソール・アプリケーションの強制終了時に処理を行うには?(Win32編)」のサンプル・プログラムにおいて、ガベージ・コレクション発生時に正しく動作しないという問題が見つかりました。このため、SetConsoleCtrlHandler関数の引数部分でインスタンス化していたハンドラのデリゲート・オブジェクトを、クラスのフィールドに保持するように修正しました。お詫びして訂正させていただきます。

【7月16日】「特集:さらに進化を遂げたSilverlight 3」Page4の「Perspective 3DのX軸、Y軸、Z軸と正の回転の方向」という図において、図版の制作ミスにより、Y軸の回転方向が逆になっていました。お詫びして訂正させていただきます。

 

 2008年

【12月16日】「特集:VBでOracle Database開発入門(後編)」において以下のような誤りや誤解を与えかねない表現がありました。お詫びして訂正させていただきます。

 しかし、SQL Server認証にはパスワードの複雑さチェックや有効期限などのセキュリティ・ポリシーが設定できないため、Windows統合認証の採用が推奨されている。
 Oracle Databaseにも、以下のような方式があるが、データベース認証でもセキュリティ・ポリシーが設定できる。
 基本的にWindows統合認証の採用が推奨されている。なお、Windows Server 2003以降ではSQL Server認証でもWindowsパスワード・ポリシー・メカニズムというOS標準搭載の機能を活用したパスワード・ポリシーおよびパスワードの期限の設定が行える。
 Oracle Databaseにも以下のような方式があり、データベース認証でも独自のセキュリティ・ポリシーが設定できる。

データベース認証であってもセキュリティ・ポリシーが設定できるため、Active Directoryなどの外部認証やOS認証を使用しなくてもユーザー認証が可能
(SQL Server認証では、Windows Server 2003 以降を利用していれば、前述したパスワード・ポリシーを設定可能である。一方)Oracle Databaseのデータベース認証ではデータベース独自のセキュリティ・ポリシーが設定できる

読み取り一貫性(=ある行のデータの更新で排他ロックが掛かっていても、ほかのユーザーがデータを読み取れる機能)により、バッチ処理時間帯などでデータベースの情報が書き換わっていても、参照系の業務は遂行できる(挿入/更新/削除などの業務処理は行えない)
Oracle Databaseではデフォルトの設定で、読み取り一貫性(=ある行のデータの更新で排他ロックが掛かっていても、ほかのユーザーがデータを読み取れる機能)が有効になっており、バッチ処理時間帯などでデータベースの情報が書き換わっていても、参照系の業務は遂行できる(挿入/更新/削除などの業務処理は行えない)(SQL Serverでも、SQL Server 2005以降であれば、トランザクション分離レベルを変更することで、Oracle Databaseと同等の読取一貫性を提供することは可能になっている)

行レベル・ロックが既定値のため、レコードという扱いやすいロック単位でシステムが動作する。このため、プログラム・コードのレベルで考慮しなければならない点が比較的少ない
(SQL Serverにおいては行レベル・ロックが既定値で、一定の条件下ではロック管理を効率化するための「ロック・エスカレーション」が発生する。一方)Oracle Databaseでは行レベル・ロックは既定値であるが、ロック・エスカレーションは行われない。レコードという扱いやすいロック単位でシステムが動作するため、プログラム・コードのレベルで考慮しなければならない点が「比較的」少ない(なお、SQL Serverで同じように常にレコード単位のロックを利用したい場合は、ロック・エスカレーションを無効にすればよい)

 

【11月11日】「特集:VBでOracle Database開発入門(前編)」Page2の「表 Oracle Databaseのエディション」において以下のような誤りがありました。お詫びして訂正させていただきます。

「SQL Server」列の「Workgroup Edition:」の「最大メモリ」が「3GB」となっていました。
「最大メモリ = 無制限(x64は4GB) 」に修正しました。

 

【8月21日】「特集:Visual Studio 2008 SP1概説」Page1の「共有フォルダ上からのWindowsアプリケーションのフル権限実行」において以下のような誤りがありました。お詫びして訂正させていただきます。

画面や説明がイントラネット・ゾーンではなく、インターネット・ゾーンになっていました。
イントラネット・ゾーン上の動作内容に、画面と説明を修正しました。

 

【7月28日】ASP.NET MVC Preview 4リリース(パート1)において、以下のような誤りがありました。お詫びして訂正させていただきます。

【編集部注】2008年7月25日の時点ではまだ公開されていないようです。
【編集部注】2008年7月16日付けでASP.NET MVC CodePlex Preview 4 Installer + Sourceにて公開されています。

 

【4月22日】連載:初めてでも安心! 1日で作れるWebアプリ講座「最終回 それでもやっぱり『プログラミングは楽しい!』」Page3の「Page_Loadイベント・ハンドラに記述する内容」において以下のような誤りがありました。お詫びして訂正させていただきます。

ポストバックの判定処理がない。
ポストバックの判定処理が必要。
具体的には、コードの先頭に「if (!IsPostBack) {」を追加し、コードの末尾に「}」を追加する必要がありました。

 

【1月10日】連載:Ajax時代のJavaScriptプログラミング再入門「第3回 変数の宣言とスコープ」Page3のリスト14内のコメント文、およびリスト14に続く1文において、「関数リテラル」と「Functionコンストラクタ」の表記が逆になっている個所ありました。お詫びして訂正させていただきます。

var num = 0;

function scope() {
  var num = 1;

  // 関数リテラル
  var myScope1 = new Function("", "window.alert(num);");

  // Functionコンストラクタ
  var myScope2 = function() { window.alert(num); };

  myScope1(); // 0
  myScope2(); // 1
}
scope();
リスト14 関数内で入れ子に関数リテラル/Functionコンストラクタを定義した例

  結果を見ても分かるように、関数リテラルはグローバル変数numを参照しているのに対して、Functionコンストラクタがローカル変数numを参照しているのだ。
var num = 0;

function scope() {
  var num = 1;

  // Functionコンストラクタ
  var myScope1 = new Function("", "window.alert(num);");

  // 関数リテラル
  var myScope2 = function() { window.alert(num); };

  myScope1(); // 0
  myScope2(); // 1
}
scope();
リスト14 関数内で入れ子に関数リテラル/Functionコンストラクタを定義した例

  結果を見ても分かるように、Functionコンストラクタはグローバル変数numを参照しているのに対して、関数リテラルがローカル変数numを参照しているのだ。
 2007年

【12月20日】特集「VS 2008&.NET Fx 3.5概要(前編)」において以下のような誤りがありました。お詫びして訂正させていただきます。

今回からVS 2008とTeam Systemの関係は若干変更されている。両者は、これまでそれぞれ独立した枠組みで提供されていたが(つまりVisual StudioとVisual Studio Team Systemはそれぞれ別枠だったが)、VS 2008からはTeam SystemもVS 2008の枠組みの中に組み入れられる。つまり、Express Editions、Standard Edition、Professional Edition、Team Systemが「VS 2008」という枠組みの中で並列に並ぶようになる。
(記述を削除しました。VS 2005のときからTeam Systemは「VS 2005」の枠組みの中に入っていた)

【12月20日】.NET TIPS「ClickOnceのデジタル証明書を更新するには?」において以下の文を追記しました。お詫びして訂正させていただきます。

なお、読者からの問い合わせによると、VeriSignなどが発行した証明書を更新しても同様のエラーが発生することがある。筆者はVeriSignの証明書で動作を検証したわけでない

【11月10日】.NET TIPS「ClickOnceのデジタル証明書を更新するには?」において以下のような誤りがありました。お詫びして訂正させていただきます。

このエラーを回避するには、デジタル証明書を更新して有効期限を延ばすしかない。その際、上記のmakecert.exeなどのツールや第三者機関のVeriSignなどによって作成されたデジタル証明書を利用している場合は、デジタル証明書を作成したときに使用した「秘密鍵ファイル」(.pvkファイル:PriVate Key Certificate)と「公開鍵ファイル」(.spcファイル:Software Publisher's Certificate)を用いて新しいデジタル証明書を発行し、有効期限を延ばす必要がある(このとき、最初に作成したときと同一の秘密鍵ファイルと公開鍵ファイルを使わないと、デジタル証明書が一致しないというエラーになり、クライアントPCからClickOnceアプリをアップデートできないので注意すること)。
このエラーを回避するには、デジタル証明書を更新して有効期限を延ばすしかない(VS 2005でデジタル証明書を新たに作り直すと、「デジタル証明書が一致しない」というエラーになり、クライアントPCからClickOnceアプリをアップデートできないので注意すること)。

【9月10日】「Insider's Eye:.NET Framework/Visual Studio年表」において、「2008年」の欄に以下のような誤りがありました。お詫びして訂正させていただきます。Visual Studio Team System 2008は、Visual Studio 2008/.NET Framework 3.5と同時期に提供開始される予定です。

Visual Studio Team System 2008(提供時期未定)
Visual Studio Team System 2008(前半予定

【3月31日】特集:C#&VBジェネリック超入門(前編)「ジェネリック・クラスで変わるC#とVBのコレクション」において以下のような誤りがありました。お詫びして訂正させていただきます。

 実際には、ジェネリックはコレクション(コレクション・クラス)を便利に利用/実装するための仕組みといえます。コレクションとは、複数のオブジェクトをまとめて管理するためのもので、代表的なものにリストやハッシュテーブルなどがあります(リストは配列と操作方法が似ていますが、リストがサイズ固定なのに対してリストはオブジェクトをいくつでも追加できます)。
 実際には、ジェネリックはコレクション(コレクション・クラス)を便利に利用/実装するための仕組みといえます。コレクションとは、複数のオブジェクトをまとめて管理するためのもので、代表的なものにリストやハッシュテーブルなどがあります(リストは配列と操作方法が似ていますが、配列がサイズ固定なのに対してリストはオブジェクトをいくつでも追加できます)。

【1月31日】特集「Enterprise Library 2.0新機能 ― Enterprise Library 2.0を特徴づけるDI機能とは」において以下のような誤りがありました。お詫びして訂正させていただきます。

クラス・ライブラリ側のサンプル・プログラム
[InjectionMethod()]
    public void SetTargetClass()
    {
      this._targetClass.SetValue("ConcreateTargetClassを生成");
    }
[InjectionMethod()]
    public void SetTargetClass()
    {
      this._targetObject.SetValue("ConcreateTargetClassを生成");
    }

【1月15日】「Xbox 360で.NETとC#による自作ゲームを動かそう」において以下のような誤りがありました。お詫びして訂正させていただきます。

  • 4カ月:4800円
  • 12カ月:9600円
  • 4カ月:4800円 (税込5040円)
  • 12カ月:9800円(税込10290円)
 2006年

【12月2日】連載「ClickOnceの真実」の「第7回 ClickOnceが持つセキュリティ機構とは?」において以下のような誤りがありました。お詫びして訂正させていただきます。

これを利用すれば、プログラムによってClickOnceアプリが実行される前に「信頼されたアプリケーション」一覧にそのアプリケーションを登録することも可能である。そのようにすれば、以下で説明するTrustManagerによるセキュリティ検証処理はスキップされて、即座にアプリケーションを起動できる。
なお、ClickOnceアプリが実行される前に、プログラムによって「信頼されたアプリケーション」一覧にそのアプリケーションを登録しても、それが実際にローカル・ディスクにインストール/ダウンロードされていなければ、以下で説明するTrustManagerによるセキュリティ検証処理が実行される。

【11月9日】連載「.NET&Windows Vistaへ広がるDirectXの世界」の「第3回 .NET開発者のためのDirectX連携手法」において以下のような誤りがありました。お詫びして訂正させていただきます。

図:XNA Frameworkのアーキテクチャ
図:DirectX関連のテクノロジの変遷図
XConnect
XContent

なお、XInput、XACT、XConnectについては後述の「コラム:DirectX 10? Direct3D 10?」を参照のこと。
なお、XInput、XACTについては後述の「コラム:DirectX 10? Direct3D 10?」を参照のこと。

【10月23日】.NET TIPS「ClickOnceアプリをコマンドラインから発行するには?」において以下のような誤りがありました。お詫びして訂正させていただきます。

<Exec Command="xcopy &quot;$(_PublishSorcePath)&quot; &quot;$(_PublishDestPath)\&quot; /Y /I" />
<Exec Command="xcopy &quot;$(_PublishSorcePath)&quot; &quot;$(_PublishDestPath)\&quot; /E /Y /I" />

【8月5日】.NET TIPS「文字列がnull(Nothing)か空文字列かを簡単に判定するには?」において以下のような誤りがありました。お詫びして訂正させていただきます。

String.IsNullOrEmptyメソッドは静的メソッドとして実装されており、パラメータで受け取った文字列がnull(Nothing)もしくは空文字列の場合に戻り値としてFalseを返し、null(Nothing)でも空文字列でもなければTrueを返すという仕様になっている。
String.IsNullOrEmptyメソッドは静的メソッドとして実装されており、パラメータで受け取った文字列がnull(Nothing)もしくは空文字列の場合に戻り値としてTrueを返し、null(Nothing)でも空文字列でもなければFalseを返すという仕様になっている。

【7月19日】連載「ClickOnceの真実」の「第2回 ClickOnceの仕組みを理解しよう」において以下のような誤りがありました。お詫びして訂正させていただきます。

(2)ネットワーク上から起動するモードのClickOnceアプリに対しては、ClickOnceキャッシュ領域はデフォルトで250MBytesが割り当てられている(なお、(1)インストールするモードではこの制限はない)。
(2)ネットワーク上から起動するモードの部分信頼のClickOnceアプリに対しては、ClickOnceキャッシュ領域はデフォルトで250MBytesが割り当てられている(なお、(2)のモードの完全信頼のClickOnceアプリや(1)のモードでは、この制限はない)。

【7月19日】.NET TIPS「ClickOnceオンライン・キャッシュ領域をクリアするには?」において以下のような誤りがありました。お詫びして訂正させていただきます。

(2)のモードにおけるオンライン・キャッシュ領域は、デフォルトで250Mbytesが割り当てられている(※(1)のモードではこの制限はない)。
(2)のモードで部分信頼アプリケーションとして実行する場合のオンライン・キャッシュ領域は、デフォルトで250Mbytesが割り当てられている(※(2)のモードの完全信頼アプリケーションや(1)のモードではこの制限はない。なお完全信頼アプリケーションや部分信頼アプリケーションについては、「ClickOnceの真実―第2回 ClickOnceの仕組みを理解しよう」を参照してほしい)。

【7月19日】.NET TIPS「ClickOnceのログ・ファイルを特定の場所に作成するには?」において以下のような誤りがありました。お詫びして訂正させていただきます。

レジストリ・キー:HKEY_CURRENT_USER\Software\Microsoft
\Windows\CurrentVersion\Deployment
レジストリ・キー:HKEY_CURRENT_USER\Software\Classes
\Software\Microsoft\Windows\CurrentVersion\Deployment

【4月3日】特集「Enterprise Library 2.0新機能 ― Enterprise Library 2.0を特徴づけるDI機能とは」において以下のような誤りがありました。お詫びして訂正させていただきます。

クラス・ライブラリ側のサンプル・プログラム
public class ConcreateTargetClass : ITargetClass
{
  public string GetValue() { return "ConcreateTargetClassを生成"; }
  public void SetValue(string val) { this._value = val; }
}
public class ConcreateTargetClass : ITargetClass
{
  private string _value;
  public string GetValue() { return this._value; }
  public void SetValue(string val) { this._value = val; }
}
 2005年

【12月17日】特集:Visual Studio 2005がやってきた(前編)において、画面「新規プロジェクトの作成」がVisual Studio Team Systemのものとなっておりました。また、表「VS 2005で利用可能な主なプロジェクト」の「分類」として「Office」「テスト」が含まれておりましたが、VS 2005 Professional Editionにはこの分類は含まれておりません。また、以下の文章はVS 2005 Professional Editionには当てはまりません。以上、お詫びして訂正させていただきます。

削除  従来のVisual Studio .NET 2003(以降、VS.NET)では、アドオン・テンプレートであったVSTO(Visual Studio Tools for Office)が標準で搭載された点も注目だ。VSTOとは、Officeドキュメントから.NETのアセンブリを呼び出し、実行する仕組みである。

 VS 2005版のVSTOでは、Officeドキュメント自体をVS上で編集できる、Windowsフォームのコントロールを利用できるなど、開発生産性を向上させるさまざまな新機能が追加された。その有効性は認められながらも、VS.NETの時代はいまいち盛り上がらなかった同機能であるが、VS 2005でより開発が行いやすくなったことで、今後に期待できるソリューションだ。

【10月20日】「特集PDC05レポート:動的プログラミング言語へと発展するC# 3.0とVB 9.0」において、以下の部分に誤りがありました。VB.NETでは型文字が指定されていない場合、Integer型の範囲内の値はInteger型となります。また、Integer型同士の「/」による除算はDecimal型に変換されて計算されます。お詫びして削除させていただきます。

削除

 一方VBでは、次のコードの結果は「0.333333333333333」になる。VBではリテラルの数値はDouble型になっている。

Module Module1
  Sub Main()
    Dim x As Integer = 1
    System.Console.WriteLine(x / 3)
  End Sub
End Module

にもかかわらず、VBで「Dim x = 1」と書いて変数xをDouble型にすることはできない。

【9月22日】連載:「.NETで簡単XML」の「第16回 川俣流XMLプログラミングの定石(2)」において以下のような誤りがありました。お詫びして訂正させていただきます。

 速度を重視するなら「参照直前に行う」方法がベターであり、未知の要素や属性が保存されることを重視するなら「参照直前に行う」方法がベターであるといえる。
 速度を重視するなら「解析直後に行う」方法がベターであり、未知の要素や属性が保存されることを重視するなら「参照直前に行う」方法がベターであるといえる。

 XmlReader/XmlWriterを使う場合は、「解析直後に行う」方法のみが使え、「解析直後に行う」方法の使用は困難であることに注意が必要である。
 XmlReader/XmlWriterを使う場合は、「解析直後に行う」方法のみが使え、「参照直前に行う」方法の使用は困難であることに注意が必要である。

 たいていは「解析直後に行う」方法と「解析直後に行う」方法の2種類の定石を持っているだけで事足りるように思う。
 たいていは「解析直後に行う」方法と「参照直前に行う」方法の2種類の定石を持っているだけで事足りるように思う。

【7月6日】連載:「.NETの動作原理を基礎から理解する!」の「第1回 .NETアプリケーションを動かす土台」において以下のような誤りがありました。お詫びして訂正させていただきます。

 CPUが「メイン・メモリ」からWindowsのプログラム・データの処理命令を<フェッチ>して、その命令内容を<デコード>する
 CPUが「メイン・メモリ」からプログラム・データの処理命令を<フェッチ>して、その命令内容を<デコード>する

【5月26日】.NET TIPS「モーダル・ダイアログやモードレス・ダイアログを表示するには?」において以下のような誤りがありました。お詫びして訂正させていただきます。

 ShowDialogメソッドの戻り値は、ダイアログの処理結果を示すためにDialogResultプロパティで設定しておいた値である。このDialogResultプロパティの値には、DialogResult列挙体の値が使われる。

 モーダル・ダイアログの[閉じる]ボタンであるButtonオブジェクトをDialogオブジェクトのAcceptButtonプロパティに設定しておけば、ダイアログが閉じられたあと、ShowDialogメソッドの戻り値としてDialogResult.OKが返されるようになる。この場合には、[閉じる]ボタンのClickイベント・ハンドラを実装する必要がなくなる。[キャンセル]ボタンの場合も同様に、CancelButtonプロパティを設定しておけば、ダイアログが自動的に閉じられたあと、ShowDialogメソッドの戻り値としてDialogResult.Cancelが返されるようになる。ただし、これらのAcceptButtonプロパティやCancelButtonプロパティが有効に機能するのは、モーダル・ダイアログの場合だけである。次に紹介するモードレス・ダイアログでは機能しないので注意が必要である。

 ShowDialogメソッドの戻り値は、ダイアログの処理結果を示すためのもので、Dialogオブジェクト(=フォーム)のDialogResultプロパティの値である。このDialogResultプロパティの値には、DialogResult列挙体の値が使われる。

 モーダル・ダイアログ上のButtonオブジェクト(本稿の例では、[閉じる]ボタン)を、DialogオブジェクトのAcceptButtonプロパティに設定すれば、ユーザーがフォーム上で[Enter]キーを押したときに、そのボタンのクリック処理が実行されるようになる。また、CancelButtonプロパティを設定しておけば、ユーザーがフォーム上で[Escape]キーを押したときに、そのボタンのクリック処理が実行されるようになる。  

 ボタンのDialogResultプロパティに、「DialogResult.Cancel」や「DialogResult.OK」などのDialogResult列挙体の値が設定されている場合、そのボタンがクリックされるとDialogオブジェクトのDialogResultプロパティに対してそのDialogResult列挙体の値が設定される。モーダル・ダイアログでは、DialogオブジェクトのDialogResultプロパティに「DialogResult.None」以外の値が設定されると、自動的にダイアログが終了する仕組みになっている。このため、ボタンのDialogResultプロパティを設定すれば、ボタンのClickイベント・ハンドラでダイアログの終了処理を実装する必要はない(ただし次に紹介するモードレス・ダイアログの場合は、Closeメソッドなどによるダイアログの終了処理が必要となる)。

 なお、DialogオブジェクトのCancelButtonプロパティを設定すると、設定されたボタンのDialogResultプロパティに「DialogResult.Cancel」が自動的に設定される(ただし、この自動設定が行われるのは、ボタンのDialogResultプロパティの値が「DialogResult.None」の場合のときだけだ)。しかし、AcceptButtonプロパティを設定した場合では、設定されたボタンのDialogResultプロパティの値は変更されないので注意してほしい。

 ちなみに、モーダル・ダイアログで、フォーム上部のタイトル・バーにある[×]ボタン(=[閉じる]ボタン)をクリックしてダイアログを閉じた場合、DialogオブジェクトのDialogResultプロパティには「DialogResult.Cancel」が固定的に設定される。

【5月26日】.NET TIPS「ハッシュテーブル(連想配列)を使うには?」において以下のような誤りがありました。お詫びして訂正させていただきます。

 指定したキーがハッシュテーブル(この例ではht)に存在しない場合には、新しい要素として登録される。キーがすでに存在する場合には、それに対応する値が置き換えられる。
 指定したキーがハッシュテーブル(この例ではht)に存在しない場合には、新しい要素として登録される。キーがすでに存在する場合には、インデクサではそのキーに対応する値が置き換えられるが、Addメソッドでは例外が発生する。

【3月29日】.NET TIPS「ファイルやディレクトリの一覧を取得するには?」において以下のような誤りがありました。お詫びして訂正させていただきます。

 まずDirectoryクラスのメソッドでは、次のようにして検索を行える。

string[] files = Directory.GetFiles("c:\\", "*Microsoft*");
string[] dirs = Directory.GetDirectories("c:\\", "*.cs");
string[] both = Directory.GetFileSystemEntries("c:\\", "??");

 この例では、上から順に、“Microsoft”を含むディレクトリ、拡張子が“.cs”のファイル、名前が2文字以内のディレクトリかファイルを、Cドライブのルート・ディレクトリから検索する。

 同様に、DirectoryInfoクラスを使用する場合の記述例は次のようになる。

DirectoryInfo di = new DirectoryInfo("c:\\");
FileInfo[] fis = di.GetFiles("*Microsoft*");
DirectoryInfo[] dis = di.GetDirectories("*.cs");
FileSystemInfo[] fsis = di.GetFileSystemInfos("??");

 まずDirectoryクラスのメソッドでは、次のようにして検索を行える。

string[] files = Directory.GetFiles("c:\\", "*.cs");
string[] dirs = Directory.GetDirectories("c:\\", "*Microsoft*");
string[] both = Directory.GetFileSystemEntries("c:\\", "??");

 この例では、上から順に、拡張子が“.cs”のファイル、“Microsoft”を含むディレクトリ、名前が2文字以内のディレクトリかファイルを、Cドライブのルート・ディレクトリから検索する。

 同様に、DirectoryInfoクラスを使用する場合の記述例は次のようになる。

DirectoryInfo di = new DirectoryInfo("c:\\");
FileInfo[] fis = di.GetFiles("*.cs");
DirectoryInfo[] dis = di.GetDirectories("*Microsoft*");
FileSystemInfo[] fsis = di.GetFileSystemInfos("??");。

【3月15日】連載:「実例で学ぶWindowsプログラミング」の「第2回 継承と属性プログラミングで実現するRAD開発」において以下のような誤りがありました。お詫びして訂正させていただきます。

このMenuButton.MenuButtonDesignerクラスの具体的な実装内容は次のとおりだ。
このMenuButton.MenuButtonDesignerクラスの具体的な実装内容は次のとおりだ(なおこのクラスをビルドするには、あらかじめ「System.Design.dll」への[参照の追加]が必要)。

VB.NETのサンプル・コード(winexp02_05.vb)
<ToolboxBitmap(Type.GetType(Button))> _
<Designer(Type.GetType(MenuButton.MenuButtonDesigner))> _
<ToolboxBitmap(GetType(System.Windows.Forms.Button)), _
Designer(GetType(MenuButton.MenuButtonDesigner))> _

【3月15日】.NET TIPS「Windowsフォーム上のコントロールの位置やサイズを固定するには?」において以下のような誤りがありました。お詫びして訂正させていただきます。

一部のコントロールだけを指定してロックすることは(IDEのWindowsフォーム・デザイナの仕様上)残念ながらできないようだ。
一部のコントロールだけを指定してロックするには、IDEのWindowsフォーム・デザイナでコントロールを選択して、[プロパティ]ウィンドウでLockedプロパティの値を「True」に指定すればよい。

IDEのWindowsフォーム・デザイナはフォーム上のすべてのコントロールの<コントロール名>.Lockedの値を一括して「True」「False」に設定してしまうが、このリソース・エディタを使えば特定のコントロールのみをロックすることも可能だ。しかしそのようなコントロールのロック状態はIDEで想定されていないと思われるため、何らかの問題が生じないとも限らない。従って筆者は、そのような設定を行うことをお勧めしない。
IDEのWindowsフォーム・デザイナはフォーム上のすべてのコントロールの<コントロール名>.Lockedの値を一括して「True」「False」に設定する仕様となっている。個別のコントロールをロックしたい場合には、[プロパティ]ウィンドウでそれぞれのコントロールのLockedプロパティを「True」に指定する必要がある。

【1月21日】連載:改訂版「プロフェッショナルVB.NETプログラミング」の「Chapter 02 データ型の変化 − 通貨、日付、構造体の変化」において以下のような誤りがありました。お詫びして訂正させていただきます。

それに対して、Decimal型は -79,228,162,514,264,337,593,543,950,335から79,228,162,514,264,337, 593,543,950,335までの値を扱う固定小数点数値であるが、小数部の桁数は1つに決まっておらず、必要に応じて小数点の位置を変えていく仕組みのようである
それに対して、Decimal型は -79,228,162,514,264,337,593,543,950,335から79,228,162,514,264,337, 593,543,950,335までの値を扱う小数点数値であるが、小数部の桁数は1つに決まっておらず、必要に応じて小数点の位置を変えていく仕組みである
 2004年

【12月7日】連載:改訂版「プロフェッショナルVB.NETプログラミング」の「Chapter 01 基本構文の変化 − 省略可能な引数」において以下のような誤りがありました。お詫びして訂正させていただきます。

リスト1-35
1: Private Function test(Optional ByVal a As Integer)
1: Private Function test(Optional ByVal a As Variant)

本文

 見て分かるとおり、かなりソースの内容が様変わりした。Optionalキーワードを引数に付加できる点は変わっていないが、IsMissing関数はVB.NETには存在しない。つまり、引数が省略されているかどうかを確認する方法は提供されていない。その代わり、引数にデフォルト値を指定することが可能になった。このソースの1行目にある“ = 0 ”という部分は、デフォルト値の指定である。つまり、ここで記述された引数が省略された場合は、このデフォルト値が指定されたものと見なすというわけである。このため、ソース7行目のように、引数なしでtest関数を呼び出すと、引数aにはデフォルト値(0)が自動的に補われるのである。

 ここで注意が必要なのは、VB 6では引数が省略された場合に独自のコードを実行させることが容易であるのに対して、VB.NETでは省略時の値しか指定できないことである。例えばVB 6では、引数省略時に値をユーザーから入力させるコードも容易に書けるが、VB.NETでは省略時の値はソース・コード上に書き込まねばならない。

 見て分かるとおり、かなりソースの内容が様変わりした。Optionalキーワードを引数に付加できる点は変わっていないが、IsMissing関数はVB.NETには存在しない。つまり、引数が省略されているかどうかを確認する方法は提供されていない。しかし、VB6でも使用可能だった引数にデフォルト値を指定する方法が残されている。このソースの1行目にある“ = 0 ”という部分は、デフォルト値の指定である。つまり、ここで記述された引数が省略された場合は、このデフォルト値が指定されたものと見なすというわけである。このため、ソース7行目のように、引数なしでtest関数を呼び出すと、引数aにはデフォルト値(0)が自動的に補われるのである。

 ここで注意が必要なのは、VB 6では引数が省略された場合に独自のコードを実行させることが容易であるのに対して、VB.NETでは省略時の値しか指定できないことである。例えばVB 6では、引数省略時に値をユーザーから入力させるコードも容易に書けるが、VB.NETでは省略時の値はソース・コード上に書き込まねばならない。

 もう1つの相違点は、引数の型にある。VB 6においてIsMissing関数で省略可能な引数を調べる場合、引数の型はVariant型でなければならない。これは、引数を省略していることを示す情報がVariant型にしか格納されないことによる。しかし、VB.NETではIsMissiong関数が存在しないので、そのような制約を意識することなく、どのような型の引数を使用しても問題はない。その意図を示すために、VB 6のサンプル・ソースではVariant型であるのに対して、VB.NETのサンプル・ソースはInteger型を指定している。

【11月26日】.NET TIPS「マニフェスト・ファイルをアプリケーションに組み込むには?」において以下のような誤りがありました。お詫びして訂正させていただきます。

// C#の場合
csc.exe /win32res:WindowsApplication1.res /resource:Form1.resx /target:winexe /out:StyleWinXP.exe Form1.cs AssemblyInfo.cs
// C#の場合
csc.exe /win32res:WindowsApplication1.res /resource:Form1.resources,WindowsApplication1.Form1.resources /target:winexe /out:StyleWinXP.exe Form1.cs AssemblyInfo.cs

' VB.NETの場合
vbc.exe /win32resource:WindowsApplication1.res /resource:Form1.resx /target:winexe /out:StyleWinXP.exe /reference:System.dll /reference:System.Windows.Forms.dll /reference:System.Drawing.dll /imports:System.Windows.Forms Form1.vb AssemblyInfo.vb
' VB.NETの場合
vbc.exe /win32resource:WindowsApplication1.res /resource:Form1.resources,WindowsApplication1.Form1.resources /rootnamespace:WindowsApplication1 /target:winexe /out:StyleWinXP.exe /reference:System.dll /reference:System.Windows.Forms.dll /reference:System.Drawing.dll /imports:System.Windows.Forms Form1.vb AssemblyInfo.vb

【10月21日】特集 「Linuxで動く.NET環境「Mono 1.0」の実力(前編)」において以下のような誤りがありました。お詫びして訂正させていただきます。

Fedora Core 2は、Linuxの有名ブランドであるRed Hatの流れをくむ完全無料のLinuxディストリビューションである。
Fedora Core 2は、Linuxの有名ブランドであるRed Hatの実験的な無料Linuxディストリビューションである。

【9月11日】.NET TIPS「Windowsアプリケーションでアクセス・キーを割り当てるには?」において以下のような誤りがありました。お詫びして訂正させていただきます。

アクセス・キーの割り当てではないが、メニューのテキストの文字列にタブ文字(\t)を挿入することで余白を空けることができる。
アクセス・キーの割り当てではないが、メニューのテキストの文字列にタブ文字(\t)を挿入することで余白を空けることができる(C#の場合)。

【7月24日】Trend Interview「 .NET環境へのレガシー・マイグレーション」において以下のような誤りがありました。お詫びして訂正させていただきます。

 Net Express 4.0J(日本語版)は、今年(2004年)の2月から販売しており、6月には追加コンポーネントとして「Net Express with .NET」を提供開始しました。
 Net Express 4.0J(日本語版)は、2003年9月から販売しており、2004年2月には追加 コンポーネントとして「Net Express with .NET」を提供開始しました。

 Net Express 4.0は英語版が2003年11月、日本語版が2004年2月に発売されてからまだ1年もたっていませんので、すぐには大きなバージョン・アップは行いません。
 Net Express with .NETは英語版が2003年11月、日本語版が2004年2月にリリー スされてからまだ1年もたっていませんので、すぐには大きなバージョン・アップは行いません。

【7月21日】連載:熱血VBプログラマ応援団第9回 顧客にとってのVisual Basic .NETのメリット」 において、一部(下記の表を参照)に誤解を招く不正確な表現が含まれていました。お詫びして訂正させていただきます。

 例えば、アーキテクチャに互換性がない古い32bit CPUと新しい64bit CPUが混在するようなシステムでも、VB.NETでは1種類の実行ファイルを作成するだけで済みます。個々のCPUに対応するネイティブ・コードへの変換は、実行に使用するパソコンに組み込まれたJITコンパイラが行うので、そのパソコンのCPUに適合したコードが得られます。つまり、VB.NETでは再コンパイルすることなしに、最新のCPUのパワーを発揮させられるわけです。
 例えば、アーキテクチャに互換性がない古い32bit CPUと新しい64bit CPUが混在するようなシステムでも、(API呼び出しなど個々のシステム固有のアーキテクチャに依存する機能は使わないといった制約を守る限り)VB.NETでは1種類の実行ファイルを作成するだけで済みます。つまり32bitパソコン上では32bit版の.NET Frameworkがネイティブ・コードへの変換を担当し、64bitパソコン上では将来リリースされる64bit版の.NET Frameworkがネイティブ・コードへの変換を担当することで、それぞれ最適なネイティブ・コードを得ることができるわけです。これによって、VB.NETでは再コンパイルすることなしに、最新のCPUのパワーを発揮するようなプログラムも開発可能となるわけです。

【3月3日】Web Matrixで始めるWebアプリ・プログラミング 第3回「Web MatrixでWebアプリケーションを開発しよう」の表「webService.aspx上に配置するコントロールのプロパティ」で、[コントロール]=「Text」/[プロパティ]=「検索」/[値]=「」となっている個所がありましたが、これは[コントロール]=「Button」/[プロパティ]=「Text」/[値]=「検索」の誤りでした。お詫びして訂正させていただきます。

【2月2日】Web Matrixで始めるWebアプリ・プログラミング 第2回「Web MatrixによるASP.NET開発の基礎」において以下のような誤りがありました。お詫びして訂正させていただきます。

VS.NETの場合、コントロール位置を絶対位置で指定するGridLayoutモードがデフォルトであった。しかし、WebMatrixではGridLayoutモードをサポートしない。
VS.NETの場合、コントロール位置を絶対位置で指定するGridLayoutモードがデフォルトであった。しかし、Web Matrixではコントロール位置を絶対位置ではなく左上から右下へ項目順に並べるFlowLayoutモードがデフォルトとなる。 Web MatrixでGridLayoutモード相当の機能を実現する(つまりコントロールを絶対位置で配置する)には、Webフォーム上のコントロールを選択した状態で、ツール・バーの[Absolute Position]ボタンをクリックするか、またはメニューから[Layout]―[Absolute Position]を選択すればよい。 なお、VS.NETでGridLayoutモードとFlowLayoutモードを切り替えるには、Webフォーム上のコントロールではなくWebフォーム自体を選択した状態で、プロパティ・ウィンドウのpageLayoutプロパティを変更すればよい。
 2003年

【11月26日】Insider's Eys 「マイクロソフトが学生向けプログラミング・コンテストの世界大会を開催」において、2004年6月に行われる世界大会の開催場所が「スペインのバルセロナ」となっておりましたが、これは「ブラジル」の間違いでした。お詫びして訂正させていただきます。

【7月16日】「特集:私がJavaからC#に乗り換えた10の理由」において以下のような誤りがありました。お詫びして訂正させていただきます。

- 理由01 - struct

結果として、Javaプログラマは、生成と破棄のオーバーヘッドを避けるためにインスタンスを使い回したりインスタンスの粒度を大きくしたりすることになる。
結果として、大量のインスタンスを扱う場合は、生成と破棄のオーバーヘッドを避けるためにインスタンスを使い回したりインスタンスの粒度を大きくしたりすることになる。

structのデメリットは、ポリモルフィズムの使用が困難なことである。structはポリモルフィズムをあまり使用しない場合にしか適用できないのだ。
structのデメリットは、ポリモルフィズムの使用が困難なことと実行効率が悪い場合があることである。まず、実体がスタックに置かれるのでポリモルフィズムは不可能だ。そして、メソッドの呼び出しではスタックをコピーしなければならないので、あまり大きなオブジェクトを表現すると実行効率が落ちてしまう。

ただし、逃げ道がないわけではない。
ポリモルフィズムに関しては逃げ道がないわけではない。

まぁ、ヒープにコピーするせいで実行効率が落ちてしまうので、前述したようにstructはポリモルフィズムを“あまり”使用しない場合にしか適用できないのだが。
まぁ、ボックス化はヒープにコピーするので実行効率を落とすしメソッド呼び出し時のコピーも実行効率を落とすので、structはポリモルフィズムを“あまり”使用しない場合かつ“小さな”オブジェクトにしか適用できないのだが。

- 理由02 - delegate

.NET Frameworkでは、GUIのイベント・ハンドラなどのメソッド単位で完結するもののコンポジションにデリゲートを使用している。デリゲートの効果は大きく、Javaよりもはるかに読みやすいGUI部分のソース・コードを記述できる。
 .NET Frameworkでは、GUIのイベント・ハンドラなどのメソッド単位で完結するもののコンポジションにデリゲートを使用している。先ほどのコードを実装するのは面倒に感じるかもしれない。しかし、デリゲートの宣言までは.NET Frameworkがしてくれている。我々がしなければならないのはメソッドを割り当てる部分だけであり、それも演算子オーバーライドによって+=の後ろにメソッドを書くだけとなる。デリゲートの効果は大きく、Javaよりもはるかに読みやすいGUI部分のソース・コードを記述できるのだ。

- 理由07 - virtualとoverride

 優秀なJavaプログラマが書いたソース・コードを見ると、やたらと「final」が目に付く。Javaでは、finalなメソッドはポリモルフィズムの対象にならない。ポリモルフィズムが不要な部分では、finalを指定した方が実行効率を向上させられるのだ。

 逆をいえば、例えば私のような凡庸なプログラマが書いたソース・コードでは、ポリモルフィズムを使用していない部分でCPUを無駄遣いしているのだ。そして、ポリモルフィズムを使用しない部分の割合はかなり多い。はっきりいってしまえば、通常のビジネス・アプリケーションではポリモルフィズムを使う部分などほとんどないのである。結果として、多くの場合に無駄にCPUが使われていることになる。実に嘆かわしい。

 これは、Javaのデフォルトが「ポリモルフィズムあり」になっていることに原因がある。C#では違う。C#のデフォルトは「ポリモルフィズムなし」であり、ポリモルフィズムを使いたい場合にvirtualとoverrideを指定するのだ。C#なら無駄にCPUを使う可能性が減る。どうだろう、そろそろC#に乗り換えたくなってきたのではないだろうか?

 優秀なJavaプログラマが書いたソース・コードを見ると、やたらと「final」が目に付く。Javaでは、finalを指定することでサブ・クラスによるメソッドのオーバーライドを禁止できる。オーバーライドによる振る舞いの変更はたしかに便利だが、不適切なオーバーライドによるバグの可能性ももたらす。つまり、ポリモルフィズムが不要な部分では、finalを指定した方が安全性を向上させられるのだ。

 逆をいえば、例えば私のような凡庸なプログラマが書いたソース・コード(finalがほとんどない)では、ポリモルフィズムを使用していない部分に不要な危険が潜んでいる。そして、ポリモルフィズムを使用しない部分の割合はかなり多い。はっきりいってしまえば、通常のビジネス・アプリケーションではポリモルフィズムを使う部分などほとんどないのである。結果として、多くの場合に無駄な危険を冒すことになる。実に嘆かわしい。

 これは、Javaのデフォルトが「ポリモルフィズムあり」になっていることに起因する。C#では違う。C#のデフォルトは「ポリモルフィズムなし」であり、ポリモルフィズムを使いたい場合にvirtualとoverrideを指定するのだ。C#なら無駄な危険を冒さなくて済む。どうだろう、そろそろC#に乗り換えたくなってきたのではないだろうか?


スーパー・クラスのメソッドの動作を変更したい場合には、
スーパー・クラスのメソッドの振る舞いを変更したい場合には、

しかし、実行効率を上げるためにほとんどのメソッドにfinalを付けるより、ポリモルフィズムのための少数のメソッドにvirtual/overrideを記述する方が作業量は大幅に少なくて済むのである。
しかし、ほとんどのメソッドにfinalを付けるより、ポリモルフィズムのための少数のメソッドにvirtual/overrideを記述する方が作業量は大幅に少なくて済むのである。

【4月2日】次世代XML Webサービスを試す Part 4「2.WSEとWS-Attachments」のクライアント・アプリケーション作成手順のにおいて、OpenFileDialogコンポーネントを貼り付ける手順が抜けておりました。お詫びして訂正させていただきます。

【3月24日】.NETで簡単XML 第2回「XML文書を作成する」のサンプル・プログラムに記述するVB.NETのImportsステートメントにおいて、「Imports System.Xml」の前に「Imports System.IO」が抜けていました。お詫びして訂正させていただきます。

【2月14日】改訂版 C#入門 第6回「第6章 変数と値型・参照型」のサンプル・プログラムにおいて、60行目が「Console.WriteLine( "Answer6 testInt1={0}, testInt2={1}", testInt1, testInt2 ); 」となっていましたが、これは「Console.WriteLine( "Answer6 testObject1={0}, testObject2={1}", testObject1, testObject2 ); 」の誤りでした。これにともない、Fig.6-1にあるプログラムの実行結果画面も誤っておりました。お詫びして訂正させていただきます。

 2002年

【12月2日】プロフェッショナルVB.NETプログラミング 第27回「言語の動作を選択するオプション(後編)」の「3.整数のオーバーフロー・チェック」において、「Option Strict On」が「Option Explicit On」となっている個所がありました。お詫びして訂正させていただきます。

【8月12日】「Insider's Eye:.NET Framework Service Pack 2のダウンロード・サービスが開始」の冒頭、前バージョンの.NET Framework SP1について触れた部分で、当初は「SP2の公開により、SP1のダウンロード・サービスは停止されたようだ」としていましたが、これは誤りで、SP1はSP2の公開後もダウンロード可能になっており、必要であればSP1を入手して適用することも可能です。お詫びして、この修正内容に沿って記事の当該部分を訂正させていただきます。

【6月29日】オピニオン 川俣晶「Visual Studio .NETの非技術的影響」において、文中に登場した「VF.NET」について、編集部にて追加した脚注の説明が「Virtua Fighter 4(対戦型格闘ゲーム)のネットワーク・サービス」とされていましたが、これは「Virtua Fighter 4(対戦型格闘ゲーム)の登場キャクターを育成するというネットワーク・ゲーム」の誤りでした。お詫びして訂正させていただきます。

【5月24日】テラリウム徹底攻略ガイド 第4回 「KAnimalクラスを使った草食動物の作成」において、掲載したプログラム(kanimal.cs、kanimal.vb)と、そのプログラムを引用している「KAnimalクラスで処理しているイベント(2)」内のコードの一部に誤りがありました。お詫びして訂正させていただきます。

【5月20日】テラリウム徹底攻略ガイド 第3回 「オブジェクト・モデルと生物テンプレート」の「生物テンプレートの詳細(2)」において、「このとき第2パラメータには、移動速度を指定する」となっている個所がありましたが、これは「このときパラメータには移動先と移動速度を設定したMovementVectorオブジェクトを指定する」の誤りでした。 お詫びして訂正させていただきます。

【4月16日】Opinion 「XML Webサービスのキラー・アプリが登場?!」において、本文中の図に誤りがありました。図中では「XML Webサービス UDDI SOAP WSDL」で検索していましたが、現時点では、Googleが提供するXML Webサービスでは、日本語を使用できないということが判明しました(このため、これは「XML Web UDDI SOAP WSDL」で検索していることになります)。 お詫びして訂正させていただきます。

【4月16日】プロフェッショナルVB.NETプログラミング 第2回「データ型の処理」の「そのほかのデータ型の互換性」において、「この相違は、VB 6のDate型が内部的に倍精度浮動小数点型でデータを保持しているのに対して、VB.NETのDate型はクラス・ライブラリのDateTimeクラスによって実現していることから発生したものである。DateTimeクラスは、日付と時刻の双方を保持する機能を持つため、そのまま表示させると日付と時刻の双方を表示する。」となっていましたが、これは「この相違は、VB 6のDate型が内部で保持する倍精度浮動小数点型を文字列に変換するルールと、VB.NETのDate型が内部で保持するDateTime構造体の文字列への変換ルールが異なることによって発生したものである。Date型を何も指定せずに文字列に変換させる場合、VB 6では日付と時刻を含む文字列を生成する。しかし、時刻が「00:00:00」の場合は日付のみを含む文字列を生成する。これは日付と時刻を分離して扱っていた旧世代のBasic言語との互換性のための挙動と思われる。言語に対して中立な.NET Frameworkのクラス・ライブラリでは、このような互換のための配慮は継承されていないようで、単純に文字列に変換すると、条件に関係なく常に時刻を含む文字列に変換される。VB 6での動作をVB.NETでも正確に再現したい場合は、書式を明示的に指定するなどの必要がある。」の誤りでした。お詫びして訂正させていただきます。

【4月9日】プログラミングASP.NET 第1回「ASP.NETがもたらす次世代のWebプログラミング」の「2.共通化されたプログラミング・モデル」のページにおいて、「ツリー・コントロールのような高機能なコンポーネントは、デスクトップ・アプリケーションにしか用意されていない。」となっていましたが、これは「標準ではツリー・コントロールのような高機能なコンポーネントは、デスクトップ・アプリケーションにしか用意されていない。」の誤りでした。また、「3.既存システムを凌駕するASP.NETの実力」のページにおいて、「またASP.NETでは、サーバ・サイドで実行されるコードはすべて<script>タグ内部に定義されることになっているため、コードは<script>タグ内部に、ビジュアル要素は<body>タグ内部にと、それぞれ完全に分離される。」となっていましたが、これは「ASP.NETでは、コードは<script>タグ内部に、ビジュアル要素は<body>タグ内部にと、それぞれ完全に分離して記述することが可能だ。」の誤りでした。お詫びして訂正させていただきます。

 2001年

【9月29日】Keyman Interview「米Microsoft .NET DeveloperPlatform ゼネラル・マネージャ デビッド・トレッドウェル氏」のMobile Internet Toolkitに関するトレッドウェル氏の回答において、現時点で提供されいるベータ版のMobile Internet Toolkitでも「JPhoneのJ-Sky、KDDI・au・ツーカー・グループのEZwebに対応」としていましたが、ベータ版での対応は「NTTドコモのiモード」のみで、J-Sky、EZwebへの対応は製品版で行われることが分かりました。お詫びして訂正させていただきます。

【9月11日】特集:NetDictionaryで始めるWebサービス・プログラミング  第1回 「NetDictionaryプロジェクトとは何か?」の「2.ICDの開発環境」のページ、最後の見出し「@ITにおけるICDの構成」において、「ICDの各ページに対しても、@ITのフルテキスト検索用インデックスは生成されているので、記事検索ページから検索すれば、ICDに対してもフルテキスト検索を実行できるようになっている。」と記載していましたが、ICDのデータについては、@IT総合検索においても、見出しのみからの検索でした。当該表記部分を削除しました。お詫びして訂正させていただきます。

【6月13日】C#入門 第6回「変数を極めろ」のサンプル・プログラムにおいて、59行目が「Console.WriteLine( "Answer6 testInt1={0}, testInt2={1}", testInt1, testInt2 ); 」となっていましたが、これは「Console.WriteLine( "Answer6 testObject1={0}, testObject2={1}", testObject1, testObject2 ); 」の誤りでした。これにともない、「まとめ」にあるプログラムの実行結果画面も誤っておりました。お詫びして訂正させていただきます。

【6月1日】C#入門 第5回「C#のデータ型」の「数値の範囲」において、「これらは、staticなメソッドなので、System.Int16.MaxValueというような書式で指定する(ちなみに、int.MaxValueでは期待する結果が得られないようだ)。」となっていましたが、int.MaxValueも正しく動作することを確認しました。お詫びして訂正させていただきます。

【4月6日】2001年3月分のNews Releaseインデックスにおいて、03/15日付けの米Microsoft発行のニュースリリースを「米Microsoft、Webサービス記述言語WSDLがインターネットの標準化団体W3Cで承認されたことを発表」としていましたが、これは「米Microsoft、Microsoft/IBMなどが共同で提案したWebサービス開発言語WSDL仕様がW3Cへの提案を承諾されたと発表」の誤りでした。お詫びして訂正させていただきます。

【2月11日】特集「 .NET Framework SDKで始める.NETプログラミング(前編) 」の「10.Hello World展覧会(7) - Webサービス -」において、ページ冒頭にある「Webサービス版Hello Worldのソースコード」として、誤って他ページのソースコードと同一のものが掲載されていました。お詫びし、正しいソースコードに訂正させていただきます。



Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間