【メモ】C#.netの覚書

開発ざれごと

601b5395c084d9c17502398e0d728edb

以前に、仕事でC#を覚えるのにメモったものが出てきたので、ここに置いておきます。

これからC#をやる方もいるかと思いますので、使えれば参考にどうぞ。

《環境関係》
●イミディエイトへの出力
オプション内のチェックボックス有り
●ノータッチデプロイメント
ネット上のEXEをセキュアブロックを受けず動かせるようになる
以下、セキュリティゾーンを取得する方法(判断)
using System.Security;
using System.Security.Policy;
SecurityZone myZone =
  Zone.CreateFromUrl(AppDomain.CurrentDomain.BaseDirectory).SecurityZone;
if (myZone == SecurityZone.Internet)
{
  ・・・・・・
}
●ClickOnce(発行)
アプリケーションのセットアップを作成する
通常のローカルインストールの他、ネット経由のものもサポートしており、
更新やバージョンダウンもユーザーの手で行える手段も提供している
また、必要なコンポーネントのインストールも設定可能

●ActiveX
.NETでも開発する事ができる
ただし、クライアントに.NET Frameworkが導入されている必要あり

《データベース関係》
●DataSetについて
非接続型DBの.NET推奨スタイルの形であり、
AdapterによるリアルDBの操作と、DataSetのメモリ格納型簡易DB、
DataSetとFormを接続するBinddingが大きな要素。
設計をしっかりしていないと、DataSetインスタンスが膨大になり、
リソースを圧迫する。

●DBの種類
直接的にサポートしているのは、
SQLServerとOracleのみで、他は、ODBC経由などを利用する

●LINQ機能
VisualStudio2008ではLINQ構文が便利らしい
SQLではなく、LINQ構文にて、直接DBアクセス文を記述できる。
SQL文とは似ているが違うもの。
コードが小さく、コーディング中での文法エラー表示。

●DB直接アクセス
System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(コネクション文);
System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand("", con);
con.Open();
System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand("", con);
cmd.CommandText = @"SELECT * FROM TABLE";
cmd.CommandTimeout = 300;
cmd.ExecuteNonQuery();
con.Close();
con.Dispose();
cmd.Dispose();

●DataSetによる非接続型DBアクセス(名前付き)
利点:DBがオブジェクトとしてマッピングされる
難点:DBの変更があった場合など、内部構造の理解が必要
DBウィザードによりDataSet生成を行う。
基本構造は以下。
DataSet→DataTable(s)→DataRow(s)/DataRowView
これらのオブジェクトを基底に名前付けされ生成される。
各レコードは、状態が保持され(新規/更新/削除など)
最終的に、DataSet/AdapterによるUPDATEにて、自動的にDB更新される。

SHMSDataSetKW.T_USERRow dr;
dr = (SHMSDataSet.T_USERRow)this._dtUser.NewRow();    //新規行の取得
dr.BeginEdit();    //行編集の開始
dr.RIREKI_ID = _iRirekiID;
dr.SAGYO_KUBUN = _iSagyoKubun.ToString();
dr.KN_NO = _iKNNo;
dr.UKE_KN_CD = 0;
dr.TOROKU_NUM = 0;
dr.AFTER_NUM = 0;
dr.EndEdit();    //行編集の確定(CancelEditでキャンセル可能)
this._dtUser.AddT_USERRow(dr);    //DataTableに行追加
this._dtUser.AcceptChanges();    //行ステータスを確定
(RejectChangesは、元に戻す)
※Buinding機能を利用すると、さらに被される
※DBへのリアルな更新は、Adapterを利用する

●DataBindding
なんとなくAccessのような感じのインターフェースで
利用できるようになる。
レコードが画面コントロールに対応し、あとは勝手に、
やってくれる。
凝った事をすると苦しむ。

●ファイルへバックアップ(SQLServer)
SQLServerの機能を利用。
System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(コネクション文);
con.Open();
System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand("", con);
cmd.CommandText = @"BACKUP DATABASE SHMS TO DISK=’" + _bk_path + "’";
cmd.CommandTimeout = 300;
cmd.ExecuteNonQuery();
con.Close();
con.Dispose();
cmd.Dispose();

●ファイルから復元(SQLServer)
キーや項目の追加なども全て行う。
System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(コネクション文);
System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand("", con);
con.Open();
cmd.CommandText = @"ALTER DATABASE DB SET SINGLE_USER WITH ROLLBACK IMMEDIATE";
cmd.ExecuteNonQuery();
cmd.CommandText = @"ALTER DATABASE DB SET MULTI_USER";
cmd.ExecuteNonQuery();
cmd.CommandText = @"RESTORE DATABASE DB FROM DISK=’" + _bk_path + @"’ WITH REPLACE";
cmd.CommandTimeout = 300;
cmd.ExecuteNonQuery();
con.Close();
con.Dispose();
cmd.Dispose();

《コーディング関係》
●属性
[STATread]など、クラスやメソッドなどに属性を加えられる
自分で開発する事も可能。以下、標準の一部
[System.ObsoleteAttribute] 将来削除予定のもの
[System.SerializableAttribute] シリアル可能

●例外エラー
大方のものは原因や場所が把握できるが、それでも
分からない場合は、「型」に注視すれば良し。

