C# memo
Suns & Moon Laboratory
Generic
Genericを使うといろいろと便利
- コンパイル時型チェックが出来る
- 型が決まっているので、実行時の型チェックが省略されて高速<らしい
using System.Collections.Generic;
List<T>
Queue<T>
foreach
foreach(KeyValuePair<string,string> kvp in value_dic)
{
kvp.Key;
kvp.Value;
}
同期
WaitAll(WaitHandle[])
列挙
public enum eJudge
{
TachiBlue = 0,
TachiRed,
TachiYellow
}
abstractな関数
関数だけで無く、クラス宣言にもabstract必要
abstract public class AbsBaseClass
{
abstract public void Func();
}
public class MyClass : AbsBaseClass
{
override public void Func()
{
Console.WriteLine("MyClass Hello!!");
}
}
コンストラクタの継承
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("---- new IkBook()");
IkBook book = new IkBook();
Console.WriteLine("---- new IkBinder()");
IkBook binder = new IkBinder();
Console.WriteLine("---- new IkBook(string)");
IkBook book2 = new IkBook("test");
Console.WriteLine("---- new IkBinder(string)");
IkBook binder2 = new IkBinder("test");
}
}
class IkBook
{
public IkBook()
{
Console.WriteLine("IkBook()");
}
public IkBook(string prm):this()//★このthisでIkBook()呼び出し
{
Console.WriteLine("IkBook(string)");
}
}
class IkBinder : IkBook
{
public IkBinder()
{
Console.WriteLine("IkBinder()");//引数無しは、暗黙にbaseのコンストラクタが呼ばれる
}
public IkBinder(string prm):base (prm)//★このbaseでIkBook(string)を呼び出し
{
Console.WriteLine("IkBinder(string)");
}
}
}
実行結果
---- new IkBook()
IkBook()
---- new IkBinder()
IkBook()
IkBinder()
---- new IkBook(string)
IkBook()
IkBook(string)
---- new IkBinder(string)
IkBook()
IkBook(string)
IkBinder(string)
続行するには何かキーを押してください . . .
インデクサ
プロパティを配列風アクセス
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Books books = new Books();
Console.WriteLine("-------- before");
Console.WriteLine(books[0]);
Console.WriteLine(books[1]);
Console.WriteLine(books[2]);
books[1] = "デザインウェーブマガジン";
Console.WriteLine("-------- after");
Console.WriteLine(books[0]);
Console.WriteLine(books[1]);
Console.WriteLine(books[2]);
}
}
class Books
{
List<string> Items = new List<string>();
public Books()
{
Items.Add("トラ技");
Items.Add("DWM");
Items.Add("Interface");
}
public string this[int i]
{
set
{
Items[i] = value;
}
get
{
return Items[i];
}
}
}
}
ファイルの列挙
参考:@IT:.NET TIPS ファイルやディレクトリの一覧を取得するには? - C#
using System.IO;//Directory
namespace test_FindFirst
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
EnumDirsFiles("D:\\testdata");
}
void EnumDirsFiles(string dir)
{
//ファイルの列挙
string[] files = Directory.GetFiles(dir);
foreach (string s in files)
{
listBox1.Items.Add(s);
}
//ディレクトリの列挙
string[] dirs = Directory.GetDirectories(dir);
foreach (string s in dirs)
{
EnumDirsFiles(s);//再帰呼び出し
}
}
}
}
日付時刻
DateTime dt = DateTime.Now;
System.Console.WriteLine(dt.ToString("yyyyMMddHHmmss"));
時間計測
System.Diagnostics.StopWatchを使う
参考:http://www.atmarkit.co.jp/fdotnet/dotnettips/412stopwatch/stopwatch.html
ネットワークドライブのプロジェクトでセキュリティ例外
ネットワークドライブ上のプロジェクトを開こうとすると、セキュリティ例外が発生します。
対処方法は、コンパネ→管理ツール→Microsoft.NET Framework 2.0構成→マイコンピュータ→ランタイムセキュリティポリシー→エンタープライズ→コードグループ→All_Code→このレベル以下のポリシーレベルは評価しないをチェック

