2012-07-12 55 views
6

Tôi chỉ là curoius .ToUpper() hoạt động như thế nào? Có một số loại ánh xạ mà một thấp hơn có mã UTF XYZ và phía trên có mã UTF XYZ1?Làm thế nào để .ToUpper() hoạt động?

+0

Bạn có thể sử dụng [ILSpy] (http://wiki.sharpdevelop.net/ILSpy.ashx) hoặc tương tự để tìm hiểu. –

+3

Câu hỏi này http://stackoverflow.com/questions/297703/how-do-you-set-strings-to-uppercase-lowercase-in-unicode dường như có liên quan –

+1

Cuối cùng nó ánh xạ xuống InternalChangeCaseString mà không hiển thị với ILSPY – Chriseyre2000

Trả lời

3

Có, nó đang sử dụng siêu dữ liệu Unicode. Mỗi ký tự (điểm mã Unicode) có một trường hợp cũng như ánh xạ trường hợp thành chữ hoa và chữ thường (và trường hợp tiêu đề). .NET sử dụng thông tin này để chuyển đổi một chuỗi thành chữ hoa hoặc chữ thường. Bạn có thể tìm thấy thông tin rất giống nhau trong số Unicode Character Database.

0

String.ToUpper chỉ sử dụng CurrentCulture trong lõi.

Mẫu tháo rời phiên bản của String.ToUpper() từ mscorelib.dll, bạn có thể thấy điều này:

public string ToUpper(CultureInfo culture) 
{ 
    if (culture == null) 
    { 
     throw new ArgumentNullException("culture"); 
    } 
    return culture.TextInfo.ToUpper(this); 
} 

Vì vậy, nó phụ thuộc vào hiện văn hóa của bạn. Luôn luôn có một quá tải thích hợp của nó, nơi bạn có thể specifiy văn hóa thay thế.

EDIT

Bên trong nó gọi nativeChangeCaseString chức năng vào cuối với mẹ đẻ thực hiện. Làm thế nào nó thực hiện nội bộ, tôi không có ý tưởng, gây ra nó là một cái gì đó mà có thể được trả lời bởi người phát triển nó.

Theo đề nghị của @ Tim thêm một liên kết đến

TextInfo.ToUpper cung cấp một số thông tin về đề tài này.

+3

Tôi không chắc chắn rằng thực sự trả lời câu hỏi mặc dù. Nói "nó gọi phương thức này trong nội bộ" mà không có thông tin về phương thức đó. –

+0

@GeorgeDuckett: Tôi đã chỉnh sửa bài đăng của mình, nhưng như tôi đã viết để thực hiện ** cụ thể ** có thể được trả lời bởi người đã phát triển fucntion đó. – Tigran

+1

@Tigran: Bạn có thể muốn thêm liên kết vào ['TextInfo.ToUpper'] (http://msdn.microsoft.com/en-us/library/fsc2y169) vì có thêm một số thông tin, ví dụ: chuỗi có thể khác nhau về chiều dài từ chuỗi đầu vào, điều này chứng minh phương pháp lập bản đồ của OP sai. –

0

Nếu bạn quan tâm đến khía cạnh thiết kế của ToUpper() thực hiện sau đó bạn có thể tham khảo phần sau:

  • hạng ruồi thiết kế mẫu từ Gang of Four catalogue mẫu thiết kế được sử dụng để xử lý các nhân vật chức năng liên quan
  • Theo mẫu thiết kế này, mỗi đơn vị trong bộ sưu tập được thiết kế như một đối tượng đã xác định hành vi, đối tượng cuối cùng là tập hợp các đơn vị nhỏ hơn
  • Trong trường hợp của String - chuỗi đã cho thực sự được xử lý như mảng ký tự. ký tự là một đối tượng có hành vi được xác định
  • Đi với mẫu thiết kế này khi chúng tôi gọi ToUpper(), nó lặp qua các ký tự của chuỗi và đại biểu nội bộ cuộc gọi đến từng ký tự. Trong khi gọi ToUpper về ký tự, lớp String cũng chuyển tham chiếu đến Locale chứa các chi tiết của bản đồ ký tự và mã hóa

Nếu bạn quan tâm đến việc triển khai thực tế thì bạn có thể tham khảo việc triển khai mã nguồn mở của lớp java.lang.String một phần của ngôn ngữ Java - điều này tương đương với lớp tiện ích chuỗi C#.

Dưới đây là các liên kết nơi bạn có thể tìm mã nguồn của lớp java.lang.String - có 2 phương thức quá tải: toUpper() và toUpper (Ngôn ngữ).nội bộ toUpper() gọi toUpper (Locale) với ngôn ngữ mặc định, vì vậy phương thức thứ hai sẽ quan tâm đến bạn.

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/String.java

Hy vọng thông tin này sẽ hữu ích.

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