C#Tips

・値が変更するまで待つようにするのに適したイベント

 AutoResetEvent

 ManualResetEvent

Enumの便利 
 Enumの定数名称を取得する

 Enum.GetName( typeof( enum名称 ). enumの定数値)

 取得した値がEnumの値と合致するか判定する

 Enum.IsDefied

 値をEnumの値に変換

 Enum.Parse

 Enumの値を順次リストに追加

 foreach( 型名 test in Enum.GetValues()))

 {

  list.add(test);

 }

 

・Exeの起動環境を64bitに変更する

 メニュー→ビルド→構成マネージャ

  x64を追加する(チェックは外す)

 

・3項演算子

 条件式?条件が成立するときに返す値 : 条件式が成立しなかったときに返す値

 

・合体演算子

 値 ?? 値がNULLだったときに返す値

 

メソッドの鍵かっこ

 属性(あどりびゅーと)

 

・MessageInvoker

 引数なし、戻り値なしのデリゲート宣言

 

・Action<T>

 引数1~戻り値なしのデリゲート宣言

 

・ThreadでSleepを使用する際の注意点

 InturruptでSleepも中断させる

 →Catch( threadinterruptedException ex)

 

・ファイルを複数のスレッドから開くときの注意点

 ファイルを誰かが開いているときは、たとえ値を読み込みたいだけでも、

 ReadWriteで開いてあげないと例外をはくので注意。

 書き込むスレッド

  stream = new FileStream( filePath, FileMode.Append, FileAccess.Write, FileShare.Read)

 

 読み込むスレッド

stream = new FileStream( filePath, FileMode.Append, FileAccess.Write, FileShare.ReadWrite)

 

・共有メモリの書き込みとか

 intでも32bitとか64bitで判定が変化する可能性がある為、Int32と明確に指定する

 

・画面起動前と後で、呼ぶ処理を変えたい場合

 if( invokerequired)

 {

   test.doinvoke(method);

 }

 else

 {

  method();

 }

 

log4netでReleaseモード時にログが出力されない!!

 →pdbファイルを消しているから

  因みに、プロジェクト→プロパティ→ビルドタブ→詳細設定

 

・抽象クラスについて

 抽象クラスのコンストラクタはprotectedにする

 外部からクラスを呼ばせないようにする為?

 

・タスクトレイアイコンの作り方

 Visual Studioで参照の追加をした後、対象をダブルクリック

 

・ビルド順序の変更方法

 プロジェクトの依存関係でチェックをつけたり外したりすると変わるらしい...

 

・ListBoxの見た目で、かつ列を追加したい

 ListViewを使用

 全行選択→FullRowSelect

 

・設定ファイルの場所を決める方法

 AssemblyInfo内の

  AssemblyCompany

  AssemblyProduct

  を変更することで、

  Path.GetDirectoryName( Application.CommonAppDataPath);

  したときに場所を指定できる

 

・XSDの作成方法

 XMLを作成する

 スタート→すべてのプログラム→Visual Studio 2010 TOOL→コマンドプロンプト

 実行

 xsd C:\test.xmlを実行

 →XSDファイルが作成されている

 

・シングルトンインスタンスの書き方

 sealed class Singleton{

  private static readonly Singleton _instance = new Singleton();

  publlic static Singleton Instance{ get{ return _instance; } }

  private Singleton(){}

 *singletonとstaticメソッドの使い分け

  singletonは任意のタイミングでオブジェクトを生成することができる。

  そのため、実行ファイルを叩いても全然起動しない...みたいなことはsingletonに

  すれば解決できることもあるかも。

 

・ファイルの拡張子を返す

 Sytstem.IO.Path.GetExtension( dir);

 

・Datetime型をbyte配列に変換

 BitConverter.Getbytes( datetime.tobinary());

 

 

・実行ファイル名とパスをつなげる場合の指定方法

System.IO.Path.Combine(Application.StartupPath, "data.xml");

⇒2つのパスをつなげる場合

path = Application.StartupPath + @"\" + datetime.now.Tostring("yyyymmHH") + @"\" + 

     "data.xml";

⇒2つ以上のファイルをつなげる場合

 

log4netを使用してログを出力する方法

        /// <summary>
        /// ・Download from http://logging.apache.org/log4net/download_log4net.cgi
        /// ・解凍し、Desktop\log4net-1.2.12\src内のプロジェクトをReleaseでリビルド、プロジェクト右クリック⇒プロパティ⇒ビルドから、リリースフォルダを探し、
        /// log4net.dllを入手
        /// ・log4net.dllの参照を追加
        /// ・Assenbly.csに
        /// [assembly: log4net.Config.XmlConfigurator(ConfigFile=@"Log4net.Config.xml", Watch=true)]
        /// を追加⇒コンフィグファイル名は必要に応じて設定
        /// ・コンフィグファイルをbin\debug\内に作成(ビルド時にコピーするようビルドイベントを設定する必要あり。)
        /// http://qiita.com/rohinomiya/items/2b86c4e8d5afd5c2fb39
        /// がそのまま使える。
        /// ・同じファイルに複数のプロセスから書き込む方法
        /// <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
        /// を追加
        /// </summary>

log4netから取得する処理を作成する際、dll化して、クラス内にいちいち

 static ILog logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

 を欠かせないようにする

    /// <summary>
    /// クラスライブラリとしてプロジェクト作成、log4net.dll参照の追加

  ⇒staticプロパティに

 static ILog logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

 をリターンで返させる
    /// 利用側:
    /// LoggerDll.Class1.Logger.Info("あああ");

    /// logging.xml,ビルドイベント実施
    /// アセンブリ情報追加
    /// [assembly: log4net.Config.XmlConfigurator(ConfigFile = @"logging.xml", Watch = true)]
    /// </summary>

 

・DataGridView

編集中にほかのコントロールに遷移してrowstateが変更してくれない!→Form1.Validate()を呼ぶ。

 

・値がNULLの時にTostring()メソッドで例外を出さないようにする方法

 ⇒Convert.Tostring(obj)を使用することで、NULLの場合も空文字が返ってくる

 

 ・エクセルに記載した帳票を出力する際、

 前のデータを残さない方法(件数が前より少ない場合に前のデータが表示されないようにする方法)

 WorkBook.Save();をしない

 

・エクセルの任意のセルに値を書き込む際、

 動的に値をセットする方法

 事前にテンプレートファイルに名前の定義を設定し、

 Range("Sheet1!hogehoge").Value = "山本太郎"

 と設定する

 http://trash-area.com/archives/677

 C#で名前の定義を取得

 Range range = ExcelApp.get_Range("hogehoge", Type.Missing);

 (見つからなかったときに例外が発生するため、例外が発生しないようにうまくやる)

 

 参考:配列の自動化

 http://support.microsoft.com/kb/302096/ja

 

 

XML読み込み

 XmlDocument xmlDoc = new XmlDocument();

 xmlDoc.Load(fileName);

    XmlNode node = xmlDoc.DocumentElement.SelectSingleNode(タグの名前);

    node.Atteributes[要素の名前].Value

 

・NULLを返さずに変換する方法

 Convert.To~

 

 ・Entity Frameworkでの値の取得方法

 protected T GetObjectSet<T>(Type entityType)

    {

        return (T)this.objectContext.GetType().GetProperty(entityTye.Name).GetValue(

         this.objectContext, null);

    }

 

Excelの通貨書式が勝手に変わらないようにする方法

 xlBook.SaveAs(xlBook.FullName, Local : true);