2012-01-03 9 views
15

Tôi muốn sử dụng thuộc tính được tự động triển khai, nhưng đồng thời tôi muốn gọi phương thức mỗi lần thay đổi thuộc tính.cách ghi đè thiết lập trong C# thuộc tính tự động

public float inverseMass 
{ 
    get; 
    set 
    { 
     onMassChanged(); 
     inverseMass = value; 
    } 
} 

Mã trước có thực hiện cuộc gọi đệ quy đến tài sản không? Nếu có, làm thế nào để thực hiện điều này?

+6

Bạn không thể làm điều đó trong C#. Bạn phải sử dụng một trường sao lưu. –

+2

Câu trả lời là CÓ .... nó sẽ tạo ra một vòng lặp liên tục. –

+2

@UweKeim, đó phải là câu trả lời. – driis

Trả lời

22

Nếu bạn cung cấp bộ nhận/tập của riêng bạn thì bạn cần cung cấp bộ nhớ của riêng mình cho biến.

private float _inverseMass; 

public float inverseMass 
{ 
    get { return _inverseMass; } 
    set 
    { 
     _inverseMass = value; 
     onMassChanged(); 
    } 
} 
+6

Thật đáng tiếc. Sẽ được tốt đẹp để sử dụng một số loại từ được xác định trước phổ biến như 'giá trị' thay vì tạo thuộc tính tự động. –

4

Bạn không thể làm điều đó trong C#.

Thuộc tính hoặc thuộc tính tự động của nó với trường sao lưu.

8

Sử dụng một lĩnh vực ủng hộ thay vì:

public float inverseMass 
{ 
    get 
    { 
     return _inverseMass; 
    } 
    set 
    { 
     onMassChanged(); 
     _inverseMass = value; 
    } 
} 

private float _inverseMass; 

Tôi đã từng đọc ở đâu đó rằng C# chàng trai quyết định rằng họ muốn để trang trải rộng của các kịch bản sử dụng với những tính chất tự động, nhưng đối với trường hợp đặc biệt bạn phải đi quay lại các trường sao lưu cũ tốt.

(Thành thật mà nói, tôi tin rằng Jon Skeet nói với họ như thế nào để thực hiện chúng)

4

Bạn sẽ cần phải phá vỡ ở trên ra cho các thành viên private/public, do đó bạn không nhận được vấn đề đệ quy:

private float _inverseMass; 
public float inverseMass 
{ 
    get { return this._inverseMass; } 
    set { this._inverseMass = value; onMassChanged(); } 
} 

Tuy nhiên, có bạn nhìn vào giao diện INotifyPropertyChanged? Nó làm khá nhiều những gì bạn đang tìm kiếm, và tùy thuộc vào những gì bạn đang viết nó có thể được hỗ trợ nguyên bản.

public class MyClass : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged(String property) 
    { 
    var event = this.PropertyChanged; 
    if (event != null) 
    { 
     event(this, new PropertyChangedEventArgs(property)); 
    } 
    } 

    private float _inverseMass; 
    public float inverseMass 
    { 
    get { return this._inverseMass; } 
    set { this._inverseMass = value; NotifyPropertyChanged("inverseMass"); } 
    } 
} 
1

Điều đó không biên dịch, vì vậy thật khó để nói nếu nó có đệ quy hay không.

Bạn không thể chỉ định một phần của thuộc tính tự động. Bạn sẽ cần phải sử dụng trường sao lưu trong trường hợp này:

private float _inverseMass; 
public float inverseMass 
{ 
    get { return _inverseMass; } 
    set 
    { 
     onMassChanged(); 
     _inverseMass = value; 
    } 
} 

Mặc dù, một khung lập trình hướng vọng như PostSharp có thể giúp bạn với điều này.

0

Sử dụng biến riêng tư làm trường sao lưu của bạn cho thuộc tính công khai.

private float inverseMass; 

public float InverseMass{ 

    set 
    { 
     onMassChanged(); 
     inverseMass=value; 
    } 
    get 
    { 
     return inverseMass; 
    } 

} 
-2
public float inverseMass 
{ 
    get; 
    set 
    { 
     if (inverseMass != value) 
     { 
      inverseMass = value; 
      onMassChanged(); 
     } 
    } 
} 
+0

Bạn đang cố gắng nói gì ở đây? Câu trả lời này không biên dịch. – vcsjones

1

Những câu trả lời chính xác được đưa ra ở trên, nhưng trong trường hợp bạn muốn thực hiện điều này một cách nhanh chóng trong Visual Studio, bạn có thể sử dụng Code Snippets thay vì để tạo ra tài sản cho bạn.

Có một chi của bài viết này mà nên giải thích nó một chút tốt hơn: http://www.roelvanlisdonk.nl/?p=1007

Nếu bạn muốn, bạn thậm chí có thể tạo ra đoạn mã của riêng bạn để thêm mã lặp đi lặp lại. Bạn thậm chí có thể sử dụng nó để nhanh chóng tạo ra việc triển khai INotifyPropertyChanged như đã đề cập ở trên.