目次

フォルダ

プログラムを起動したフォルダを取得する

パスは起動したフォルダを基準とした相対パスになります。 したがって、new DirectoryInfo("."); でプログラムを起動したフォルダを取得できます。

プログラムを置いてあるフォルダを取得する

プログラムの実行ファイルを置いてあるフォルダは Application.StartupPath で取得できます。

特殊なフォルダのパスを取得する

System.Environment.GetFolderPath を利用することで デスクトップやマイドキュメントなどの特殊なフォルダのパスを取得できます。

ファイル操作

シフトJISのテキストを読み書きしたい。

文字コードを指定してファイルを読み書きするには、 StreamReader/StreamWriter クラスのコンストラクタで Encoding クラスを渡してやります。

日本語 Windows 環境では、Encoding.Default でシフト JIS の Encoding が得られる。

StreamReader fin  = new StreamReader(
  "in file", Encoding.Default);
StreamWriter fout = new StreamWriter(
  "out file", false, Encoding.Default);

ちなみに、シフト JIS のコードページは 932。 (日本語 Windows では)以下のコードと上のコードは同じ結果に。

StreamReader fin  = new StreamReader(
  "in file", Encoding.GetEncoding(932));
StreamWriter fout = new StreamWriter(
  "out file", false, Encoding.GetEncoding(932));

文字列操作

stringからシフトJISコードのbyte配列に変換したい

Encoding クラスの GetBytes メソッドを使います。

文字コードの指定は Encoding クラスを用いて行います。 シフトJISのコードページは 932 です。 また、日本語 Windows 環境では Encoding.Default によってシフトJISのエンコーディングクラスを取得できます。

Encoding.GetEncoding(932).GetBytes(str);
Encoding.Default.GetBytes(str);

正規表現を使いたい

System.Text.RegularExpressions クラスを用いることで文字列の正規表現検索が出来ます。 .NET Framework の正規表現は Perl5 の正規表現と親和性の高いデザインになっています。

参考: 「文字列関係

詳しくはヘルプの「.NET Framework の正規表現」や「正規表現言語要素」をご覧ください。

文字が平仮名・片仮名・漢字かどうか調べたい

正規表現を使って文字のクラスを調べられる。 平仮名は文字クラス IsHiraganaに、 片仮名は IsKatakana、漢字は IsCJKUnifiedIdeographs にマッチする。

// 平仮名だけからなる単語にマッチ
Regex hira  = new Regex(@"\b\p{IsHiragana}+\b");
// 片仮名にマッチ
Regex kata  = new Regex(@"\p{IsKatakana}");
// 漢字にマッチ
Regex kanji = new Regex(@"\p{IsCJKUnifiedIdeographs}");

その他にも文字クラス名を指定することでさまざまな文字クラスが判定可能。 文字クラス名はunicode.orgにあるブロック名一覧のブロック名にIsをつけたもの。

時刻

任意の形式で文字列化されている時刻を DateTime 型に変換したい

DateTime.ParseExact メソッドで、 以下のようにしてフォーマットを指定。

string str = "08/Jul/2006:03:28:50 +0900";

Date d = DateTime.ParseExact(str,
  "d'/'MMM'/'yyyy':'HH':'mm':'ss zzz",
  System.Globalization.DateTimeFormatInfo.InvariantInfo,
  System.Globalization.DateTimeStyles.None);

出力

C の printf みたいにフォーマット出力したい

System.Console.Write(string, params object[]) を使えばフォーマット出力が可能です。 パラメータの書式は以下の通り

{N,M:format}
  • N: パラメータのインデックス

  • M: 表示する幅。不足分はスペースで埋められる。正の数の場合右詰、負の数の場合左詰。

  • format: 書式指定。パラメータがIFormattableインターフェースを実装している場合、この書式に従って整形される。

ちなみに、Console.Write の書式指定の仕方は、 string.Format メソッドの書式指定と同じです。 string.Format メソッドに関しては、 「文字列関係」で概説しているので、そちらを参照。

また、詳細は ms-help://MS.NETFrameworkSDK.JA/cpguidenf/html/cpconformattingoverview.htmで見ることが出来ます。

入力

C の scanf みたいなことをしたい

例)

int width, height;
scanf("width %d height %d", &width, &height);

1)正規表現を使う

const string pattern = @"height (?<height>\w+) width (?<width>\w+)"; 

Regex x = new Regex(pattern);
string str = Console.ReadLine();
Match m = x.Match(str); 

int width = m.Group("width");
int height = m.Group("height");

