Giả sử tôi có nhu cầu về phương thức trợ giúp riêng tư đơn giản và trực quan trong mã nó có ý nghĩa như một phương thức mở rộng. Có cách nào để đóng gói trợ giúp đó cho lớp duy nhất thực sự cần sử dụng nó không?Có thể có phương pháp mở rộng riêng tư không?
Ví dụ, tôi cố gắng này:
class Program
{
static void Main(string[] args)
{
var value = 0;
value = value.GetNext(); // Compiler error
}
static int GetNext(this int i)
{
return i + 1;
}
}
Trình biên dịch không "nhìn thấy" các phương pháp GetNext()
mở rộng. Lỗi này là:
phương pháp mở rộng phải được định nghĩa trong một lớp tĩnh phi generic
Hội chợ đủ, vì vậy tôi quấn nó trong lớp học riêng của mình, nhưng vẫn còn gói gọn trong phạm vi đối tượng mà nó thuộc về:
class Program
{
static void Main(string[] args)
{
var value = 0;
value = value.GetNext(); // Compiler error
}
static class Extensions
{
static int GetNext(this int i)
{
return i + 1;
}
}
}
Vẫn không có súc sắc. Bây giờ lỗi trạng thái:
Phương thức mở rộng phải được xác định trong lớp tĩnh cấp cao nhất; Tiện ích mở rộng là một lớp lồng nhau.
Có lý do thuyết phục nào cho yêu cầu này không? Có những trường hợp mà một phương thức trợ giúp thực sự cần được đóng gói riêng, và có những trường hợp mã này sạch hơn và dễ đọc hơn/có thể hỗ trợ nếu phương thức trợ giúp là một phương thức mở rộng. Đối với những trường hợp hai giao điểm này, cả hai có thể được thỏa mãn hoặc chúng ta phải chọn cái kia hay không?
Đọc thông báo lỗi đầu tiên nói gì, nó muốn bạn lớp chương trình tĩnh, Bạn đã thử làm cho nó tĩnh và thử mã của bạn? – Bearcat9425
Câu hỏi liên quan: http://stackoverflow.com/questions/2145576/how-can-i-implement-an-extention-property-class-for-primitive-types-in-a-clean-w – cvraman
@ Bearcat9425, rằng sẽ * sửa lỗi "trường hợp sử dụng cụ thể này, nhưng không thể áp dụng chung. Tôi tưởng tượng câu hỏi này là dành cho khả năng ứng dụng chung, không dành cho các ứng dụng giao diện mẫu. –