■ フォルダ
■ ファイル操作
■ 文字列操作
■ 出力
■ 入力
■ リソース
■ ネイティブコードとの相互運用性
■ シリアライズ
■ Win32
■ GUI
■ ツール
● プログラムを起動したフォルダを取得する
● プログラムを置いてあるフォルダを取得する
● 特殊なフォルダのパスを取得する
パスは起動したフォルダを基準とした相対パスになります。
したがって、new DirectoryInfo(".");
でプログラムを起動したフォルダを取得できます。
プログラムの実行ファイルを置いてあるフォルダは
Application.StartupPath で取得できます。
System.Environment.GetFolderPath を利用することで
デスクトップやマイドキュメントなどの特殊なフォルダのパスを取得できます。
● シフトJISのテキストを読み書きしたい。
文字コードを指定してファイルを読み書きするには、
StreamReader/StreamWriter クラスのコンストラクタで Encoding クラスを渡してやります。
StreamReader fin = new StreamReader("in file", Encoding.GetEncoding(932)); StreamWriter fout = new StreamWriter("out file", false, Encoding.GetEncoding(932));
● stringからシフトJISコードのbyte配列に変換したい
● 正規表現を使いたい
● 文字が平仮名・片仮名・漢字かどうか調べたい
文字コードの指定は 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をつけたもの。
● C の printf みたいにフォーマット出力したい
System.Console.Write(string, params object[]) を使えばフォーマット出力が可能です。
パラメータの書式は以下の通り
{N,M:format}
N: パラメータのインデックスM: 表示する幅。不足分はスペースで埋められる。正の数の場合右詰、負の数の場合左詰。format: 書式指定。パラメータが IFormattable インターフェースを実装している場合、この書式に従って整形される。詳細はヘルプで見ることが出来ます。
● 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
{
public 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("リソース名");
● 構造体のレイアウト
● 構造体を C 言語の共用体のように使う
System.Runtime.InteropServices.StructLayout アトリビュートを使って構造体のレイアウトを指定できます。
LayoutKind.Auto … 自動レイアウトLayoutKind.Explicit … FieldOffset アトリビュートを使って明示的にレイアウトLayoutKind.Sequential … 宣言した順にレイアウト
LayoutKind.Sequential をコンストラクタに渡した場合、
Pack プロパティでパッキングサイズを調整できます。
デフォルトの Pack の値は 8 です。
構造体のレイアウトを 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
{
public static void Main() {
Hoge h = new Hoge();
h.N = 257;
Console.WriteLine(h.B); // 1 が表示される
}
}
● オブジェクトをシリアライズする
● システムイベントを拾う
Microsoft.Win32.SystemEvents クラスのパブリックイベントで表示設定変更、時刻の変更、メモリ不足などのイベントを拾える。
● 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 を使えば、以下の手順で簡単にマニフェストの埋め込みが出来る。
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