2) Split を使う

string str = Console.ReadLine();
sring strs = str.Split(' ');
int width = int.Parse(strs[1]);
int height = int.Parse(strs[3]);

リソース

リソースファイルの作成

using System.Drawing;
using System.Resources; 

class CreateResource
{
  static void Main()
  {
    using(ResourceWriter writer =
      new ResourceWriter("リソースファイル.resources"))
    {
      writer.AddResource("リソース名", new Icon("ファイル.ico"));
      writer.Generate();
    }
  }
}

後はコンパイル時に /res を指定するだけ。

リソースの利用

ResourceManager rm = new ResourceManager(
  "アセンブリ名", this.GetType().Assembly);
this.Icon = (System.Drawing.Icon)rm.GetObject("リソース名");

ネイティブコードとの相互運用性

構造体のレイアウト

System.Runtime.InteropServices.StructLayout アトリビュートを使って構造体のレイアウトを指定できます。

  • LayoutKind.Auto… 自動レイアウト

  • LayoutKind.ExplicitFieldOffsetアトリビュートを使って明示的にレイアウト

  • LayoutKind.Sequential… 宣言した順にレイアウト

LayoutKind.Sequential をコンストラクタに渡した場合、 Pack プロパティでパッキングサイズを調整できます。 デフォルトの Pack の値は 8 です。

構造体を C 言語の共用体のように使う

構造体のレイアウトを LayoutKind.Explicit にすることで C 言語の共用体のような使い方が出来ます。

using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Explicit)]
struct Hoge
{
  [FieldOffset(0)] public byte B;
  [FieldOffset(0)] public int N;
} 

class Test 
{ 
  static void Main() { 
    Hoge h = new Hoge(); 
    h.N = 257; 

    Console.WriteLine(h.B); // 1 が表示される
  } 
} 

シリアライズ

オブジェクトをシリアライズする

  • バイナリで … System.Runtime.Serialization.Formatters.Binary.BinaryFormatter

  • SOAPメッセージで … System.Runtime.Serialization.Formatters.Soap.SoapFormatter

  • XMで … System.Xml.Serialization.XmlSerializer

Win32

システムイベントを拾う

Microsoft.Win32.SystemEvents クラスのパブリックイベントで表示設定変更、時刻の変更、メモリ不足などのイベントを拾える。

GUI

Windows XP のビジュアルスタイルを使用する

マニフェストを使用して Comctl32.dll version 6 がバインディングされるように設定する。 具体的な方法は以下の通り。

以下のXMLを「[実行ファイル名].manifest」という名前で保存し、 実行ファイルと同じディレクトリに置く。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly
  xmlns="urn:schemas-microsoft-com:asm.v1"
  manifestVersion="1.0">
<dependency>
   <dependentAssembly>
     <assemblyIdentity
       type="win32"
       name="Microsoft.Windows.Common-Controls"
       version="6.0.0.0"
       processorArchitecture="X86"
       publicKeyToken="6595b64144ccf1df"
       language="*"
     />
   </dependentAssembly>
</dependency>
</assembly>

マニフェストを実行ファイル中に埋め込むためには、 リソースタイプ「RT_MANIFEST」、ID「1」のリソースとして埋め込む。 Visual Studio .NET を使えば、以下の手順で簡単にマニフェストの埋め込みが出来る。

  • メニューの[ファイル]から[ファイルを開く]を選び、マニフェストを埋め込みたい実行ファイルを開く。

  • 開いた実行ファイルを右クリックし[リソースの追加]を選び、[インポート]をクリックする。

  • 埋め込みたいマニフェストファイルを選ぶ。

  • マニフェストタイプに[RT_MANIFEST]と入力する。

  • 追加されたマニフェストリソースのプロパティを開き、IDを「1」に変更する。

フォームの再描写がちらつく

Paint イベントを使ってフォームの際描写を行うと描写がちらついてしまう。 (OnPait メソッドでは、背景の塗りつぶしを行ってから Paint イベントハンドラを呼び出すため。) OnPaintBackground メソッドをオーバーライドして描写を行えばちらつきはなくなる。

ツール

PreJIT って出来ないの?

Ngen.exe (native image generater)で出来ます。 詳しくはms-help://MS.NETFrameworkSDK.JA/cptools/html/cpgrfnativeimagegeneratorngenexe.htmを参照してください。

フリーの開発環境はないの?

https://sourceforge.jp/projects/sharpdevelop-jp

Visual C# 2005 Express Edision が無料で利用可能になった。

更新履歴

ブログ