Tôi đã có cùng một vấn đề ngày hôm nay và có giải pháp làm việc cho các đối tượng dữ liệu đơn giản không có bất kỳ logic riêng nào. Thay vì làm cho setter lỗi thời (mà không làm việc vì những lý do được đề cập trong câu trả lời khác), tôi đã tự tạo ra constructor lỗi thời và giới thiệu một cái mới mà tôi cung cấp giá trị ban đầu. Điều này giả định constructor mặc định đã được chạy để tạo ra cá thể của lớp. Có lẽ bạn sẽ phải đánh dấu một cái khác.
Tuy nhiên chúng tôi can't sử dụng tính năng tự động thực hiện trong trường hợp này để có thể thiết lập giá trị ban đầu trong xây dựng:
class MyClass
{
[Obsolete("Use the constructor with param myProperty instead")] MyClass() { }
MyClass(MyProperty m) { this.m_MyProperty = m; }
public MyType MyProperty
{
get { return this.m_MyProperty; }
set { this.m_MyProperty = value; }
}
}
Vì vậy, trong thực tế, tôi đã tạo ra một readonly-tài sản có giá trị có thể chỉ được thiết lập bởi hàm tạo. Bất kỳ attemp để tạo ra một thể hiện theo mặc định-constructor của nó và thiết lập thuộc tính của nó sẽ không tạo ra các trình biên dịch cảnh báo cho các setter nhưng đối với instantiation - đó là ổn trong trường hợp của tôi:
var m = new MyClass(); // here we get warning/error now
m.MyProperty =
Hãy nhận biết rằng doesn này ´ không hoạt động nếu tài sản của bạn không được thiết lập từ số bên ngoài. Đây là khi giá trị của nó được tính bằng mã mới của bạn:
MyProperty { get { return /* some computation */ } }
Vì bạn đã đặt giá trị này để tăng lỗi, tại sao không chỉ xóa bộ đặt, chúng sẽ được thông báo chỉ đọc. – Doggett
Bạn vẫn có thể tắt lỗi bằng cách sử dụng lệnh '#pragma warning', mặc dù nó không chỉ là cảnh báo. Bằng cách đó mã di sản vẫn sẽ xây dựng, trong khi mã tương lai thì không. –