2012-12-23 27 views
15

Trong chuỗi Java là không thay đổi. Nếu chúng ta có một chuỗi và thực hiện thay đổi với nó, chúng ta nhận được chuỗi mới được tham chiếu bởi biến giống nhau:C# intutable int

String str = "abc"; 
str += "def"; // now str refers to another piece in the heap containing "abcdef" 
       // while "abc" is still somewhere in the heap until taken by GC 

It's been said rằng int và double là không thay đổi trong C#. Nó có nghĩa là khi chúng ta có int và sau đó thay đổi nó, chúng ta sẽ nhận được int mới "nhọn" bởi cùng một biến? Điều tương tự nhưng với ngăn xếp.

int i = 1; 
i += 1; // same thing: in the stack there is value 2 to which variable 
     // i is attached, and somewhere in the stack there is value 1 

Điều đó có đúng không? Nếu không, theo cách nào là int không thay đổi?

+8

Để hoàn thành, các chuỗi .NET cũng không thay đổi. –

Trả lời

16

Bạn chưa thay đổi (và không thể thay đổi) nội dung nào đó về int; bạn đã gán mới giá trị int (và loại bỏ giá trị cũ). Vì vậy, nó là bất biến.

Xem xét một struct phức tạp hơn:

var x = new FooStruct(123); 
x.Value = 456; // mutate 
x.SomeMethodThatChangedInternalState(); // mutate 

x = new FooStruct(456); // **not** a mutate; this is a *reassignment* 

Tuy nhiên, không có "chỉ" ở đây. Cấu trúc là trực tiếp trên ngăn xếp (trong trường hợp này): không có tham chiếu liên quan.

+0

Cảm ơn, giờ tôi đã hiểu! –

21

Để theo dõi (hoàn toàn chấp nhận được) câu trả lời của Marc: Integer giá trị là không thay đổi nhưng số nguyên biến có thể thay đổi. Đó là lý do tại sao chúng được gọi là "biến".

Integer giá trị là không thay đổi: nếu bạn có giá trị mà là số 12, không có cách nào để làm cho nó kỳ quặc, có cách nào để sơn nó màu xanh, và vân vân. Nếu bạn cố gắng làm cho nó kỳ lạ bằng cách nói, thêm một, sau đó bạn kết thúc với một giá trị khác nhau, 13. Có thể bạn lưu trữ giá trị đó trong biến được sử dụng để chứa 12, nhưng điều đó không thay đổi bất kỳ tài sản của 12. 12 vẫn chính xác giống như trước đây.

2

Mặc dù điều này có vẻ hiển nhiên, tôi sẽ thêm một vài dòng giúp tôi hiểu trong trường hợp ai đó có cùng sự nhầm lẫn.

various kinds of mutability nhưng thường khi mọi người nói "không thay đổi" có nghĩa là lớp học có thành viên không thể thay đổi.

Chuỗi có thể lưu trữ các ký tự trong một mảng, không thể truy cập được và không thể thay đổi thông qua các phương thức, đó là lý do tại sao chuỗi không thể thay đổi. Thao tác + trên chuỗi luôn trả về một chuỗi mới.

int có thể lưu trữ giá trị của nó trong thành viên "Giá trị" mà dù sao là không thể truy cập được, và đó là lý do tại sao không thể thay đổi. Tất cả các hoạt động trên int int new int, và giá trị này được sao chép vào biến, bởi vì nó là một kiểu giá trị.