Đối với hầu hết các mục đích, một "chuỗi" là (được sử dụng / được coi là / nghĩ về / giả định là) một đơn vị nguyên tử có ý nghĩa , giống như một con số .
Hỏi tại sao các ký tự riêng lẻ của một chuỗi không thể thay đổi do đó giống như hỏi tại sao các bit riêng lẻ của một số nguyên không thể thay đổi.
Bạn nên biết tại sao. Nghĩ về nó đi.
Tôi ghét phải nói điều đó, nhưng thật không may, chúng tôi đang tranh luận điều này bởi vì ngôn ngữ của chúng tôi rất tệ và chúng tôi đang cố gắng sử dụng một từ, chuỗi , để mô tả một khái niệm hoặc lớp đối tượng phức tạp, theo ngữ cảnh.
Chúng tôi thực hiện các tính toán và so sánh với "chuỗi" tương tự như cách chúng tôi làm với các số. Nếu các chuỗi (hoặc số nguyên) có thể thay đổi, chúng ta sẽ phải viết mã đặc biệt để khóa các giá trị của chúng thành các dạng cục bộ bất biến để thực hiện bất kỳ loại tính toán nào một cách đáng tin cậy. Do đó, tốt nhất là nghĩ về một chuỗi như một định danh số, nhưng thay vì dài 16, 32 hoặc 64 bit, nó có thể dài hàng trăm bit.
Khi ai đó nói "chuỗi", tất cả chúng ta đều nghĩ về những điều khác nhau. Những người nghĩ về nó đơn giản chỉ là một tập hợp các nhân vật, không có mục đích cụ thể nào, tất nhiên sẽ kinh hoàng khi ai đó quyết định rằng họ không nên thao túng những nhân vật đó. Nhưng lớp "chuỗi" không chỉ là một mảng các ký tự. Đó là một STRING
, không phải a char[]
. Có một số giả định cơ bản về khái niệm mà chúng ta gọi là "chuỗi" và nói chung nó có thể được mô tả là đơn vị nguyên tử, có ý nghĩa của dữ liệu được mã hóa như một con số. Khi mọi người nói về "thao tác chuỗi", có lẽ họ thực sự đang nói về việc thao túng các nhân vật để xây dựng chuỗi và StringBuilder là điều tuyệt vời cho điều đó.
Hãy xem xét một lúc nó sẽ như thế nào nếu các chuỗi có thể thay đổi. Hàm API sau đây có thể bị lừa trả lại thông tin cho một người dùng khác nếu chuỗi tên người dùng có thể thay đổi được sửa đổi có chủ ý hoặc vô ý bởi một luồng khác trong khi chức năng này đang sử dụng nó:
string GetPersonalInfo( string username, string password )
{
string stored_password = DBQuery.GetPasswordFor( username );
if (password == stored_password)
{
//another thread modifies the mutable 'username' string
return DBQuery.GetPersonalInfoFor( username );
}
}
Bảo mật không chỉ là về 'kiểm soát truy cập', mà còn về 'an toàn' và 'đảm bảo tính chính xác'. Nếu một phương thức không thể dễ dàng được viết và phụ thuộc để thực hiện một phép tính hoặc so sánh đơn giản một cách đáng tin cậy, thì việc gọi nó là không an toàn, nhưng sẽ an toàn khi tự đặt câu hỏi cho ngôn ngữ lập trình.