2013-03-20 14 views
11

Lưu ý, tôi nhận thức được những câu hỏi sau đây về chủ đề này:phí đầu vào Hiệu suất khi Sử dụng Resource Files (Resx)

  1. Are there any performance issues or caveats with resource (.resx) files?

  2. Are string resources (.resx) properties kept in memory?

et al. Tuy nhiên, tôi không tìm thấy bất kỳ câu trả lời nào trong những câu hỏi này thỏa đáng (chúng không đủ cụ thể).

Tôi cũng biết về các trang MSDN về chủ đề này, nhưng những điều này dường như cũng tiết lộ thông tin kỹ thuật liên quan đến chi phí sử dụng tệp tài nguyên.


Tình trạng khó khăn của tôi là chúng tôi sắp bắt đầu bản địa hóa ứng dụng WinForms có kích thước hợp lý. Mối quan tâm của tôi ở giai đoạn này là về hiệu suất truy cập tài nguyên từ một tệp .resx từ bên trong một vòng lặp lồng nhau chẳng hạn. Hiện tại đối với một phần nhỏ của mã chúng tôi đã bản địa hóa (Tên cột, Tiêu đề hàng, v.v. cho DataGridView, v.v.), chúng tôi đang chuyển tiền vào tài nguyên trong các biến toàn cầu của lớp có liên quan và sử dụng chúng.

Tài nguyên từ .resx được truy cập như thế nào (chúng được bao gồm trong hội đồng tại thời gian biên dịch?) Và có lợi ích hiệu suất từ ​​việc thanh toán các tài nguyên đó và sử dụng các biến toàn cục để truy cập không?

Trả lời

14

Tài nguyên chuỗi được lưu trong bộ nhớ. Xem mã được tạo trong "Resources.Designer.cs".

Nó sử dụng một System.Resources.ResourceManager và điều này làm bộ nhớ đệm của chuỗi.

Cũng lưu ý this ResourceManager constructor. Nó đề cập rằng bạn có thể thay đổi chiến lược lưu trong bộ nhớ cache:

Nhà xây dựng này sử dụng triển khai ResourceSet do hệ thống cung cấp. Để sử dụng định dạng tệp tài nguyên tùy chỉnh, bạn nên bắt nguồn từ lớp ResourceSet, ghi đè phương thức GetDefaultReader và GetDefaultWriter và chuyển loại đó cho hàm tạo ResourceManager (String, Assembly, Type). Sử dụng ResourceSet tùy chỉnh có thể là hữu ích cho kiểm soát chính sách lưu vào bộ nhớ cache tài nguyên hoặc hỗ trợ tài nguyên của riêng bạn định dạng tệp, nhưng nói chung là không cần thiết.

(tôi nhấn mạnh)

Các documentation for ResourceSet dứt khoát nói:

lớp

Các ResourceSet liệt kê trên một IResourceReader, tải mỗi tên và giá trị, và lưu trữ chúng trong một Hashtable

Vì vậy, chúng tôi biết chính xác bộ đệm ẩn tegy mà bạn sẽ nhận được theo mặc định.

[EDIT] Vì bạn dường như không tin tôi!:)

(1) Xem tài liệu cho hàm tạo ResourceManager(string baseName,Assembly assembly). Trạng thái:

Nhà xây dựng này sử dụng triển khai ResourceSet do hệ thống cung cấp.

(2) Bây giờ, hãy xem documentation for ResourceSet. Nó nói:

lớp

Các ResourceSet liệt kê trên một IResourceReader, tải mỗi tên và giá trị, và lưu trữ chúng trong một Hashtable.

Do đó hành vi của bộ nhớ đệm này thực sự là tài liệu trong MSDN, và bổ sung bạn có thể xác minh rằng đây là những gì đang xảy ra bằng cách sử dụng Resharper để kiểm tra việc thực hiện.

+0

+1 Cảm ơn rất nhiều vì đã trả lời của bạn. Cảm kích nhất. Bạn có thể giải thích một điều khác cho tôi không. Để gọi một tài nguyên từ [tài liệu MSDN] (http://msdn.microsoft.com/en-us/library/yfsz7ac5.aspx), chúng tôi thực hiện 'ResourceManager rm = new ResourceManager (" ExampleResources ", typeof (Example) .Assembly); chuỗi greeting = rm.GetString ("Greeting"); 'nhưng tôi hiểu từ http://stackoverflow.com/a/1142840/626442 rằng điều này cũng có thể được thực hiện thông qua' Console.WriteLine (strings.Hello); 'ở đâu tệp tài nguyên là 'strings.resx'. Whats sự khác biệt là gì? – MoonKnight

+0

Bạn có thể trợ giúp với câu hỏi này không: http://stackoverflow.com/questions/15523604/error-in-generation-of-resource-resource-design-cs-file – MoonKnight

+1

Sử dụng 'strings.Hello' chỉ sử dụng tự động- đã tạo lớp trong 'Resources.Designer.cs' –

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