構造体にINotifyPropertyChanged
を実装することはできますが、構造体のセマンティクスがこのインタフェースと一般的なイベントでうまく動かないため(私はまったく言っていません)、これを行うべきではありません。
struct EventStruct : INotifyPropertyChanged {
private string _property;
public string Property
{
get { return _property; }
set
{
_property = value;
OnPropertyChanged();
}
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
private void OnPropertyChanged([CallerMemberName] string propertyName = null) {
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
今、私たちはイベントをサブスクライブし、プロパティを変更します:
class Program {
static void Main() {
var s = new EventStruct();
s.PropertyChanged += OnPropertyChanged;
s.Property = "test";
Console.ReadKey();
}
private static void OnPropertyChanged(object sender, PropertyChangedEventArgs e) {
Console.WriteLine(e.PropertyName + " changed");
}
}
出力は "プロパティを変更" であるこのことを考えてみましょう。したがって、構造体とイベントがまったく動作しない(またはINotifyPropertyChanged
が構造体で動作しない)とは言えません。あなたがEventStruct
の1つのインスタンスを(使用してPropertyChanged
イベントをサブスクライブして、Bind
方法に構造体を渡す
class Program {
static void Main() {
var s = new EventStruct();
Bind(s);
s.Property = "test";
Console.ReadKey();
}
static void Bind(INotifyPropertyChanged item) {
// this is not the same instance of EventStruct,
// it's a copy, and event will never be fired on this copy
item.PropertyChanged += OnPropertyChanged;
}
private static void OnPropertyChanged(object sender, PropertyChangedEventArgs e) {
Console.WriteLine(e.PropertyName + " changed");
}
}
INotifyPropertyChanged
としてボックスコピーを作成し、構造体を、:あなたはそれを渡すようにしようとするまで、それはどこでも構造体、一種の、作品コピー)が、構造体の別のインスタンスでイベントが発生します。イベントが実際に発生したインスタンスでは、イベントのサブスクライバリストは空です。あなたが参照渡しする場合は
static void Bind(EventStruct item) {
item.PropertyChanged += OnPropertyChanged;
}
、それが再び動作します:
static void Bind(ref EventStruct item) {
item.PropertyChanged += OnPropertyChanged;
}
のためにあなただけの構造体渡し、インタフェースされていない場合も同じことが(この場合、構造体の値によって渡されているためコピーされる)が起こりますあなたが構造体のイベントを決して実装してはならない理由は、これが役に立つかもしれないし、トラブルにつながることもないユースケースは少なくとも私の心にかかっていません。
出典
2017-05-11 09:30:22
Evk
構造体は常に値によって渡されます。一般的なイベントではうまくいきません。 [これを考慮](http://kosiara87.blogspot.co.at/2011/11/cnever-place-event-inside-struct-c.html)、[これと](http://stackoverflow.com/q/12173723/1132334) – dlatikay
だから私はこの記事で受け入れられた答えを推測する:http://stackoverflow.com/questions/33065954/structs-and-inotifypropertychangedは間違っている – Redis1001
[インターフェイスを実装する構造]をサポートするために必要なボクシングを考えてみましょうhttps://blogs.msdn.microsoft.com/abhinaba/2005/10/05/c-structs-and-interface/) – Steve