Я копался в коде C #, сгенерированном SWIG для Quantlib, и наткнулся на следующий код, который дал мне унизительный момент.
Каждый из сгенерированных классов реализует IDisposable
, и каждый из сгенерированных классов имеет это соглашение, указанное ниже.
public class MultiPath : IDisposable { // MultiPath is interchangable
private HandleRef swigCPtr;
protected bool swigCMemOwn;
internal MultiPath(IntPtr cPtr, bool cMemoryOwn) {
swigCMemOwn = cMemoryOwn;
swigCPtr = new HandleRef(this, cPtr);
}
internal static HandleRef getCPtr(MultiPath obj) {
return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr;
}
~MultiPath() { // <----
Dispose();
}
public virtual void Dispose() {
lock(this) {
if (swigCPtr.Handle != IntPtr.Zero) {
if (swigCMemOwn) {
swigCMemOwn = false;
NQuantLibcPINVOKE.delete_MultiPath(swigCPtr);
}
swigCPtr = new HandleRef(null, IntPtr.Zero);
}
GC.SuppressFinalize(this);
}
}
// snip
}
Если я правильно читаю, оператор побитового дополнения *1008* применяется к конструктору класса, поэтому мои вопросы
- Почему цель оператора
~
в этом примере?
- Какой эффект это имеет?
- В каких ситуациях можно использовать такой оператор и технику?
Edit:
Просто для ясности, ~
в данном случае называется Destructor . Спасибо @ Arcturus.