2009-09-24 22 views
6

Tôi thấy mình phải loại bỏ dòng đầu tiên của một chuỗi khá thường xuyên trong khi làm việc trên một trình phân tích cú pháp văn bản trong C#. Tôi đặt cùng một chức năng đơn giản để làm điều đó cho tôi, nhưng đến từ một nền tảng PHP, tôi không biết phải đặt nó ở đâu vì tôi không thể định nghĩa một hàm bên ngoài một lớp. Một cách thông thường để làm điều đó trong .NET là gì? Tôi có tạo một lớp tĩnh để lưu trữ chức năng của mình không?Tôi nên đặt các chức năng linh tinh vào một dự án .NET ở đâu?

+1

Loại dự án .NET nào? ASP.NET? ASP.NET MVC? WinForms? Silverlight? Các quy ước cho "nơi đặt nó" khác nhau tùy thuộc vào loại dự án. – Portman

+0

Đó sẽ là WinForms. –

Trả lời

18

Vâng, lớp helper tĩnh thường là cách để làm điều này.

Ngoài ra, trong C# 3 bạn có thể khai phương pháp như thế này:

public static string RemoveFirstLine(this string s) { 
    ... 
} 

để làm cho nó trở thành một phương pháp khuyến nông. Sau đó, bạn có thể gọi nó trên bất kỳ chuỗi nào như thể phương thức đã được khai báo trên chính loại chuỗi đó.

+0

Đối với những gì Bướm đang mô tả, các phương pháp mở rộng chắc chắn là con đường để đi. – Bomlin

+0

Wow, phương pháp mở rộng gọn gàng! Đó là những gì tôi đã kết thúc bằng cách sử dụng. Cảm ơn bạn đã đề cập đến họ. –

20

Tôi thường tạo một Lớp trợ giúp hoặc Lớp tĩnh tiện ích rồi đặt các hàm trợ giúp tương ứng vào đó.

Ngoài ra, tôi cố gắng giữ cho các lớp Trợ giúp và Tiện ích được nhóm một cách hợp lý - việc đặt các chức năng phân tích cú pháp văn bản cùng với các chức năng chuyển đổi đối tượng là vô nghĩa. Sự nhầm lẫn được xóa với một lớp TextUtils và một lớp ConversionUtils.

+0

+1 đánh tôi với nó. –

+6

Có thể bạn cũng sẽ được hưởng lợi từ việc tạo các phương thức mở rộng chức năng như vậy. –

2

Thông thường tôi tạo một lớp Tiện ích và xác định các phương thức trợ giúp tĩnh.

4

Tôi không nghĩ có tiêu chuẩn cho việc này. Tôi có xu hướng tạo ra một lớp tĩnh gọi là BlahUtil. Ví dụ của bạn, tôi sẽ làm cho nó một phương pháp tĩnh trên StringUtil. Điều này giúp tôi nhóm các phương pháp liên quan thành các đơn vị hợp lý, giúp việc khám phá chúng dễ dàng hơn và chia sẻ chúng qua các nhóm.

Bạn cũng có thể sau đó chọn một trong hai phương pháp được tiếp xúc như là phương pháp khuyến nông (từ C# 3.0):

public static class StringUtil 
{ 
    public static string RemoveFirstLine(this string multiLineString) 
    { 
     // ... 
    } 
} 
0

Tôi muốn tạo một lớp nhân viên tĩnh cho các chức năng như vậy. Có lẽ không phải là cách đẹp nhất, nhưng một trong những mà giữ những điều đơn giản ...;)

K

0

Sử dụng một extension method cho một chuỗi. Đó là những gì họ đang có.

+0

Damn được thêm vào trong khi tôi đang viết câu trả lời của mình !! –

1

Tôi đã thực hiện các lớp "trợ giúp" tĩnh nhưng sau một số phân tích; loại chức năng trợ giúp này luôn luôn kết thúc như là một lớp thực hiện riêng biệt. Trong trường hợp của bạn, bạn sẽ có một lớp "phân tích cú pháp văn bản cơ bản" và một lớp dẫn xuất ghi đè phương thức "phân tích cú pháp".

0

Bạn có thể sử dụng lớp có phương pháp tĩnh. Một cái gì đó giống như ParserUtils.RemoveFirstLine(). Trên .NET 3.5 trở lên, đôi khi bạn có thể sử dụng các phương thức mở rộng khi các hàm tiện ích của bạn có liên quan đến một lớp mà bạn không thể sửa đổi, như lớp String. Intellisense sẽ hiển thị phương thức mở rộng trên bất kỳ đối tượng chuỗi nào trong dự án.

6

Hãy cẩn thận!

  • Chức năng tiện ích chung cắt ngang phải nằm trong không gian tên tiện ích cao hơn. Phân tích cú pháp chuỗi, Thao tác tệp, v.v.

  • Đối tượng mở rộng phải nằm trong không gian tên riêng của chúng.

  • Các chức năng tiện ích áp dụng cho một tập hợp các đối tượng hoặc phương thức kinh doanh xác định phải nằm trong không gian tên của các đối tượng đó. Thường với hậu tố Helper, tức là BusinessObjectHelper. Đặt tên là quan trọng ở đây. Bạn đang tạo một vùng chứa cho các phương thức linh tinh, hay nó có ý nghĩa hơn khi nhóm chúng thành các đối tượng chuyên biệt, tức là một trình phân tích cú pháp?

3

Nếu bạn đang sử dụng C# 3.0, bạn có thể muốn xem xét sử dụng một phương pháp mở rộng!

public static class StringExtensions 
{ 
    public static string RemoveFirstLine(this string myString) 
    { 
     return myString.Remove("line..!"); 
    } 
} 

Sau đó trong mã bạn có thể làm điều này:

string myString = "Hello World etc"; 

string removedLineString = myString.RemoveFirstLine(); 
+1

Tôi thường ghét các phương pháp mở rộng. Chúng phá vỡ lớp và thư viện đóng gói chức năng. Tôi là ai để "sửa" thư viện .net? Bây giờ ai đó chạy qua một số phương thức trong mã myString.Whargarble() của tôi. Họ tìm phương pháp đó ở đâu? Tôi nghĩ myString = MyCompany.StringUtils.Whargarble (myString) là một tuyên bố rõ ràng hơn về những gì đang xảy ra. –

+0

Đó là một điểm hợp lý, tùy thuộc vào bạn cách triển khai mã của bạn :). Im không chắc chắn một phần mở rộng được coi là một sửa chữa, nó nhiều hơn một extenstion với nó! Họ tìm thấy nó bằng cách nhấp vào nó và chọn F12, và xác định một phương pháp mở rộng của nó bằng biểu tượng nhỏ trong intellisense. Không chắc họ sẽ gặp nó nếu bạn thêm chúng vào một không gian tên mở rộng; sau đó bạn khám phá "chọn tham gia" để sử dụng nó. Tôi không có vấn đề gì với nó. Làm thế nào nó sẽ "phá vỡ đóng gói của functionaility" !? Nó được đóng gói trong một lớp mở rộng! –

0

Extensions là con đường để đi trong những trường hợp. Nó nghĩa đen thêm chức năng của bạn vào sự xuất hiện. Chỉ có điều là không thể thực hiện phương pháp tĩnh trong năm 2008.

Các vấn đề liên quan