画像描画いろいろ
なんかいろいろあってわかり辛いのでまとめ。
- 描画 Graphics
- ファイルとかメモリとか Imageを継承したBitmapやMetafile
Image系
抽象化されていない画像形式。だと思う。
Image←Bitmap
Image←Metafile
Graphics系
抽象化された画像
Graphics GDI+描画サーフェイスをカプセル化
- Control.CreateGraphics()
- Control.PaintイベントのPaintEventArgs引数で、Graphicsを取得可能
- ImageからSystem.Drawing.Graphics.FromImage()で作成可能
Graphics.DrawImage()で、Imageを描画可能
配列の処理速度(Array,List)
- ArrayとListは、Listが2〜3倍くらい遅い
- Listは、(当然だが)メモリを喰う。
- Arrayは、確保した量だけメモリを喰う。
- ArrayはResize時、要素の全てをコピーする
C#で__LINE__や__FILE__プリプロセッサマクロを使いたい
まさにこれ→http://messiah-annex.at.webry.info/200502/article_7.html
StackFrameを使うとは、なるほどねぇ。
C言語のmemcpyしたい
Array.CopyTo
ちゃんと型変換してくれちゃう...してくれなくても良いのにねぇ。
byte[] arr1 = new byte[] {0,1,2,3,4,5,6,7};
UInt32[] arr2 = new UInt32[8];
arr1.CopyTo(arr2,0);
for (int i = 0; i < arr2.Length; i++)
{
System.Console.WriteLine(arr2[i].ToString());
}
Buffer.BlockCopy
これこれ、まさにmemcpy。でもヘルプの解説意味わからん。
引数は、バイトオフセットとかバイト数なので注意。
byte[] arr1 = new byte[] {0,1,2,3,4,5,6,7};
UInt32[] arr2 = new UInt32[8];
Buffer.BlockCopy(arr1, 0, arr2, 0, arr1.Length);
for (int i = 0; i < arr2.Length; i++)
{
System.Console.WriteLine(arr2[i].ToString());
}
C言語のmemsetしたい
簡単な方法は無さそうです。
0初期化ならば、newすれば良いかと思われます。
int[] arr = new int[10];
arr = new int[10];
delegate
デリゲート
Formのイベントなんかの実装は、これ。だと思う。
using System;
namespace TestDeleGate
{
public delegate void DelegateX(); //デリゲートの定義
public class MyClass1
{
public DelegateX EventX;//デリゲートの変数宣言
}
class Program
{
static void Main(string[] args)
{
MyClass1 obj1 = new MyClass1();
obj1.EventX = event_x;//デリゲートに関数割り当て
obj1.EventX(); //割り当てた関数呼び出し
}
static void event_x()
{
Console.WriteLine("デリゲート呼び出し");
}
}
}
描画
クラス
| PictureBox | Formに配置出来るコントロール |
| Image | Bitmap,Metafileの抽象基本クラス |
| Graphics | 描画操作はこのクラス(GDI+をカプセル化) |
画像を描画するには、Graphicsを使う。Graphicsの作成方法。
Graphicsを作成する方法
- イベントの一部から取得。PaintEventArgs.Graphics
- コントロールの、CreateGraphicsメソッドを使う
- Imageから作成する。System.Drawing.Graphics.FromImage(System.Drawing.Image)
描画は、大きく二種類に分かれる
XXXには代表的(というか、自分が使いそうなのは)に、こんなのがある。
- Icon
- Image
- Line
- Lines
- Polygon
- Rectangle
描画のスタイル指定に使うオブジェクト
Pen
端点の形 Pen.StartCap,Pen.EndCapをLineCapで指定する。
線の接合部の形 LineJoin
座標変換
Matrixを使うか、Graphicsの下記メソッドを使う。
- MultiplyTransform
- ResetTransform
- RotateTransform
- ScaleTransform
- TransformPoints
- TranslateTransform
Matrix操作
- Multiply Matrixの乗算
- Rotate 回転
- RotateAt 指定した点を中心にした回転
- Scale 縮尺
- Shear 傾斜ベクタ?
- Translate 平行移動
クリッピング
DLLを呼ぶ
VC#2010
DLLの文字列がPAnsiChar(LPCSTR)なら、stringで良いみたい。
http://www.s-m-l.org/dev/delphi.html#DLL
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
[System.Runtime.InteropServices.DllImport("testdll1.dll")]
private extern static void func1(string path, uint opt);
private void button1_Click(object sender, EventArgs e)
{
func1(textBox1.Text, 1);
}
}
}
2012-11-25 11:06:15 32400