コードスニペットを作成する [C#]

コードスニペットを作成するにはまず、VSでXMLファイルを新規作成、拡張子を「.snippet」に変更します。
既存のコードスニペットや以下を参考に必要な項目を書き加えます。


VBならCode Snippet Editorというものもありますが、エディタを使用しなくとも簡単なものならVSのインテリセンス機能により容易に作成できます。

Sample Code

<?xml version="1.0" encoding="UTF-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
        <Title>cr</Title>
        <Author>Y@$</Author>
        <Description>Console.ReadLine に対するコード スニペット</Description>
        <Shortcut>cr</Shortcut>
        <SnippetTypes>
            <SnippetType>Expansion</SnippetType>
        </SnippetTypes>
    </Header>
    <Snippet>
        <Declarations>
            <Literal Editable="false">
                <ID>ConsoleClass</ID>
                <Function>SimpleTypeName(System.Console)</Function>
            </Literal>
        </Declarations>
      <Code Language="CSharp">
        <![CDATA[$ConsoleClass$.ReadLine();]]>
      </Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>

"Code"タグ内の「$」で囲まれた「$ConsoleClass$」が"Literal"タグに囲まれた"ID"にあたり、その"Function"に記述されたコードが挿入される、という仕組みです。


作成したスニペットをインポートする

[ツール]メニューの[コード スニペット マネージャ]を選択します。


コード スニペット マネージャ ダイアログが表示されます。
[インポート]ボタンを押下し、作成したsnippetファイルを選択します。


上記Sampleのスニペットの場合、"Shortcut"タグで指定したキーワード「cr」を入力し、Tabキーを2回押下するとスニペットが挿入されます。

GetFullPathとCombine [C#]

GetFullPath

名前空間System.IOのPath.GetFullPathを使用すると、同名前空間のDirectory.GetCurrentDirectory()で取得できるパスが自動で付加されます。

例)
string fileName = "foo.txt";
string fullpath = Path.GetFullPath(fileName);
「カレントディレクトリ + fileName」という文字列を返します。
カレントディレクトリが仮に『C:\fuga』とすると上記『fullpath』には『C:\fuga\foo.txt』が入ります。

また、以下のような途中までのパスを渡すと、
string path= "\mydir\foo.txt";
string fullpath = Path.GetFullPath(path);
//fullpath = C:\mydir\foo.txt"
「ルートディレクトリ + param」という形で返します。

Combine

Path.Combineは以下のように使用します。
string path = Path.Combine(dir,filename);
渡された文字列(上記の場合"dir"と"filename")の間に"\"を挿入してくれます。
必要性があまり感じられませんが、凡ミスを防ぐ意味で使うのもアリかなと。

Sample

『Directory.GetCurrentDirectory()』によって取得されるディレクトリと『Path.GetFullPath()』によって付加されるディレクトリが同じかを確かめています。
static void Main(string[] args)
{
    string fileName = "foo.txt";
    string currentDir = Directory.GetCurrentDirectory();

    string fullPath1 = Path.GetFullPath(fileName);
    string fullPath2 = Path.GetFullPath(Path.Combine(currentDir, fileName));
    
    Console.WriteLine(fullPath1);
    Console.WriteLine(fullPath2);
    Console.WriteLine(fullPath1 == fullPath2);
}

簡単にコードスニペット(Code Snippets)を挿入する[C#]

コードスニペット(ブロック)を挿入するには以下のような方法があります。

キーボード ショートカット

  • [Ctrl] + [K] Next [X] → スニペットの挿入
  • [Ctrl] + [K] Next [S] → ブロックの挿入


右クリックメニュー

  • 右クリック → [ショートカット メニュー]を表示
  • [スニペットの挿入(I)] or [ブロックの挿入(S)] を選択




しかし、もっと簡単に挿入する方法があります

キーワード + Tabキーを2回押下

コードスニペットのショートカットに登録された単語を入力し、その後Tabキーを2回押下するだけでコードスニペットを挿入することができます。

例)
if文を挿入する場合
「if」と入力し、その後Tabキーを2回押下する。
「Console.WriteLine();」を挿入する場合
「cw」と入力し、その後Tabキーを2回押下する。


msdnで公開されているコードスニペット

Visual Studio 2005 コード スニペット
今現在のVSは2008ですが、これしか見当たりませんでした…

色を反転させる Xor Color - C#

色(Color)を反転させるメソッドがないので自分で作ってみました。

二つできたので一応処理速度も比較してみましたが、違いはないのでお好みで。
必要ならAlpha値も追加すべきですが、Alpha値は反転させる対象にしない方が無難ですね。

ちなみに「0xff」は255、「0xffffff」は16777215でも何の問題もない。

Sample1

Color XorColor1(Color color)
{
    return Color.FromArgb(
        color.R ^ 0xff,
        color.G ^ 0xff,
        color.B ^ 0xff);
}

Sample2

Color XorColor2(Color color)
{
    return Color.FromArgb(
        (byte)~color.R,
        (byte)~color.G,
        (byte)~color.B);
}


他にも絶対値を返すMath.absを使用して
Color XorColor3(Color color)
{
Color.FromArgb(
        Math.Abs(color.R - 0xff),
        Math.Abs(color.G - 0xff),
        Math.Abs(color.B - 0xff));
}
このように書いてみたが、あまりスマートに感じられなかったので個人的な感覚で却下。
一応これでも可能です。


シンプルな形で。

Sample4

Color XorColor4(Color color)
{
    return Color.FromArgb(
        0xff - color.R,
        0xff - color.G,
        0xff - color.B);
}


Sample5

Color XorColor5(Color color)
{
    return Color.FromArgb(color.ToArgb() ^ 0xffffff);
}

ProcessCmdKeyでトラップされる順番 - C#

コントロールでキーストロークをトラップ方法として、ProcessCmdKeyをオーバーライドする方法が紹介されていますが、フォームとそのフォームに置かれているコントロールではどちらが先にキーストロークをトラップするのか。

結論から言えばフォームに配置されたコントロールが先にトラップします。
当たり前ですが、フォーカスを取得できるコントロールのみがトラップ可能です。

KeyDownイベントよりも先に発生します。

戻り値にtrueを返すことでKeyDownイベントでトラップされなくなります。
また、それより上階層のコントロール(フォームなど)にもトラップされなくなります。

using System.Windows.Forms;
using System.Text;

namespace ShortCutKey_Capture_Sample
{
    class xTextBox : TextBox
    {
        private bool fastFlag;
        public xTextBox()
        {
            fastFlag = false;
            this.KeyDown +=new KeyEventHandler(xTextBox_KeyDown);
        }

        void xTextBox_KeyDown(object sender, KeyEventArgs e)
        {
            ShowFaster("KeyDown", e.KeyData);
        }

        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            const int WM_KEYDOWN = 0x100;
            const int WM_SYSKEYDOWN = 0x104;

            if ((msg.Msg == WM_KEYDOWN) ||
                (msg.Msg == WM_SYSKEYDOWN))
            {
                ShowFaster("ProcessCmdKey", keyData);
            }
            return base.ProcessCmdKey(ref msg, keyData);
        }

        void ShowFaster(string methodName, Keys keyData)
        {
            switch (keyData)
            {
                case Keys.Control | Keys.N:
                    if (fastFlag)
                    {
                        fastFlag = false;
                    }
                    else
                    {
                        fastFlag = true;
                        this.Text = methodName + " Captured.";
                    }
                    break;
            }
        }
    }
}


キーの組み合わせはこのような書き方で取得することができます。
switch (e.KeyData)
{
    case Keys.Control | Keys.N:
        this.Text = "KeyDown <CTRL> + n Captured";
        break;
    case Keys.Shift | Keys.N:
        this.Text = "<SHIFT> + n Captured";
        break;
    case Keys.Alt | Keys.N:
        this.Text = "<ALT> + n Captured";
        break;
    case Keys.Alt | Keys.Control | Keys.N:
        this.Text = "<ALT> + <CTRL> + n Captured";
        break;
}

Sony Style(ソニースタイル)
デル株式会社

Recent Posts