2010年1月27日水曜日

[TOOL]C#のデバッグ終了が遅い

いつからかわかりませんが、Visual C#のデバッグが終了するのが異常におそく、デバッグするのが億劫になっていました。
会社ではこんなこと無いので、ちょっと調べてみると、
[ツール]→[オプション]→[環境]→コンテンツをダウンロードする間隔(D)をオフにするとOK。的な情報を見つけました。で設定変更してみるとすいーっと終わるようになります。チョー快適。

ファイル更新後の保存時 (Ctrl+Sなど) にCPU使用率が最大となり、しばらく操作不能となる 」とか「Visual Studio 2008でデバッグ終了後、編集可能になるまでに時間がかかる場合は?」に詳細が記載されています。

[SQL]SQL文を最速にする11のポイント

先日、なにげにニッケイのサイトをみていると、SQL文を最速にする11のポイントという記事を発見しました。

基本的なことが、わかりやすくかいてあります。他連載も興味深い。備忘録としてメモ。

2010年1月26日火曜日

[TOOL]Spy++っぽいツール

先日、Visual Studioに付属のSpy++が使いたい用件がありました。しかし、ライセンスの都合上ExpressEditionを使っていたため、Spy++が付属していません。
途方にくれていると、UISpyなるツールがWindowsSDKに付いているとの情報をキャッチ。SDKはインストール済みなので、早速インストールフォルダを確認してみると、それらしいツールはありませんでした。

で、情報を探してみると、SDKでも↓のバージョンじゃないと入っていないらしいとのこと。

Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1

現在、確認中。

2010年1月22日金曜日

[ASP.NET]状態管理に関する推奨事項

ASP.NETでは状態管理のしかたとしてApplication > Session > Requestの順で、広いスコープでデータを管理します。それ以外に、Cookieがあります。でそれらの使い分けについて、まとめられているページを見つけました。備忘録としてメモ。「ASP.NET の状態管理に関する推奨事項

2010年1月15日金曜日

[.NET]シャローコピーとディープコピー

objectクラスにはMemberwiseCloneというメンバ変数をコピーしてくれるメソッドが標準で搭載されています。しかし、このメソッドはシャローコピーなので、内包しているクラスがある場合、そのオブジェクトをコピーしません。
で、コレを解決するにはディープコピーするしかないのですが、コレを簡単にやる方法としてシリアライズする方法があります。意外と簡単。コードはこんな感じ。


//using System.IO;
//using System.Runtime.Serialization.Formatters.Binary;
private void button1_Click(object sender, EventArgs e)
{
    CopyTest test1 = new CopyTest();
    System.Diagnostics.Debug.WriteLine(test1);
    //『IntData=[1] ,StringData=[1], modeText[葉]』と表示される
    test1.SetChild();

    // インスタンスをコピーする
    CopyTest test2 = test1.Clone();
    CopyTest test3 = (CopyTest)Clone(test1);

    System.Diagnostics.Debug.WriteLine(test1);
    System.Diagnostics.Debug.WriteLine(test2);
    System.Diagnostics.Debug.WriteLine(test3);
    //『IntData=[1] ,StringData=[1], modeText[枝]{IntData=[1] ,StringData=[1], modeText[葉]}』と表示される
    //『IntData=[1] ,StringData=[1], modeText[枝]{IntData=[1] ,StringData=[1], modeText[葉]}』と表示される
    //『IntData=[1] ,StringData=[1], modeText[枝]{IntData=[1] ,StringData=[1], modeText[葉]}』と表示される


    // Childのインスタンスがシャローコピーなので、test1/test2のIntDataが同じ値になる
    test2.Child.IntData = 3;
    System.Diagnostics.Debug.WriteLine(test1);
    System.Diagnostics.Debug.WriteLine(test2);
    //『IntData=[1] ,StringData=[1], modeText[枝]{IntData=[3] ,StringData=[1], modeText[葉]}』と表示される
    //『IntData=[1] ,StringData=[1], modeText[枝]{IntData=[3] ,StringData=[1], modeText[葉]}』と表示される

    // test3はディープコピーになるので、IntDataは1のまま
    System.Diagnostics.Debug.WriteLine(test3);
    //『IntData=[1] ,StringData=[1], modeText[枝]{IntData=[1] ,StringData=[1], modeText[葉]}』と表示される

}

private static object Clone(object obj)
{
    object result = null;

    using (MemoryStream ms = new MemoryStream())
    {
        BinaryFormatter bf = new BinaryFormatter();
        bf.Serialize(ms, obj);

        ms.Position = 0;
        result = bf.Deserialize(ms);

    }

    return result;
}

[Serializable()]
public class CopyTest
{
    public int IntData { getset; }
    public string StringData { getset; }

    private string modeText = "葉";

    public CopyTest Child { getset; }

    public CopyTest()
    {
        IntData = 1;
        StringData = "1";

    }

    public void SetChild()
    {
        modeText = "枝";
        Child = new CopyTest();
    }

    public override string ToString()
    {
        string result = "IntData=[" + IntData + "] ,StringData=[" + StringData + "], modeText[" + modeText + "]";
        if (Child != null)
        {
            result += "{" + Child.ToString() + "}";
        }
        return result;
    }

    public CopyTest Clone()
    {
        return (CopyTest)MemberwiseClone();
    }
}

2010年1月12日火曜日

[.NET]スレッドに引数を渡す

スレッドを生成する場合、.NET 1.1系では引数を使うことができず、SetDataメソッドで対応していましたが、.NET2.0以降ではParameterizedThreadStart デリゲートを使うことにより、実現できるようです。

しかしThread.Startにも引数付きのものが用意されています。どう違うのかMSDNのサンプルからはいまいち読み取れない。。。

2010年1月5日火曜日

[.NET]コンソールアプリでコンソールを消す

.NETでコンソールアプリを作ると、通常、コンソールを消すことができません。が、p/involeを使うことにより、消すことができます。コードはこんな感じ。なのですが、エクスプローラからダブルクリックすると一瞬コンソールが表示されてしまいます。

class Program
{

    [DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
    static extern bool FreeConsole();

    static void Main(string[] args)
    {
        FreeConsole();
        Thread.Sleep(5000);
    }
}


で、完全に消すと方法としては、WindowsFormアプリにしておいて、Formを表示しないという技がありますが、なんとなく違和感がありますね。

2010年1月1日金曜日

[.NET]プライベートコンストラクタのクラスを強引にインスタンス化する

privateコンストラクタしかないクラスや都合によりprivateコンストラクタからインスタンス化したい場合、Activator.CreateInstanceでは、MissingMethodExceptionが発生してしまいます。
こういう場合、Typeからコンストラクタを取り出し、そこからインスタンス化します。コードはこんな感じ。

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //using System.Reflection;
            MethodBase.GetCurrentMethod();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            Type tp = typeof(PrivateConst);
            ConstructorInfo ci =  tp.GetConstructors(BindingFlags.NonPublic| BindingFlags.Instance)[0];

            object obj = ci.Invoke(new object[] { });

            System.Diagnostics.Debug.WriteLine("Type=" + obj.GetType());

            //「Type=WindowsFormsApplication1.PrivateConst」と表示された
        }
    }

    class PrivateConst
    {
        private PrivateConst()
        {
        }
    }
}