2016-04-21 19 views
8

Tôi hiểu việc sử dụng toán tử nameof() để xử lý ngoại lệ, ghi nhật ký, v.v. Nhưng tôi không hiểu ví dụ dưới đây đến trực tiếp từ một số mã Microsoft.Tên của() toán tử cho chuỗi tĩnh

public static class SessionKeys 
{ 
    public static class Login 
    {   
     public static string AccessToken = nameof(AccessToken); 
     public static string UserInfo = nameof(UserInfo); 
    } 
} 

Làm thế nào là hữu ích hơn

public static class SessionKeys 
{ 
    public static class Login 
    { 
     public static string AccessToken = "AccessToken"; 
     public static string UserInfo = "UserInfo"; 
    } 
} 

Trả lời

15

nameof là một nhà điều hành được đánh giá ở biên dịch thời gian, vì vậy khi ứng dụng của bạn được biên dịch thì thực sự không có sự khác biệt giữa hai giải pháp đó.

Tuy nhiên, sử dụng nameof trong trường hợp này có một số lợi ích:

  • Nó làm cho các chuỗi giá trị ít “ma thuật”. Vì vậy, thay vì là một chuỗi ma thuật bị ngắt kết nối, lý do ngữ nghĩa đằng sau giá trị đó rất rõ ràng: Đó là tên của biến đó.
  • Tên là một tham chiếu thực sự với tên, vì vậy cả hai đều được kết nối. Điều này cho phép bạn refactor một trong hai người trong số họ và tự động ảnh hưởng đến người khác. Nó cũng làm cho "chuỗi" xuất hiện dưới dạng tham chiếu khi tra cứu tham chiếu đến biến đó. Vì vậy, bạn biết chính xác nơi nó đã được sử dụng.
6

Rất đơn giản, ví dụ đầu tiên có nguồn gốc giá trị chỉ định từ tên biến tham chiếu, trong khi thứ hai bắt nguồn giá trị từ một chuỗi tùy ý mà có thể hoặc có thể không khớp với tên biến. Kết quả là, nếu bạn cấu trúc lại tên của các biến, giá trị được kết hợp với các biến đó sẽ tự động được cập nhật trong ví dụ đầu tiên, trong khi bạn phải đảm bảo rằng bạn đã cập nhật giá trị chuỗi cũng như trong ví dụ thứ hai.

Nó đáng chú ý là cả hai biên dịch với cùng IL bên dưới mui xe, đẩy giá trị của một trường tĩnh vào việc đánh giá stack (mỗi LinqPad):

IL_0001: ldsfld  UserQuery+SessionKeys+Login.AccessToken 
Các vấn đề liên quan