هو كائن جديد تم إنشاؤه في Getter خاصية ثابت تم إنشاؤه مرة واحدة فقط؟

StackOverflow https://stackoverflow.com/questions/2042857

سؤال

أقوم بإنشاء فئة مساعد ثابتة لخدمات الويب التي أكتبها. أنا أسقط في API من Tenigent وبالتالي إنشاء كائنات "الخدمة" هذه التي تسمح لي بإجراء أشياء مع النظام الأساسي. على سبيل المثال، أقوم بإنشاء كائن عضوي في فئة المساعد الخاصة بي حتى أتمكن من القيام بأشياء العضوية بنفس الكائن. في فئة المساعدات لدي خاصية مع Getter يقوم بإنشاء واحدة جديدة من هذه الكائنات:

private static MembershipService _MembershipService {
  get {
    return new MembershipService(path, usr, pwd);
  }
}

ثم لدي طريقة تعود هذه الخاصية:

public MembershipService getMembershipService() {
  return _MembershipService;
}

هل هذا يعني منذ مكان الإقامة ثابتة أن الكائن الجديد الذي تم إنشاؤه في Getter تم إنشاؤه مرة واحدة فقط؟ أيضا، من حيث نمط الترميز، هل سيكون من الأفضل فقط جعل الممتلكات العامة، وبالتالي فإن الطريقة ستكون غير ضرورية.

أو ... هل سيكون من الأفضل فقط إنشاء الكائن كمتغير خاص وإرجاعه عبر الطريقة العامة:

private static MembershipService _mbrSvc = new MembershipService(path, usr, pwd);
public MembershipService getMembershipService() {
  return _mbrSvc;
}

// then called elsewhere by me via:
MembershipService svc = MyHelperClass.getMembershipService();

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

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

المحلول

هل هذا يعني منذ مكان الإقامة ثابتة أن الكائن الجديد الذي تم إنشاؤه في Getter تم إنشاؤه مرة واحدة فقط؟

لا، لأن لديك

new MembershipService(path, usr, pwd);

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

فيما يتعلق بالتعليق على النمط، حسنا، يعتمد ذلك حقا على ما تريد القيام به. هل تريد مثيل واحد؟ إذا كان الأمر كذلك، فقم بإنشاء متغير عضو ثابت _mbrSvc وإعادة ذلك من Getter:

private static MembershipService _mbrSvc = new MembershipService(path, usr, pwd);
private static MembershipService _MembershipService {
    get {
        return _mbrSvc;
    }
}

خلاف ذلك، كما هو جيد.

نصائح أخرى

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

إذا كان الكائن باهظ الثمن، فكر في استخدام نمط Singleton مجتمعا مع تحميل كسول:

private static MembershipService _mbrSvc;
private static MembershipService _MembershipService { 
    get { 
        if(_mbrSvc == null)
        {
          _mbrSvc = new MembershipService(path, usr, pwd); 
        }
        return _mbrSvc; 
    } 
} 

في كل مرة تستخدمها الجديد يتم إنشاء كائن جديد.

لذلك، فإن النهج الأول يخلق كائن جديد في كل مرة يتم الوصول إلى العقار.

ما تبحث عنه يسمى Singleton - النهج الثاني الخاص بك هو إمكانية واحدة لتنفيذها في C #.

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