Thuộc tính C #: làm thế nào để sử dụng thuộc tính tập hợp tùy chỉnh mà không có trường riêng?


93

Tôi muốn làm điều này:

public Name
{
    get;
    set
    {
        dosomething();
        ??? = value
    }
}

Có thể sử dụng trường riêng tư được tạo tự động không?
Hoặc tôi bắt buộc phải triển khai nó theo cách này:

private string name;
public string Name
{
    get
    {
        return name;
    }
    set
    {
        dosomething();
        name = value
    }
}

2
Có rất nhiều thảo luận tốt về vấn đề này tại câu hỏi SO này: stackoverflow.com/questions/1277018/…
David Hall

Câu trả lời:


102

Khi bạn muốn thực hiện bất kỳ điều gì tùy chỉnh trong getter hoặc setter, bạn không thể sử dụng các thuộc tính tự động nữa.


37

Bạn có thể thử một cái gì đó như sau:

public string Name { get; private set; }
public void SetName(string value)
{
    DoSomething();
    this.Name = value;
}

6
+1 Theo suy nghĩ của tôi câu trả lời này phản bác câu trả lời được chấp nhận. Nó đang sử dụng thuộc tính tự động. Nó đặt setter thành private một cách rõ ràng. Đây là một điều tốt vì nó cho phép người dùng cuối hoặc nhà phát triển biết rằng có nhiều khả năng sẽ xảy ra đằng sau phương pháp setter.
ooXei1sh

Sự khác biệt giữa điều này và không thiết lập là gì?
Sidhin S Thomas

3
@SidhinSThomas không cung cấp a private setsẽ ngăn tài sản được thiết lập bởi các thành viên của lớp; nó sẽ ở chế độ chỉ đọc. Bạn sẽ chỉ có thể thiết lập dữ liệu của nó trong hàm tạo.
Bondolin

15

Điều này là không thể. Thuộc tính được triển khai tự động hoặc mã tùy chỉnh.


11

Kể từ C # 7, bạn có thể sử dụng các định nghĩa nội dung biểu thức cho thuộc tính getvà trình truy cập set.

Xem thêm tại đây

private string _name;

public string Name
{
    get => _name;
    set
    {
        DoSomething();
        _name = value;
    }
}

4
Tuy nhiên, vẫn sử dụng một trường riêng. Không thực sự giúp OP.
TSmith

Trong khi điều này hoạt động, nó giống như @TSmith nói, nó không phải là những gì OP muốn.
M. Ruiz

7

Bạn phải thực hiện nó đầy đủ theo kịch bản của bạn. Cả hai getsetphải được triển khai tự động hoặc được triển khai đầy đủ cùng nhau, không phải là sự kết hợp của cả hai.

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.