ج # كيفية حماية مجال الطبقة الذرية؟
-
11-09-2019 - |
سؤال
أحاول تقديم فئة طازجة في C # وأريد الاحتفاظ بالحماية الحقلي المحمي، لكنني بحاجة أيضا إلى إرجاع القيمة في طريقة الحصول عليها:
class AtomicReference
{
private Object _value;
public AtomicReference()
{
_value = new Object();
}
public AtomicReference(Object value)
{
OptimisticSet(value);
}
public Object CompareAndSet(Object newValue)
{
return Interlocked.Exchange(ref _value, newValue);
}
public void OptimisticSet(Object newValue)
{
do {
} while (_value == Interlocked.CompareExchange(ref _value, _value, newValue));
}
public Object Get()
{
// Don't leak the field reference
const Object constVal = _value;
return constVal;
}
}
إنه بعض الشيء من الخرار حول المشكلة ... لا أستطيع أن أجعل المجال عقدا، لأنني بحاجة إلى أن أكون قادرا على تعيينه. هل هناك حلا أفضل مني؟
تحديث: شكرا على الردود السريعة! وأشار بحق إلى أن المرجع سيتم حماية إذا كنت ببساطة العودة _Value. أريد أيضا حماية _Value من التحور. إذا سمحت ل _VALUE بالتحريض خارج الطفيفة، فهزم الغرض بأكمله مما يجعل هذه الفئة ... هل هناك طريقة لتحقيق ذلك؟
المحلول
حتى إذا حاولت، فمن غير الممكن إرجاع مرجع إلى حقل في C # (بدون رمز غير آمن) أو Java. (لا أقصد الإشارة إلى كائن)
يمكنك ببساطة الكتابة return _value;
لن يتمكن المتصلون لديك من الكتابة إلى الحقل.
نصائح أخرى
C # لا يدعم C ++ const
الكلمة الأساسية، والتي تسمح بمراجع ثابتة إلى كائنات متغيرة.
هناك طريقتان فقط لفعل ما تسأل.
- يمكنك استنساخ الكائن كلما قمت بإعادته. لاحظ أن هذا سيعمل فقط على الأشياء المستنسجة، وسوف يكون بطيئا تماما.
- يمكنك فقط دعم أنواع القيمة.