2008-12-10 38 views
5

Là một chuỗi thực sự là một mảng ký tự (là-a), hay nó có một mảng ký tự như một kho lưu trữ nội bộ (có-a), hoặc là đối tượng riêng của nó có thể phơi bày chính nó như một mảng ký tự?Chuỗi thực sự là gì trong .NET?

Tôi nghiêng nhiều hơn để nói rằng đó là đối tượng riêng của nó, nhưng sau đó tại sao chúng ta có khuynh hướng luôn nói "Chuỗi là một mảng ký tự ..."?

+0

Tại sao bạn hỏi? Tò mò? Một số vấn đề của bạn phải đối mặt? –

+0

Một bit huyền diệu của dây cáp mạng được nhúng trong một loạt các ký tự. – Echostorm

+0

Vui lòng chỉnh sửa câu hỏi để đề cập đến .NET ở đâu đó trong đó. Tôi đã trả lời dựa trên thẻ câu hỏi. –

Trả lời

7

Chuỗi .NET không chỉ là một mảng ký tự. Nó chứa một mảng các ký tự, vì vậy nói đúng, nó có-a.

Hơn nữa, có rất nhiều subtleties liên quan đến Unicode mà nó không hoạt động bất cứ điều gì như một mảng. Ghép nối một nhân vật có thể làm nhiều hơn là chỉ tăng độ dài chuỗi lên một ký tự và chèn ký tự mới vào cuối. Theo quy tắc chuẩn hóa Unicode, nó thực sự có thể thay đổi toàn bộ chuỗi.Vì vậy, nó chắc chắn không có gì giống như một mảng các ký tự, nhưng một nơi nào đó trong lớp, như một mảng tồn tại.

1

MSDN: Loại chuỗi biểu thị một chuỗi ký tự Unicode.

Điều này có nghĩa là: đó là một mảng ký tự Unicode.

+0

Chết tiệt bạn, 44 giây! = P –

+0

Loại định nghĩa nào sử dụng thuật ngữ được định nghĩa trong chính định nghĩa? :) –

+0

Chuỗi đầu tiên là tên của từ khóa, thứ hai có nghĩa là "chuỗi" như một thuật ngữ chung :) –

3

Ý nghĩa ngữ nghĩa của chuỗi là chuỗi thứ hai.

Lớp .Net String duy trì một kho lưu trữ nội bộ (có-a) và có thể hiển thị cửa hàng đó theo nhiều cách trừu tượng như các nhà thiết kế chọn.

Câu hỏi này giống như "Apple có phải là thứ tròn đỏ không? Bởi vì tôi luôn nghĩ đó là một loại trái cây".

0

Theo cách trừu tượng (và tôi đoán, khi được trình bày trong bộ nhớ) - đó là một mảng ký tự.

Đúng, nếu tôi nghĩ sai.

7

Tùy thuộc vào định nghĩa của bạn về từ "chuỗi".

System.String nhập .NET có một mảng ký tự làm cửa hàng nội bộ (nó cũng lưu trữ độ dài (là O (1)), trong số những thứ khác, ví dụ).

Nhưng chuỗi có nghĩa là một lần xuất hiện liên tiếp của một cái gì đó nói chung, mà cũng có thể có nghĩa là một mảng ký tự :))

By the way, khi tôi nói string loại có một "mảng nhân vật," tôi didn' t có nghĩa là "một lĩnh vực loại char[]" cụ thể. Tôi có nghĩa là ý nghĩa chung của thuật ngữ "mảng" như là một bộ sưu tập được sắp xếp của một cái gì đó. :))

0

Chuỗi là tên của một lớp học. Nó có ý nghĩa khác nhau trong các ngôn ngữ khác nhau. Nó có thể là unicode hoặc ASCII nội bộ có nghĩa là cơ chế lưu trữ của nó là một chuỗi các byte. Lớp này cung cấp các chức năng để thao tác bộ nhớ trong của chính nó và nó không có nghĩa là được truy cập trực tiếp và sửa đổi do thực tế là nó có thể chứa các ký tự trong một loạt các mã hóa khác nhau. Vì vậy, với mục đích câu hỏi của bạn, nó có một kho lưu trữ byte.

0

Tùy thuộc vào ngôn ngữ và triển khai. Ở mức cơ bản nhất (chuỗi ascii char *), nó là một chuỗi các địa chỉ bộ nhớ tuần tự, mỗi địa chỉ chứa một đoạn mã ngắn tương ứng với mã ascii và được kết thúc bằng null (char (0)). Hầu hết các ngôn ngữ cấp cao hơn cung cấp một đối tượng chuỗi mà có một mảng ký tự cũng như các phương thức tiện lợi vì làm việc với các chuỗi char * ít nhiều là một cơn đau ở phía sau.

+0

Nếu bạn đọc câu hỏi và thực sự có nghĩa là nó phụ thuộc vào ngôn ngữ ".Net", thì bạn sai ... nó không ... Tất cả các chuỗi .net bất kể ngôn ngữ là như nhau, như được định nghĩa bởi. Hệ thống loại phổ biến thuần túy (CTS) ... –

0

Phụ thuộc vào chính xác cách bạn nhìn vào nó. Nếu bạn ghim nó với một GCHandle và sau đó nhìn vào bộ nhớ nơi nó cư trú, bạn sẽ thấy nó thực sự là một mô tả chiều dài 32-bit theo sau ngay lập tức bởi một mảng các ký tự unicode (lưu ý rằng AddrOfPinnedObject sẽ cung cấp cho bạn địa chỉ đầu tiên ký tự, không phải là độ dài. Nếu nó cung cấp địa chỉ có độ dài, nó sẽ ít hữu ích hơn cho P/Gọi).

0

Chức năng, chuỗi là danh sách hoặc chuỗi ký tự. Các chuỗi thường được lưu trữ trong suốt như các mảng ký tự (ví dụ: trong C), vì vậy chúng tôi thường đề cập đến chúng theo cách đó. Mảng cho phép truy cập ngẫu nhiên thuận tiện vào các ký tự, điều quan trọng đối với một số thuật toán.

Vì mục đích khác, việc lưu trữ chuỗi Unicode dưới dạng UTF-8 có thể là hình thức thích hợp nhất. Lưu ý rằng, mặc dù nó được lưu trữ trong một mảng byte, không còn một sự tương ứng một-một giữa các byte và các ký tự: thuật toán chuỗi của bạn thường cần phải truy cập các ký tự tuần tự từ đầu - như một danh sách.

Đạo đức của câu chuyện này là: mã chuỗi của bạn chỉ nên yêu cầu quyền truy cập ngẫu nhiên nếu thực sự cần. Bạn có thể ngạc nhiên khi ít khi bạn thực sự cần một loạt các nhân vật.

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