2012-02-11 62 views
5

Đối tượng chuỗi hoạt động như kiểu Giá trị khi sử dụng toán tử == và! = Có nghĩa là đối tượng thực tế thay vì tham chiếu được chọn.Làm thế nào một kiểu String được chuyển đến một phương thức hoặc gán cho một biến trong C#?

Điều gì về việc truyền tham số, bài tập và sao chép?

Chuỗi tham số Truyền: Khi loại tham chiếu được chuyển đến phương thức, tham chiếu của nó được sao chép nhưng đối tượng nằm bên dưới vẫn giữ nguyên.

Điều này cũng đúng với loại Chuỗi trong C#? Ý tôi là sẽ có 2 con trỏ (messageVar và messageParam) trỏ đến cùng một đối tượng trong mã bên dưới:

public static void main() 
{ 
    string messageVar = "C#"; 
    Test(messageVar); 

    // what about in assignement? 
    string messageVar2 = messageVar; 
} 
public void Test(string messageParam) 
{ 
// logic 
} 

Điều gì sẽ xảy ra khi nó được gán cho một biến? Tôi đoán, các tài liệu tham khảo sẽ được sao chép chỉ và các đối tượng thực tế ở lại cùng một bộ nhớ đệm trong chuỗi Intern Pool. Không chắc.

Thông báo có phảiVar2 cũng đề cập đến cùng một đối tượng không?

Xin cảm ơn,

Trả lời

3

Có, bạn chỉ sao chép các tham chiếu chính xác, đối tượng đối tượng được tham chiếu là một và giống nhau.

Bạn có thể dễ dàng xác minh điều này bằng Object.ReferenceEquals() để kiểm tra xem hai tài liệu tham khảo điểm đến thể hiện cùng một đối tượng - tôi sửa đổi ví dụ của bạn một chút để hiển thị này:

static string messageVar = "C#"; 
public static void Main(string[] args) 
{ 
    bool isSame = Test(messageVar); //true 

    // what about in assignement? 
    string messageVar2 = messageVar; 
    isSame = Object.ReferenceEquals(messageVar2, messageVar);//also true 
} 

public static bool Test(string messageParam) 
{ 
    // logic 
    bool isSame = Object.ReferenceEquals(messageParam, messageVar); 
    return isSame; 
} 
+0

đẹp; Sự khác nhau giữa Object.Equals và Object.ReferenceEquals khi làm việc với chuỗi là gì? –

+0

Đối với chuỗi 'Equals()' sẽ kiểm tra đối với * chuỗi bình đẳng * bất kể tham chiếu, ví dụ: "foo" bằng "foo" bất kể cả hai chuỗi có trỏ đến các đối tượng khác nhau hay không – BrokenGlass

0

Đó chính xác là những gì sẽ xảy ra.

Biến đổi nhỏ với string s là chúng không thay đổi: bất kỳ thao tác nào có vẻ như việc sửa đổi chuỗi thực sự tạo một chuỗi mới. Vì vậy, không thể thay đổi chuỗi khi chúng được tạo. Bên cạnh đó, chuỗi hoạt động giống như bất kỳ loại tham chiếu nào khác: chúng được truy cập bằng tham chiếu và chuyển chúng đến hàm chuyển một bản sao tham chiếu (trừ khi bạn sử dụng ref hoặc out), do đó sửa đổi tham chiếu trong hàm không ảnh hưởng đến giá trị trong mã gọi.

2

“Chuỗi đối tượng hoạt động như một loại giá trị gia tăng khi sử dụng toán tử == và! = nghĩa là đối tượng thực tế thay vì tham chiếu được chọn. ”

Lớp String không nhận được bất kỳ điều trị đặc biệt nào (ở cấp độ ngôn ngữ). Lý do các toán tử ==!= so sánh giá trị (thay vì tham chiếu) của chuỗi là do chúng đã bị quá tải; xem String.Equality OperatorString.Inequality Operator. Bất kỳ lớp nào do người dùng định nghĩa cũng có thể quá tải hai toán tử này để so sánh bình đẳng trên các giá trị đối tượng (mặc dù điều này thường chỉ được khuyến nghị cho các loại bất biến, chẳng hạn như String).

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