Trước khi .net, mẫu bình thường là dành cho các phương thức TryXX
đơn giản là để nguyên đối số được truyền theo tham chiếu chưa được sửa đổi. Đây là một mô hình rất hữu ích, vì nó có nghĩa là mã mà muốn sử dụng một giá trị mặc định có thể làm một cái gì đó như:
MyNum = 5;
TryParsing(myString, &myNum);
trong khi mã mà không muốn sử dụng một giá trị mặc định có thể sử dụng:
if (TryParsing(myString, &myNum))
{ .. code that uses myNum .. }
else
{ .. code that doesn't use myNum .. }
Trong lần sử dụng cũ, mã gọi điện sẽ phải đảm bảo myNum
được khởi tạo trước cuộc gọi, nhưng sẽ không phải lo lắng về giá trị trả về TryParsing
. Trong lần sử dụng thứ hai, mã gọi sẽ phải lo lắng về giá trị trả về, nhưng sẽ không phải khởi tạo myNum
trước cuộc gọi. Các TryParsing
thường xuyên chính nó sẽ không phải lo lắng về việc sử dụng được dự định.
C# không cho phép mẫu như vậy, trừ khi TryParsing
được viết bằng ngôn ngữ khác. Hoặc là TryParsing
phải được viết theo cách mà giá trị trước đó của myNum
sẽ bị ghi đè vô điều kiện mà không được kiểm tra, người gọi phải vô điều kiện khởi tạo nó hoặc các phương thức khác nhau phải được cung cấp cho hai trường hợp. Nếu phương pháp TryParsing
được viết bằng một số ngôn ngữ khác, nó có thể trong lý thuyết hành xử giống như các phương pháp kiểu cũ (viết đối số thành công, và để nó một mình nếu không) trong khi vẫn gọi nó là tham số out
. Tuy nhiên, tôi sẽ không khuyến nghị điều này vì hành vi kỳ quặc sẽ không bị giới hạn trong tham số out
đó.
Xem xét, ví dụ, rằng một phương pháp phong cách mà sử dụng một đối số kiểu fooStruct
, và fooStruct
có một constructor mà trông giống như:
fooStruct(string st)
{
fooStruct.TryParse(st, out this);
}
Trình biên dịch sẽ được hoàn toàn hạnh phúc với một constructor như vậy, kể từ nó "chắc chắn" viết this
. Mặt khác, nếu một số mã khác không:
while(someCondition)
{
var s = new fooStruct(someString);
...
}
Người ta có thể hy vọng rằng s
hoặc sẽ tổ chức một cấu trúc khởi tạo (nếu someString
là hợp lệ) hoặc để trống (nếu nó không phải là). Không có gì về mã đó sẽ gợi ý rằng s
có thể giữ giá trị của nó giữa các lần lặp lại của vòng lặp. Tuy nhiên, đó là chính xác những gì có thể sẽ xảy ra.
Và bên cạnh đó, nếu bạn quan tâm đến kết quả đủ mà bạn không muốn sử dụng mặc định, trừ khi đó rõ ràng là giá trị là XYZ (được phân tích cú pháp, v.v.), sau đó bạn thực sự cần phải kiểm tra giá trị trả về từ phương thức. –
Đã không nghĩ về người tiêu dùng có lý do để sử dụng giá trị trả lại nếu Thử trả về false. –