とまと あんらいぷ…

エンジニアの活動記録とかつぶやきとか

GitHub

カテゴリ:C# の記事一覧

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

【C#】StreamWriterの注意点

System.IO.StreamWriterの使い方


System.IO.StreamWriterのWriteメソッドは引数に文字列を取って
指定したファイルに文字列の書き込みができる。

書き込みの途中で、指定したファイルはオープンしたままで(同じStreamで)
バイナリデータの書き込みを行いたい時は(書き込み方法を文字列→binaryに変更したい)
System.IO.StreamWriterのBaseStreamプロパティを参照し、
BaseStream.WriteByteメソッドにバイナリデータをそのまま指定すれば
そのStreamにアクセスしつつ記載が可能。

注意点としてはBaseStream.WriteByteメソッド呼び出し前に
Streamのpositionを適切に移動してあげないと意図した通りにデータの書き込みができない。



こんな感じ。

例えば、最後に終端記号(1AのEOF)を書きたい時は
一旦Flushメソッドの呼び出しが必要です。

abcde(1A)
これが意図している結果。

Flushメソッドの呼び出しがない場合は、
(1A)bcde
こうなる。

Flushメソッドを呼び出さなくてもpositionプロパティに直接数値をいれてやっても大丈夫。
バイナリデータの書き込みとか、
ストリームを意識して読み書きしたいときは、ポジションは適切に管理しないとダメだねということです。
スポンサーサイト

テーマ:プログラミング - ジャンル:コンピュータ

【C#】virtual(仮想)メソッドをoverrideした時の挙動確認メモ

継承クラス利用時にいつも確かめてしまうこと


C#で継承クラスを作ってメソッドをoverrideする時、
例えば親クラスの型に子クラスのインスタンスを代入するとどうなるのか?
overrideしたメソッドは本当に正しく動くのかな?
とかかなり気になる。

ところで、「仮想メソッド」をキーワードとして調べた時
一緒に「抽象メソッド」なるものがもれなくついてきます。
この抽象メソッドは実態がない、つまりabstract キーワードによって作成するもので
当エントリで扱うvirtualキーワードを使った「仮想メソッド」とは別物なので注意して下さい。

どちらにしても、ふと仮想メソッドや抽象クラスを作成する時に
実行結果が気になってしまい、そのたびに同じようなサンプルプロジェクトを作っている。

何度も何度も作ってるうち、さすがに重い腰を動かしてメモでも取っておかなければ
今後も作り続けるだろうなと反省したのでまとめておきます。



クラス設計


確認するためにクラスを考えてみる。

継承元(Parent)と継承先(Child)の2クラスを作成する

■Parentクラスのメンバ
・Shout:叫ぶ (仮想メソッド)
・ThisShout:Shoutする

■Childクラスのメンバ
・Shout:叫ぶ (オーバーライド)
・ThisShout:Shoutする(親のThisShoutを隠蔽)
・BaseShout:親がShoutする。

続きを読む

テーマ:プログラミング - ジャンル:コンピュータ

DeviceIoControl関数の使い方~CDドライブの回転速度を指定する

kernel32のDeviceIoControl関数はとてもややこしい・・・
1関数1機能ではなく、関数の第2引数dwIoControlCodeに制御コードを渡し、
その制御コードにしたがってデバイス操作を実現します。

また、制御コードによってその他の引数に指定する構造体(Buffer)が変化するので
予め制御コードに付随する構造体の内容を理解しておく必要があります。

DeviceIoControl関数の呼び出しに必要不可欠なのが
ファイル、またはデバイスへのハンドルです。

必然的にCreateFile関数を事前に呼び出す事になるので
呼び出しのサンプルコードをまとめておきました。

今回は制御コードであるIOCTL_CDROM_SET_SPEEDを使って
CDドライブの回転速度を指定しています。

CDドライブの回転速度を指定するサンプルコード

Change the rotational speed of the CD drive use by "DeviceIoControl"

続きを読む

テーマ:プログラミング - ジャンル:コンピュータ

接続文字列(ConnectionString)を動的に変更するには?

.NETアプリケーション開発において
DataGridViewを使ってデータベースの情報を表示することは多いです。

開発時と実行時に接続文字列を分けたいけど
デザイナ画面でデータソースを作成してしまうと
ConnectionStringを変更できない事に気づいた。

自動生成させる接続文字列とは別に、実行時にユーザーのインプットによって
接続先を変更したり、アカウント、パスワードを切り替えたりしたいことはあるはず。

仕方なくDataSetを使わずに自前で
TableAdapterやSqlCommandクラスを使って実装したけど
後々になって方法が分かったのでメモしておきます。 続きを読む

テーマ:プログラミング - ジャンル:コンピュータ

C#からC++DLLを呼び出してマーシャリングの動きを確認した(後編)

やっと後編を書くことができます・・・
前回
C#からC++DLLを呼び出してマーシャリングの動きを確認した(前編)
C#からC++DLLを呼び出してマーシャリングの動きを確認した(中編)
の続きです。

今回はドラゴンの詠唱速度に焦点を当てて記載したいと思います。

その前に・・・
当記事で使っているソリューション一式をGitHubにアップしていますので
実行しながら確認したい方はどうぞ。(Debug構成だと落ちますが・・・)

C#より、C++で作成したDLLの呼び出し方法 及びマーシャリングの考察
あんちょこなソリューション名で申し訳ないです。
ではドラゴンさんの大量呼び出し、行ってみましょう。 続きを読む

テーマ:プログラミング - ジャンル:コンピュータ

次のページ

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。