●フォームデザイナー
複雑なものを作成すると、デザイナ上で、エラー表示となる事がある
これは、再度開くや、VisualStudio再起動などで復帰する事が良くある。
これを知らず、デザイナコードを編集するとハマる。

●型変換
C言語らしくキャストも利用できるが、以下が良い。
数値→文字は、.tostring(書式)
文字→数値は、型.parse()/型.tryparse()
例外を回避する場合は、tryparseを利用する

●空文字・NULL文字の判断
string.isNullOrEmpty()

●DateTimeオブジェクト
日付時間が扱える、NULLは利用できない。
最小値及び最大値があるが、DBのそれとは違うので注意。
現在時間は、DateTime.Now

●文字列の連結
数字演算と同様に、+を使うことができるが、
その都度、内部ではメモリ確保を繰り返しているため
処理速度が非常に遅い。
StringBuidlerが高速。append()にて、追加できる。
メモリが、倍々と確保されているため、コストが少ない。
new StringBuidler(100000)のようにして、初期値を与えて
おくと良い。

●クラス定義の分割(Partial)
複数ファイルでクラス定義を分ける事ができる
partial class Complex
{
  public double re;
  public double im;
}
—-別ファイル—-
partial class Complex
{
  public double Abs()

  {
    return Math.Sqrt(re * re + im * im);
  }
}

●匿名メソッド(.NET3)
var x = new { FamilyName = "あ", FirstName="い"};

●using(){}の利用
オブジェクトの破棄及び、例外処理も自動で行う。
コンパイル後の内部コードは同一。

●オブジェクトの破棄
GCにて自動で破棄されるが、そのタイミングが分からない
ため、任意に破棄する方法は、Disposeを利用する。
ただし、Disposeが用意されたオブジェクトのみ。

●ヒアドキュメント
@""と頭に@を付ける事で記述する事ができる。

●String.FormatやToString文字フォーマット
String.Format("")では、sprintfのような事が実現できる。
引数として、.NET規定のフォーマット指示を渡せる。
str = string.format("This is a {1:S}.","pen");
例:{引数No,表示桁数:CやSなど多様 変換に対する引数}
※桁はマイナスにすると左寄せとなる
{1,8:D8} 数値、8桁にカンマ区切りで8桁、右寄せ
※↑今うろ覚えで書いてます

●特殊ホルダーのパス取得、デスクトップなど
string desktopPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Desktop);

●XML文書のDOM読み込みだけ
※例ではExcel2003XML文書
※名前空間を忘れず指定する事
using System.Xml;
XmlDocument xdoc = new XmlDocument();
xdoc.Load("Book1.xml");
XmlElement enode;
enode = xdoc.DocumentElement;
XmlNamespaceManager m = new XmlNamespaceManager(xdoc.NameTable);
m.AddNamespace("ss", "urn:schemas-microsoft-com:office:spreadsheet");
m.AddNamespace("wo", "urn:schemas-microsoft-com:office:excel");
xn = xdoc.SelectNodes("/ss:Workbook/ss:Worksheet/ss:Table/*", m);
foreach(XmlNode node in xn)
{
    System.Diagnostics.Debug.WriteLine(node.Name + " / "+node.InnerText);
}

●色など
Color列挙、SystemColors列挙から取得
XPスタイルのボタン表面の色は混合くさいので注意

●多重起動防止
すでに起動しているか?もっとスマートな方法があるかもしれない
if (System.Diagnostics.Process.GetProcessesByName(
    System.Diagnostics.Process.GetCurrentProcess().ProcessName).Length > 1)
{
    this.Close();
    return;
}

●フォーム表示時のイベントの発生順序
1.Loadイベント
2.Activatedイベント
3.Shownイベント

●ウェブアクセス
※クッキーを利用する場合は、CookieContainerを利用する
using System.Net;
string strUrl = @"http://www.yahoo.co.jp";
CookieContainer cookie = new CookieContainer();
HttpWebRequest webreq =
    (HttpWebRequest)(WebRequest.Create(strUrl));
webreq.CookieContainer = cookie;
HttpWebResponse webres = (HttpWebResponse)webreq.GetResponse();
System.Text.Encoding enc = System.Text.Encoding.GetEncoding("euc-jp");
System.IO.Stream st = webres.GetResponseStream();
System.IO.StreamReader sr = new StreamReader(st, enc);
string html = sr.ReadToEnd();
Console.WriteLine(html);
sr.Close();

●ドライブのリスト
foreach(DriveInfo drive in DriveInfo.GetDrives()) {

●ディレクトリの選択ダイアログ
using (FolderBrowserDialog fbd = new FolderBrowserDialog())

●Using指定
using Microsoft.DirectX.DirectInput;
using DirectInput = Microsoft.DirectX.DirectInput;
2つ目のものでは、DirectInputというエイリアス登録ができる

●DirectInputリアルタイムキー取得
Device dvDev;
KeyboardState ksState;
ksState = dvDev.GetCurrentKeyboardState();
if (ksState[DirectInput.Key.Pause])
{
}

●XML
型チェックを厳密化するためスキーマを同時に書き込む事ができる

スキーマのみ
dt.WriteXmlSchema(stFile)    'write schema only
データ&スキーマ
dt.WriteXml(stFile, Data.XmlWriteMode.WriteSchema) 'write data+schema
※Data.XmlWriteModeにて選択している
※両方書き出す場合は、この方法しかない

開発ざれごと

Posted by nabe