سؤال

ولدي الكائن الذي تم إنشاؤه في فئة واحدة

public class CreatingClass
{
    public T CreateObject<T>(Dictionary<string, object> parameters) where T : IMyInterface, new()
    {
        ....
    }

    public void DestroyObject(IMyInterface objectToDestroy)
    {
        ....
    }
}

وأنا أسمي هذه وظيفة من فئة العميل، ثم في بعض الأحيان تحتاج إلى إبطال ذلك من خلال طلبي من قبل الطبقة خلق.

هل يمكنني فعل شيء كما يلي

public class ClientClass
{
    MyObject obj;
    CreatingClass creatingClass = new CreatingClass();

    private void AFunctionToCreateMyClass()
    {
        obj = creatingClass.CreateObject<MyClass>(parameters);
    }

    private void AFunctionToDeleteMyObject()
    {
        CreatingClass.DestroyObject(obj);
        Assert.IsNull(obj);//Doesn't fail
    }
}

وكنت قد حاولت objectToDestroy = فارغة، ولكن لا أعتقد أنه سيعمل (وفعلت لا)

هل كانت مفيدة؟

المحلول

لاحظ أنه لا يمكن أن تدمر الواقع الكائن؛ كنت تخضع لقواعد جمع القمامة. في دفعة، هل يمكن أن تحقق لIDisposable وندعو تخلص ()،

ويمكنك استخدام عينات ref المقدمة، ولكن لست متأكد من أن هناك فائدة كبيرة. انها أبسط فقط لمسح الميداني مع "الكائنات = فارغة؛".

والاستخدام ref يمكن الحصول على مربكة، ومنذ ذلك يعمل على متغير - أي إذا كنت تفعل:

var tmp = obj;
DestroyObject(ref tmp);

وبعد ذلك obj ستظل القيمة الأصلية. إلا إذا كان لديك سبب وجيه، وأنا لا أنصح نهج ref.

نصائح أخرى

وما تريده هو

public void DestroyClass(ref IMyInterface objectToDestroy)
{
    ....
    objectToDestroy = null;
}

وهذا هو سيحدد مرجعية محلية لاغية

ويتم تمرير كافة المعلمات في C # من حيث القيمة، لذلك إذا كنت ترغب في تعديل المرجع نفسه، تحتاج إلى تمريرها باستخدام الكلمة ref.

هل تبحث عن نمط IDisposable ؟

[لديك "CreatingClass" وعادة ما يطلق عليه مصنع]

ولا يدري لماذا تريد ان تكون معنية إبطال كائن. سيكون من القمامة التي تم جمعها إلا بعد كافة المراجع جذر 'لأنه قد أزيلت. ولكن إذا قمت بتغيير ل:

 public void DestroyClass(ref IMyInterface objectToDestroy)   
 {       
     ....    
     objectToDestroy = null;
 }

ووالدعوة على النحو التالي:

private void AFunctionToDeleteMyObject()    
{        
   CreatingClass.DestroyObject(ref obj);    
   Assert.IsNull(obj);  
}

وهناك توضيح بسيط على إجابات زودت ...

يتم تمرير

والمعلمات في C # بواسطة انواعها وقيمتها لأنواع قيمة، مرجعا لأنواع المراجع. كنت ومع ذلك، يتم تمرير واجهة التي يمكن أن تتصل فئة (نوع مرجع) أو البنية (نوع القيمة)، لذلك تحتاج إلى نعلن ذلك صراحة كمتغير المرجع.

ولكن ما يجب أن تتبع حقا (كما ذكر سابقا) هو نمط IDisposable، الذي تم تصميمه لهذه الوظيفة.

وتحرير: يتم تمرير المعلمات من حيث القيمة، ولكن لأنواع المراجع المرجع هو القيمة. لذلك هو أنت تدمير refence في وظيفة، ونوع المرجع الأصلي لا يتأثر. إذا قمت بإجراء تغيير على متغير المرجعية، أي تعديل البيانات في مجموعة بيانات، يتم تحديث نوع مرجع الأصلي خارج وظيفة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top