পোস্টশারপের মতো কিছু ব্যবহার না করে, আমি যে সর্বনিম্ন সংস্করণটি ব্যবহার করি তা ব্যবহার করে এমন কিছু ব্যবহার করে:
public class Data : INotifyPropertyChanged
{
// boiler-plate
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
protected bool SetField<T>(ref T field, T value, string propertyName)
{
if (EqualityComparer<T>.Default.Equals(field, value)) return false;
field = value;
OnPropertyChanged(propertyName);
return true;
}
// props
private string name;
public string Name
{
get { return name; }
set { SetField(ref name, value, "Name"); }
}
}
প্রতিটি সম্পত্তি তখন ঠিক এরকম কিছু:
private string name;
public string Name
{
get { return name; }
set { SetField(ref name, value, "Name"); }
}
যা বিশাল নয়; আপনি চাইলে এটি বেস-ক্লাস হিসাবেও ব্যবহার করা যেতে পারে। bool
থেকে ফেরত SetField
আপনি বলে যদি এটি একটি নো-অপ ছিল, যদি আপনি অন্য যুক্তিবিজ্ঞান প্রয়োগ করতে চান।
অথবা সি # 5 এর সাথে আরও সহজ:
protected bool SetField<T>(ref T field, T value,
[CallerMemberName] string propertyName = null)
{...}
যাকে এরকম বলা যেতে পারে:
set { SetField(ref name, value); }
যা দিয়ে সংকলক "Name"
স্বয়ংক্রিয়ভাবে যুক্ত হবে।
সি # 6.0 বাস্তবায়নকে আরও সহজ করে তোলে:
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
... এবং এখন সি # 7 সহ:
protected void OnPropertyChanged(string propertyName)
=> PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
protected bool SetField<T>(ref T field, T value,[CallerMemberName] string propertyName = null)
{
if (EqualityComparer<T>.Default.Equals(field, value)) return false;
field = value;
OnPropertyChanged(propertyName);
return true;
}
private string name;
public string Name
{
get => name;
set => SetField(ref name, value);
}