連載:[完全版]究極のC#プログラミング

Chapter19 小さな改善とコンパイラの新機能

川俣 晶
2010/05/24
Page1 Page2 Page3 Page4

19.4 volatileがIntPtr型およびUIntPtr型へ適用できる

 難しい話ではないので、要約のみ説明する。

 volatileキーワードは、マルチスレッドのプログラミングなどを行うとき、そのスレッド外の要因でいつ書き換えられるかわからないフィールドに付加するキーワードである。

 しかし、実際に実装するとなると話は簡単ではない。1回の操作で書き換えが完了しないような大きなデータは、書き換え中の不完全な姿でほかのスレッドに見えてしまうことがありうるからだ。それゆえに、すべての型にvolatileキーワードを付加することはできない。整数型や実質的に整数(ポインタ)そのものである参照型などにしか付加できない。

 しかし、実質的に「整数として扱えないが本当は整数」として使われるIntPtr型とUIntPtr型に関しては、volatileキーワードの利用を拒む理由はなく、かつ、volatileキーワードが利用できれば有益である。そこで、C# 2.0ではこの2つの型にもvolatileキーワードを付加できることになった。

 ……と簡単に断言できればよいのだが、実はC#の言語仕様Version 1.2を見ると、volatileキーワードを適用できる型は以下のようになっている。

reference-type(参照型)
byte、sbyte、short、ushort、int、uint、char、float、bool、System.IntPtr、またはSystem.UIntPtr型

byte、sbyte、short、ushort、int、またはuintの列挙基本型を持つenum-type(列挙型)

 このように、IntPtr型とUIntPtr型が含まれている。C# 1.2ですでに用意された機能らしい。

 とはいえ、Visual Studioという製品についての話であれば明確である。Visual Studio .NET 2003のC#コンパイラは、「volatile IntPtr a;」といった記述をエラーとして受け付けない。しかし、Visual Studio 2005以降のC#コンパイラは受け付ける。そのような意味で、Visual Studioユーザーの観点からはVisual Studio 2005以降の新機能と受け止めてよい。

【Exercise】練習問題

 以下のサンプルソースを実行可能にするにはどの修正を行えばよいか? 正しいものを選べ。

using System;

partial class Program
{
    static partial void sample();

    static void Main(string[] args)
    {
        sample();
    }
}
  1. 「static partial void sample();」という行を除去する
  2. 「partial class Program」からpartialキーワードを除去する
  3. 「static partial void sample();」からpartialキーワードを除去する
  4. Programクラスに「static void sample() { }」を追加する
  5. 何も変更する必要はない。そのままコンパイル実行でき、何も処理を行うことなく終了する

 ◎解答:「5」(この行をマウスで選択してください)End of Article


 INDEX
  [完全版]究極のC#プログラミング
  Chapter19 小さな改善とコンパイラの新機能
    1.19.1 インライン警告制御「#pragma warning」
    2.19.2 部分メソッド定義
    3.19.3 固定サイズバッファ
  4.19.4 volatileがIntPtr型およびUIntPtr型へ適用できる/練習問題
 
インデックス・ページヘ  「[完全版]究極のC#プログラミング」


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 記事ランキング

本日 月間