Thắc mắc về địa chỉ ô nhớ immutable trong string

string s1 = "hello";

string s2 = s1; 

s1 = "goodbye";
Console.WriteLine(s2);//hello
Console.WriteLine(s1);//goodbye`

Nếu như là object thì s2 sẽ bị đổi theo s1 vì cũng trỏ chung 1 ô nhớ heap.

Còn trường hợp này :
string s1 = "hello"; ----> ô nhớ stack S1 chứa “hello”.
string s2=s1; ----> ô nhớ stack S2 chứa “hello” (clone từ stack S1 qua).
s1 = "goodbye"; ----> ô nhớ stack S1 bị sửa thành “goodbye”.

Kết quả :
s1 —> S1 —> goodbye
s2 —> S2 —> hello.

Vì string cũng là Object mà sao cách dùng nó lại giống primary datatype (int, double, bool,…) vậy? Mọi người xác nhận và giải thích giúp e với. Thanks all

Câu này sai!
Việc gán này không phải sửa ô nhớ của s1 hoặc s2 mà là gán s2 cho 1 ô nhớ mới. Phép gán đối tượng là chuyển tham chiếu đối tượng đó sang một vùng nhớ mới chứ không phải sửa vùng nhớ hiện tại. Điều này cũng tương tự bạn gán con trỏ sang một giá trị con trỏ khác trong C/C++.
Trong Java và C# không có hỗ trợ thao tác cấp thấp liên quan đến con trỏ ở mức cơ bản. .NET Vẫn có Marshal (mscorlib.dll) hỗ trợ những thao tác cấp thấp không an toàn, nếu thao tác không cẩn thận sẽ gây lỗi nghiêm trọng.

4 Likes

thanks ạ, vậy cho em hỏi thêm, với trường hợp này:

Int a = 1;
a = 2;
a = 3; 

Thì OS cấp phát ô nhớ stack mới đến 3 lần phải không anh? mỗi lần cấp phát ô nhớ mới cho biến a thì ô nhớ cũ trước đó sẽ tự động bị giải phóng (xoá)?

Không đâu cậu :smile:
Đầu tiên, runtime environment sẽ là nơi thực thi code của cậu (không nhất thiết phải là OS). Chẳng hạn, với Java đó là JVM.
Về vụ stack, cậu chỉ có 1 entry mới được khởi tạo để chứa địa chỉ của biến a thôi (cậu không dùng primitive type, mà dùng wrapper type của kiểu int).
Entry đó sẽ được modify ở các câu lệnh gán sau (với địa chỉ mới của object Int mới). Vậy nên, cậu chỉ có 1 entry mới trên stack thôi.
Mỗi lần cấp phát giá trị mới và gán vào biến a, giá trị cũ trên heap (vì cậu dùng wrapper class, nên giá trị này ở trên heap), nếu không còn reference nào, sẽ được GC dọn dẹp tại thời điểm thích hợp.

Hope it helps!

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?