Truyền một thuộc tính làm tham số 'out' trong C #


81

Giả sử tôi có:

public class Bob
{
    public int Value { get; set; }
}

Tôi muốn chuyển thành viên Giá trị dưới dạng tham số ra như

Int32.TryParse("123", out bob.Value);

nhưng tôi gặp lỗi biên dịch, đối số "out" không được phân loại là một biến. " Có cách nào để đạt được điều này không, hoặc tôi sẽ phải trích xuất một biến, à la:

int value;
Int32.TryParse("123", out value);
bob.Value = value;

Câu trả lời:


83

Bạn phải sử dụng trường và thuộc tính "bình thường" một cách rõ ràng thay vì thuộc tính được triển khai tự động:

public class Bob
{
    private int value;
    public int Value
    { 
        get { return value; } 
        set { this.value = value; }
    }
}

Sau đó, bạn có thể chuyển trường dưới dạng tham số out:

Int32.TryParse("123", out bob.value);

Nhưng tất nhiên, điều đó sẽ chỉ hoạt động trong cùng một lớp, vì trường là riêng tư (và nên như vậy!).

Thuộc tính không cho phép bạn làm điều này. Ngay cả trong VB nơi bạn có thể chuyển một thuộc tính bằng cách tham chiếu hoặc sử dụng nó như một tham số out, về cơ bản vẫn có một biến tạm thời bổ sung.

Nếu bạn không quan tâm đến giá trị trả về của TryParse, bạn luôn có thể viết phương thức trợ giúp của riêng mình:

static int ParseOrDefault(string text)
{
    int tmp;
    int.TryParse(text, out tmp);
    return tmp;
}

Sau đó sử dụng:

bob.Value = Int32Helper.ParseOrDefault("123");

Bằng cách đó, bạn có thể sử dụng một biến tạm thời duy nhất ngay cả khi bạn cần thực hiện việc này ở nhiều nơi.


1
Tôi nghĩ vấn đề với cách tiếp cận thứ nhất là nếu bạn sử dụng lĩnh vực trực tiếp (thay vì tài sản), u có thể được bỏ qua quy tắc xác nhận rằng có thể tồn tại trong bất động sản
Andreas Grech

3
@Jon: Tôi nghĩ bạn muốn thay đổi int.Parse thành int.TryParse trong ví dụ ParseOrDefault.
shahkalpesh 02/09/09

8
Btw, lý do tại sao bạn không thể có một thuộc tính làm tham số đầu ra là việc thiết lập một thuộc tính thực sự là một lời gọi hàm và không có phép gán nếu bạn xem xét kỹ lưỡng.
Dirk Vollmar 02/09/09

3
Tôi rất thích nhìn thấy cú pháp thích hợp để cho phép tôi chuyển một thuộc tính dưới dạng tham số ref hoặc out. Hãy thực hiện công việc với trình biên dịch, nó nhanh hơn tôi.
Ignacio Soler Garcia

1
@SoMoS: Cho dù đó là một loại giá trị hay không cũng không có gì khác biệt đối với nhận xét của tôi. Thay đổi trong phương thức đối với tham số ngay lập tức có hiệu lực hoặc không. Điều này ảnh hưởng đến những gì xảy ra nếu một ngoại lệ cũng được ném ra.
Jon Skeet

7

Bạn có thể đạt được điều đó, nhưng không phải với tài sản.

public class Bob {
    public int Value { get; set; } // This is a property

    public int AnotherValue; // This is a field
}

Bạn không thể sử dụng outtrên Value, nhưng bạn có thể bật AnotherValue.

Điều này sẽ hoạt động

Int32.TryParse("123", out bob.AnotherValue);

Tuy nhiên, các nguyên tắc phổ biến yêu cầu bạn không đặt trường lớp ở chế độ công khai. Vì vậy, bạn nên sử dụng cách tiếp cận biến tạm thời.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.