سؤال

لدي الرمز التالي:

CustomerService service;
public CustomerService Service
{
    get
    {
        if (this.service == null)
        {
            this.service = new CustomerService();
        }
        return this.service;
    }
}

public DataTable GetCustomers()
{
    return this.Service.GetCustomers();
}

الآن السؤال هو: إذا كتبت الطريقة أعلاه على النحو التالي (بدون "هذا") ، فإنه يعطيني خطأ: المثيل غير مرجع إلى كائن.

public DataTable GetCustomers()
{
    return Service.GetCustomers(); // this will spell the error "instance is not reference to an object"
}

هل يعلم أحد؟ كما أنه يحدث فقط أثناء التشغيل عبر IIS وليس من Casini Web Server (VS 2010).

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

المحلول

وجود أو عدم وجود this لا يمكن أن تشرح الخطأ الذي تشهده. في هذه الحالة ، فإنها تعني نفس الشيء بالضبط وسوف يجمعون نفس رمز IL. تحقق من التجميع باستخدام .NET Reflector للتحقق من ذلك إذا كنت ترغب في ذلك. يحدث الخطأ بشكل عشوائي ، وربما بسبب حالة السباق.

شيء واحد يمكنني رؤيته على الفور هو أنه إذا كنت تقوم بتشغيل هذا الرمز من مؤشرات ترابط متعددة ، فيبدو أن لديك حالة سباق هنا:

if (this.service == null)
{
    this.service = new CustomerService();
}
return this.service;

في حالة Multithed ، ستحتاج إلى قفل وإلا يمكنك الحصول على كائنات اثنين من العملاء. لست متأكدًا مما إذا كان هذا يفسر خطأك ، ولكنه بالتأكيد قد يخلق الارتباك. يمكن أن تحدث ظروف السباق في بيئة واحدة ولكن ليس في أخرى لأن تواتر الخطأ يمكن أن يعتمد على نوع الجهاز وعلى العمليات الأخرى التي يتم تشغيلها على الخادم.

قد يكون لديك أيضًا شروط سباق أخرى في الكود الذي لم تنشره. لا تستخدم تقنية التهيئة البطيئة هذه دون قفل ما لم تكن كذلك بالتأكيد أن لديك موضوع واحد فقط.

نصائح أخرى

ربما يكون لديك اسم تعارض مع "خدمة" أخرى (فئة أو مساحة اسم). استخدام this يحلها.

أنا متشكك بعض الشيء في الفرق بين كاسينين و IIS ، هل راجعت ذلك بعناية؟

يجب أن يكون شيء من هذا القبيل في المفرد. والتي من شأنها حل العديد من المشكلات مثل الترابط إذا تم تنفيذها بشكل صحيح وسيجعل تنفيذ وقابلية الكود أفضل بكثير.

شكرا -blake niemyjski (. عضو فريق Nettiers)

لقد تعثرت قليلاً مع الكود الخاص بك في Visual Studio ولم أستطع حتى الحصول على تعارض اسم لإنتاج رسالة الخطأ التي وصفتها. لا أستطيع التفكير في أي حالة يمكن أن تكون فيها "this.x" مختلفة عن "X" باستثناء عندما تكون "X" متغير محلي أو أ المعلمة الطريقة.

سوف CustomerService فئة مستمدة من فئة قاعدة تسمى Service؟ إذا كان الأمر كذلك ، فهذه هي المشكلة.

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