/*
* 可及的速やかに破棄したい
* マネージ対象外リソースを持ったクラスのテンプレ
* C++/CLI版
*/
public ref class SampleClass : System::IDisposable {
private:
char* unmanaged_resource; // マネージ対象外リソース
protected:
bool disposed; // Dispose()済みならtrue
// Dispose()後にメソッドが呼ばれたときの用心のため、
// 各public/protectedメソッドはその処理に先立ちこいつを呼ぶことを推奨する。
void method() {
if ( disposed ) {
throw gcnew System::ObjectDisposedException(
this->GetType()->ToString(),
"has been disposed.");
}
}
// Dispose()の実処理はココで行う
virtual void Dispose(bool disposing) {
if ( !disposed ) {
if ( disposing ) {
// managed-resourceを持っている
// ならここでDispose()
}
// ここでunmanaged-resourceを廃棄
delete[] unmanaged_resource;
}
disposed = true;
}
public:
// コンストラクタ
SampleClass() {
unmanaged_resource = new char[100];
disposed = false;
}
// デストラクタ: Dispose() に相当する。
virtual ~SampleClass() {
Dispose(true);
// 後続するFinalize()を抑止する
System::GC::SuppressFinalize(this);
}
// ファイナライザ: Finalize()に相当する
!SampleClass() {
Dispose(false);
}
};
※ 修正: doDispose → Dispose
じゃないんだってさ!
ref class SampleClass {
public:
~SampleClass() { this->!SampleClass(); }
!SampleClass() { /* unmanaged-resourceを破棄する */ }
};
これで十分なんだって。
ネタ元 → コーディングスタイル
読みやすいコード
とは、多くのプログラマの最大公約数のようなものだろうか?
最大公約数てーことはいちばんわからんちんに合わせるってことですか。
何が哀しうてわからんちんに足引っ張られにゃあかんのですか。
コック集団のなかに見習いが一人いたら出来合いの
レトルトハンバーグあっためて客に出しますか。
void string_copy(char dst[], const char src[]) {
int i;
for ( i = 0; src[i] != '\0'; ++i ) {
dst[i] = src[i];
}
dst[i] = '\0';
}
...コレ、読みやすいですか?
なんかね、ひらがなだけで論文書いたような居心地の悪さを感じます。
ひらがなだけでかいたぶんしょうがよみやすいはずがないじゃないですか
void string_copy(char* dst, const char* src) {
while ( *dst++ = *src++ ) {}
}
僕にはむしろコッチの方が読みやすいだけでなくわかりやすいんですケド
添削お願いしますぅ > えらいひと
/*
* 可及的速やかに破棄したい
* unmanaged-resourceを持ったクラスのテンプレ
*/
public class SampleClass : System.IDisposable {
private object unmanaged_resource; // マネージ対象外リソース
protected bool disposed = false; // Dispose()済みならtrue
// コンストラクタ
public SampleClass() {
// ここでnewしなければならんわけじゃないが
unmanaged_resource = new object();
}
// Dispose()後にメソッドが呼ばれたときの用心のため、
// 各public/protectedメソッドはその処理に先立ちこいつを呼ぶことを推奨する。
protected void assertDisposed() {
if ( disposed ) {
throw new System.ObjectDisposedException(
this.GetType().ToString(),
"has been disposed.");
}
}
// Dispose()の実処理はココで行う
protected void doDispose(bool disposing) {
if ( !disposed ) {
if ( disposing ) {
// managed-resourceを持っている
// ならここでDispose()
}
// ここでunmanaged-resourceを廃棄
}
disposed = true;
}
// Dispose
public virtual void Dispose() {
doDispose(true);
// 後続するFinaraize()を抑止
System.GC.SuppressFinalize(this);
}
// デストラクタ(=Finalize)
public ~SampleClass() {
doDispose(false);
}
}
※ Finalize→~SampleClass に修正しました