2012-02-16 27 views
30

Khi sử dụng ReSharper, nó sẽ tự động thêm @, tại sao?ReSharper cung cấp tiền tố "@" cho tên biến trong biểu thức lambda

public static string RemoveDiacritics(this string input) 
{ 
    if (string.IsNullOrEmpty(input)) return input; 
    var normalizedString = input.Normalize(NormalizationForm.FormD); 
    var stringBuilder = new StringBuilder(); 
    foreach (var value in normalizedString.Select(value => 
     new {value, unicodeCategory = CharUnicodeInfo.GetUnicodeCategory(value)}) 
      .Where(@t => @t.unicodeCategory != UnicodeCategory.NonSpacingMark) 
      .Select(@t => @t.value)) stringBuilder.Append(value); 
    return (stringBuilder.ToString().Normalize(NormalizationForm.FormC)); 
} 
+0

Tôi cũng tự hỏi tại sao. Tôi đoán một quy ước để giúp dễ đọc, nhưng tôi có thể sai. – spender

+0

Sử dụng 'string.Concat', bạn có thể thực hiện với cả chuỗi' StringBuilder' và vòng lặp. – spender

Trả lời

26

Biểu tượng @ cho phép bạn sử dụng từ khóa dành riêng cho tên biến. Chẳng hạn như @class. Tôi cho rằng Resharper thực hiện điều này để an toàn.

Trong trường hợp này, không cần thiết và không có hiệu lực.

+0

An toàn ... có lẽ, nhưng mùi của sự lười biếng tại r # hq, đó không phải là điều tôi thường kết hợp với r #. – spender

+4

Tôi nhận thấy rằng R # đôi khi thêm '@' trước 'nhóm', ngay cả trong trường hợp không cần thiết. 'nhóm' là một từ khóa theo ngữ cảnh, do đó,' @ 'đôi khi cần thiết, nhưng R # dường như không nhận ra những trường hợp đó và chỉ đặt' @ 'ở đó luôn. – svick

+1

@svick: Tôi không chắc chắn nếu nó * nên * nhận ra những trường hợp đó. Đặt vào một biểu tượng '@' là một cách hay để ngăn chặn những người bảo trì trong tương lai nhầm lẫn nó với từ khóa theo ngữ cảnh (không hợp lệ). – Brian

2

Dấu at (@) thoát khỏi tên. Ví dụ. nếu bạn muốn sử dụng if như tên biến bạn có thể viết

int @if; 

if một mình sẽ không làm việc, kể từ if là một C# từ khóa.

@ trước t là vô dụng tại đây. Có lẽ người đã viết đó là sử dụng các quy ước đặt tên riêng của mình và sử dụng nó để biểu thị các tham số lambda.

(OK, tôi thấy, nó đã được Resharper, không phải là một người, tuy nhiên nó có thể có được).

2

Tôi chỉ thấy @ được sử dụng trong lần tái cấu trúc này: Chuyển đổi LINQ thành Chuỗi phương pháp. Trong trường hợp này, ReSharper đang tạo một số biến lambda (có thể là số lớn, tùy thuộc vào độ phức tạp của biểu thức lambda đang được chuyển đổi).

Một giả định là vì lý do là họ có thể cố ý sử dụng điều gì đó xấu xí với hy vọng rằng bạn sẽ thay thế chúng bằng những cái tên có ý nghĩa. Không có nhiều gợi ý mà ReSharper có thể sử dụng để đoán ở một cái tên có ý nghĩa, vì vậy nó tùy thuộc vào bạn.

0

Để tạo tiền tố bằng @ là hành vi thông thường trong các trình tạo khác.
Tôi đã thấy ít nhất trong một proxy dịch vụ web được tạo bởi wsdl.exe. WSDL được đặt tên là thuộc tính được bảo vệ và wsdl.exe đã tạo thuộc tính có tên @protected. Vì vậy, không có xung đột với từ khóa C# được bảo vệ.
Nhưng tôi không biết tại sao t là tiền tố trong trường hợp của bạn. Có thành viên tĩnh trong lớp học của bạn có tên t không?

22

Bạn sẽ phải yêu cầu người triển khai sửa đổi lại phải chắc chắn, nhưng tôi có thể thực hiện dự đoán được giáo dục. Chúng có thể là cách kiểm tra tương lai.

Trong thời gian từ khi C# 1.0 vận chuyển nhóm trình biên dịch đã thêm 21 từ khóa theo ngữ cảnh mới vào C#; trình biên dịch coi các từ khóa này là từ khóa khi chúng xuất hiện ở một số vị trí nhất định và như các định danh thông thường khác. Ví dụ: yield chỉ là một từ khóa khi nó xuất hiện trước return.

Khi công cụ chia sẻ lại tạo mã cho bạn, họ không biết liệu mã đó có được biên dịch trong một số C# 6 giả sử sử dụng t làm từ khóa theo ngữ cảnh trong một số ngữ cảnh hay không. Vì vậy, họ "bằng chứng trong tương lai" thiết kế bằng cách tự động gọi trước "từ định danh này không phải là từ khóa theo ngữ cảnh" bằng cách đặt @ ở phía trước nó.

Ngẫu nhiên, đây chính xác là lý do tại sao pháp lý là bất kỳ số nhận dạng nào được bắt đầu bằng @.

biết thêm thông tin ở đây:

http://ericlippert.com/2009/05/11/reserved-and-contextual-keywords/

4

Chỉ cần một số bối cảnh, trong ReSharper 5 đã có một lỗi nơi này:

groups.Select(group => ...) 

sẽ được biến thành này

from group in groups ... 

Bây giờ, nhóm là một từ khóa trong LINQ Query Cú pháp, do đó, R # 5 của refactoring actua lly đã phá vỡ mã. Trong R # 6, điều này dường như được cố định bằng cách sử dụng @ cho số nhận dạng.

+0

Cảm ơn! Tôi đã bị nhầm lẫn toàn bộ thời gian của tôi tại sao resharper chỉ thêm @ ở phía trước của biến Group của tôi. Bây giờ nó có ý nghĩa với tôi! – Frame91

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