FC2ブログ

C#でConditional属性を使用する

  • Day:2011.12.16 22:09
  • Cat:C#
Conditional属性が付けられたメソッドは、
環境設定に従って実行の有無が切り替えられます。


[Conditional("DEBUG")]
private void CheckState()
{
}

例えばこのCheckState関数は環境変数DEBUGが定義されている場合にのみ呼び出されます。

Conditional属性はメソッド全体にのみ適用できます。
また、Conditional属性を指定するメソッドの返り値は必ずvoidにします。

Conditional属性は#if/#endifよりも明確に条件付きコードを分離できます。

Effective C# 4.0

C#でカーソルを作成する

  • Day:2011.12.15 23:33
  • Cat:C#
C#でマウスカーソルをオリジナルの画像に変更したい場合は、
以下のようなクラスを使用します。


using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.Drawing;

/// <summary>
/// カーソルを作成するクラス
/// </summary>
public class CursorCreator
{
/// <summary>
/// 指定されたアイコンまたはカーソルに関する情報を取得します
/// </summary>
/// <param name="hIcon">アイコンのハンドル</param>
/// <param name="pIconInfo">アイコンの構造体</param>
/// <returns>関数が成功すると 0 以外の値が返ります</returns>
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetIconInfo(IntPtr hIcon, ref IconInfo pIconInfo);

/// <summary>
/// 指定された ICONINFO 構造体に基づいて、1 個のアイコンまたはカーソルを作成します
/// </summary>
/// <param name="icon">アイコン情報</param>
/// <returns>関数が成功すると作成されたアイコンまたはカーソルのハンドルが返ります</returns>
[DllImport("user32.dll")]
public static extern IntPtr CreateIconIndirect(ref IconInfo icon);

/// <summary>
/// カーソルを作成する
/// </summary>
/// <param name="bitmap">ビットマップ</param>
/// <param name="xHotspot">カーソルのホットスポットの X 座標</param>
/// <param name="yHotspot">カーソルのホットスポットの Y 座標</param>
/// <returns>作成したカーソル</returns>
public static Cursor CreateCursor(Bitmap bmp, int xHotSpot, int yHotSpot)
{
IntPtr ptr = bmp.GetHicon();
IconInfo tmp = new IconInfo();
GetIconInfo(ptr, ref tmp);
tmp.xHotspot = xHotSpot;
tmp.yHotspot = yHotSpot;
tmp.fIcon = false;
ptr = CreateIconIndirect(ref tmp);
return new Cursor(ptr);
}
}

/// <summary>
/// アイコンまたはマウスカーソルに関する情報を格納する構造体
/// </summary>
public struct IconInfo
{
public bool fIcon; // アイコンの場合 true, カーソルの場合 false
public int xHotspot; // カーソルのホットスポットの X 座標
public int yHotspot; // カーソルのホットスポットの Y 座標
public IntPtr hbmMask; // 透過用のビットマップハンドル
public IntPtr hbmColor; // 画像用のビットマップハンドル
}


CursorCreatorクラスのCreateCursor関数を使用することでカーソルを作成します。
ホットスポットとは、マウスをクリックした時にクリック動作の対象となる点のことです。
通常のカーソルのホットスポットは左上隅(0,0)に設定されています。


【C#プログラミング】 画像ファイルをマウスカーソルにする - ながとダイアリー
C# Tutorial - How To Use Custom Cursors Switch on the Code

C#でクラスを分割して記述する

  • Day:2011.12.14 21:12
  • Cat:C#
C#でクラスを分割して記述したい場合は、「部分クラス」を使用します。
部分クラスはclassキーワードの前にpartialキーワードを付けます。


partial class SampleClass
{
public static void SampleMethod1()
{
Console.WriteLine("SampleMethod1");
}
}

partial class SampleClass
{
public static void SampleMethod2()
{
SampleMethod1();
}
}
部分クラスを使用することで複数のソースファイルにクラスを分割して記述できます。

Effective C# 4.0

C#でnull合体演算子を使用する

  • Day:2011.12.13 23:53
  • Cat:C#
null合体演算子を使用すると、nullかどうかの判定を短く記述できます。


int? x;

x = null;

Console.WriteLine("{0}", x ?? 123); // 123

x = 456;

Console.WriteLine("{0}", x ?? 123); // 456
??の左側がnull値でない場合は、左側の式の値を評価します。
??の左側がnull値である場合は、右側の式の値を評価します。


int? x;

x = null;

Console.WriteLine("{0}", x != null ? x : 123); // 123

x = 456;

Console.WriteLine("{0}", x != null ? x : 123); // 456
条件演算子を使用した書き方と比べて、null合体演算子を使用した書き方は非常にスッキリします。

Effective C# 4.0