سؤال

أحاول تقديم فئة طازجة في 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 الكلمة الأساسية، والتي تسمح بمراجع ثابتة إلى كائنات متغيرة.

هناك طريقتان فقط لفعل ما تسأل.

  • يمكنك استنساخ الكائن كلما قمت بإعادته. لاحظ أن هذا سيعمل فقط على الأشياء المستنسجة، وسوف يكون بطيئا تماما.
  • يمكنك فقط دعم أنواع القيمة.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top