Tôi luôn nghĩ rằng tham số phương thức với loại lớp được chuyển thành tham số tham chiếu theo mặc định. Rõ ràng không phải lúc nào cũng vậy. Hãy xem xét các xét nghiệm đơn vị này trong C# (sử dụng MSTest).Việc chuyển lớp như tham số ref trong C# không phải lúc nào cũng hoạt động như mong đợi. Bất cứ ai có thể giải thích?
[TestClass]
public class Sandbox
{
private class TestRefClass
{
public int TestInt { get; set; }
}
private void TestDefaultMethod(TestRefClass testClass)
{
testClass.TestInt = 1;
}
private void TestAssignmentMethod(TestRefClass testClass)
{
testClass = new TestRefClass() { TestInt = 1 };
}
private void TestAssignmentRefMethod(ref TestRefClass testClass)
{
testClass = new TestRefClass() { TestInt = 1 };
}
[TestMethod]
public void DefaultTest()
{
var testObj = new TestRefClass() { TestInt = 0 };
TestDefaultMethod(testObj);
Assert.IsTrue(testObj.TestInt == 1);
}
[TestMethod]
public void AssignmentTest()
{
var testObj = new TestRefClass() { TestInt = 0 };
TestAssignmentMethod(testObj);
Assert.IsTrue(testObj.TestInt == 1);
}
[TestMethod]
public void AssignmentRefTest()
{
var testObj = new TestRefClass() { TestInt = 0 };
TestAssignmentRefMethod(ref testObj);
Assert.IsTrue(testObj.TestInt == 1);
}
}
Kết quả là AssignmentTest()
không thành công và hai phương pháp thử khác vượt qua. Tôi cho rằng vấn đề là việc gán một cá thể mới cho tham số testClass
sẽ phá vỡ tham chiếu tham số, nhưng bằng cách nào đó thêm từ khóa ref
sửa lỗi này.
Có ai có thể đưa ra giải thích chi tiết, tốt về những gì đang xảy ra ở đây không? Tôi chủ yếu chỉ cố gắng mở rộng kiến thức về C#; Tôi không có bất kỳ kịch bản cụ thể nào mà tôi đang cố giải quyết ...
Câu trả lời hay, chi tiết, nhưng vì một lý do nào đó, tôi luôn cảm thấy khó chịu khi ai đó nói "thông số luôn được truyền theo giá trị, ngay cả khi đó là tham chiếu bạn đang chuyển." Tôi không thấy sự khác biệt như thế nào lan tỏa. –
@RobertHarvey Gây khó chịu, nhưng tiếc là trong trường hợp mặc định, luôn luôn đúng (trừ khi tất nhiên, 'ref' hoặc' out' đang tham dự). Tôi nghĩ lời giải thích tốt nhất mà tôi từng đọc là của Jon Skeet, trong cuốn C# của anh ấy. –
@RobertHarvey thuật ngữ không may gây nhầm lẫn :( – JaredPar