Khi nào nên sử dụng thuộc tính Readonly và Get only


100

Trong ứng dụng .NET khi nào tôi nên sử dụng thuộc tính "ReadOnly" và khi nào tôi nên sử dụng chỉ "Get". Sự khác biệt giữa hai cái đó là gì.

private readonly double Fuel= 0;

public double FuelConsumption
{
    get
    {
        return Fuel;
    }
}        

hoặc là

private double Fuel= 0;

public double FuelConsumption
{
     get
     {
          return Fuel;
     }
}

12
đối với C #> 5, thuộc tính get có thể được giảm xuốngpublic double FuelConsumption => Fuel;
meJustAndrew

Câu trả lời:


121

Tạo thuộc tính chỉ với getter làm cho thuộc tính của bạn ở chế độ chỉ đọc cho bất kỳ mã nào nằm ngoài lớp.

Tuy nhiên, bạn có thể thay đổi giá trị bằng các phương thức do lớp của bạn cung cấp:

public class FuelConsumption {
    private double fuel;
    public double Fuel
    {
        get { return this.fuel; }
    }
    public void FillFuelTank(double amount)
    {
        this.fuel += amount;
    }
}

public static void Main()
{
    FuelConsumption f = new FuelConsumption();

    double a;
    a = f.Fuel; // Will work
    f.Fuel = a; // Does not compile

    f.FillFuelTank(10); // Value is changed from the method's code
}

Đặt trường riêng tư của lớp bạn như readonlycho phép bạn đặt giá trị trường chỉ một lần (sử dụng phép gán nội tuyến hoặc trong phương thức khởi tạo lớp). Bạn sẽ không thể thay đổi nó sau này.

public class ReadOnlyFields {
    private readonly double a = 2.0;
    private readonly double b;

    public ReadOnlyFields()
    {
        this.b = 4.0;
    }
}

readonly trường lớp thường được sử dụng cho các biến được khởi tạo trong quá trình xây dựng lớp và sẽ không bao giờ bị thay đổi sau này.

Tóm lại, nếu bạn cần đảm bảo giá trị thuộc tính của mình sẽ không bao giờ bị thay đổi từ bên ngoài, nhưng bạn cần có thể thay đổi nó từ bên trong mã lớp của mình, hãy sử dụng thuộc tính "Get-only".

Nếu bạn cần lưu trữ một giá trị sẽ không bao giờ thay đổi khi giá trị ban đầu của nó đã được đặt, hãy sử dụng một readonlytrường.


14
+ 1 cho ví dụ về mã. Nhưng cần phải làm rõ rằng các thuộc tính "Get-Only" chỉ có thể được sửa đổi bởi các phương thức lớp khi chúng được bao bọc trên các trường lớp. Chúng không thể được sửa đổi trực tiếp ngay cả bởi các phương thức của lớp, nếu bộ thiết lập không có ở đó. Và cố gắng làm như vậy sẽ dẫn đến lỗi trình biên dịch.
Devraj Gadhavi,

13

Kể từ C # 6, bạn có thể khai báo và khởi tạo 'thuộc tính tự động chỉ đọc' trong một dòng:

double FuelConsumption { get; } = 2;

Bạn có thể đặt giá trị từ hàm tạo chứ không phải các phương thức khác.


7

Một tài sản chỉ có một getter được cho là chỉ đọc. Bởi vì không có người thiết lập nào được cung cấp, để thay đổi giá trị của tài sản (từ bên ngoài).

C # có một từ khóa chỉ đọc , có thể được sử dụng trên các trường (không phải thuộc tính). Một trường được đánh dấu là "chỉ đọc", chỉ có thể được đặt một lần trong quá trình xây dựng một đối tượng (trong hàm tạo).

private string _name = "Foo"; // field for property Name;
private bool _enabled = false; // field for property Enabled;

public string Name{ // This is a readonly property.
  get {
    return _name;  
  }
}

public bool Enabled{ // This is a read- and writeable property.
  get{
    return _enabled;
  }
  set{
    _enabled = value;
  }
} 

2

thuộc tính chỉ đọc được sử dụng để tạo mã an toàn không hoạt động. tôi thực sự thích loạt bài đăng Encapsulation của Mark Seemann về các thuộc tính và trường sao lưu:

http://blog.ploeh.dk/2011/05/24/PokayokeDesignFromSmellToFragrance.aspx

lấy từ ví dụ của Mark:

public class Fragrance : IFragrance
{
    private readonly string name;

    public Fragrance(string name)
    {
        if (name == null)
        {
            throw new ArgumentNullException("name");
        }

        this.name = name;
    }

    public string Spread()
    {
        return this.name;
    }
}

trong ví dụ này, bạn sử dụng trường tên chỉ đọc để đảm bảo rằng bất biến của lớp luôn hợp lệ. trong trường hợp này, trình soạn thảo lớp muốn đảm bảo trường tên chỉ được đặt một lần (không thay đổi) và luôn hiện diện.


0

Các phương thức đề xuất điều gì đó phải xảy ra để trả về giá trị, các thuộc tính gợi ý rằng giá trị đã ở đó. Đây là một quy tắc chung, đôi khi bạn có thể muốn một thuộc tính hoạt động một chút (tức là Count), nhưng nói chung đó là một cách hữu ích để quyết định.

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.