سؤال C # حول getter و setter؟
-
06-07-2019 - |
سؤال
class Foo
{
public List<float> Data { get ; set ; } // list of numbers
private float Total { get ; set ; } // Contains sum of numbers in Data
// Constructors and other stuff.
}
يستمر الكود الخاص بي الذي يستخدم هذه الفئة في التعديل Data
لذلك أريد أن أرى التغييرات ذات الصلة في Total
أيضًا.
لا أريد إضافة وظيفة تعيد الحساب Total
إلى الكود الذي يتم تعديله Data
.
مثال:
Foo f = new Foo(); // Total = 0
f.Data.Add(10); // Total = 10
f.Data.Add(30); // Total = 40
f[1] = 40; // Total = 50
// etc
اذن، ماهو حل هذه المشكلة ؟
المحلول
قم بتغيير وظيفة الحصول على دالة لإرجاع الإجمالي ديناميكيًا بدلاً من ذلك (استخدام linq هو الأسهل):
private float Total
{
get
{
return Data.Sum();
}
}
لا حاجة لملحقات مجموعة حقا.
نصائح أخرى
لا أرى المشكلة هنا.ال Total
getter يمكنه حساب إجمالي القائمة ديناميكيًا عند استدعائها، وهو ما لا يعدل القائمة على الإطلاق.ومع ذلك، لا أرى كيف تريد تنفيذ واضعة للمجموع...
private float Total { // Contains sum of numbers in Data
get {
float total = 0;
foreach (float value in Data) {
total += value;
}
return total;
}
}
أنت تعرض البيانات، ويمكن محوها كلها في أي وقت، أقترح ما يلي:
class Foo
{
private List<float> _data = new List<float>();
public float Total {get; private set;}
public void Add(float f) { _data.Add(f); Total += f; }
}
أضف منطق الحساب إلى الإجمالي:
private float Total
{
get { return CalculateResult(Data) };
}
بهذه الطريقة لن تحتاج حتى إلى أداة ضبط.بالطبع يمكنك التخزين المؤقت:تقديم علامة قذرة في الفصل الذي يتم تغييره عند تغيير قائمة البيانات.ثم نتيجة حساب ذاكرة التخزين المؤقت التي تحصل عليها في Total getter إلى حقل فئة محلي وإعادة استخدامها إذا لم يتم تعيين العلامة القذرة (قم بمسحها عند إعادة الحساب).
أعتقد أنه ليست هناك حاجة إلى أداة الضبط في إجمالي الخاصية، ولكن يقوم المُحصل ببساطة بإعادة حساب المبلغ لكل مكالمة
class Foo
{
public List<float> Data { get ; set ; } // list of numbers
private float Total { get{return Data.Sum()} ; } // Contains sum of numbers in Data
}
لماذا تحتاج إلى واضعة على Total
؟أفضل طريقة هي إجراء حساب إجمالي للخاصية تلقائيًا وحساب قيمة حاصل الإجمالي ديناميكيًا.
أو...يمكنك إدخال الحقول الخاصة data
و total
وإعادة الحساب total
داخل Data
واضعة.