2012-04-24 28 views
7

Xét đoạn mã sau:Mục đích của phương pháp này để truy cập các công cụ sửa đổi là gì?

private string _text = null; 
    private string[] _values = null; 

    public string Text { get { return _text; } } 
    public string[] Values { get { return _values; } } 

gì này thực hiện điều đó có các thành viên cộng đồng mình sẽ không?

+7

Lưu ý rằng bạn nên * rất, rất cẩn thận * khi phơi bày một mảng dưới dạng thuộc tính chỉ đọc của một lớp. ** Tham chiếu mảng chỉ đọc nhưng nội dung mảng không. ** Người dùng của lớp này có thể thay đổi nội dung của mảng theo ý muốn. Nếu đó không phải là mong muốn sau đó thay vì trả về một 'ReadOnlyCollection ', không phải là một 'chuỗi []'. –

+1

Những suy nghĩ chi tiết của Eric về chủ đề này: http://blogs.msdn.com/b/ericlippert/archive/2008/09/22/arrays-considered-somewhat-harmful.aspx – SolutionYogi

Trả lời

10

Bằng cách sử dụng các thuộc tính thay vì trường công khai, bạn ẩn cài đặt.

Nếu tại một thời điểm nào đó bạn cần phải thay đổi những gì thuộc tính Văn bản và Giá trị trả về, bạn có thể thay đổi hành vi mà không thay đổi API của lớp.

Ngoài ra, thành ngữ này giới hạn quyền truy cập bên ngoài vào dữ liệu được hiển thị dưới dạng chỉ đọc.

+2

Rephrased vấn đề truy cập chỉ đọc, hy vọng rằng điều này ít mơ hồ hơn. Nhờ @AdamHouldsworth! –

5

Mã này sẽ cho phép các thực thể bên ngoài đọc các giá trị của bạn, trong khi mã của bạn trong nội bộ có thể sửa đổi trường sao lưu.

Bạn có thể ngắn tay rằng việc sử dụng tính năng tự động tính:

public string Text { get; private set; } 
public string[] Values { get; private set; } 

Với một lĩnh vực nào, bạn sẽ không có khả năng bảo vệ chống lại biến đổi bên ngoài và hỗ trợ sửa đổi nội tại cùng một thời điểm. Thậm chí nếu bạn muốn phơi bày một trường có thể ghi bên ngoài, tôi vẫn đề nghị đóng gói thứ trong một thuộc tính - bạn không bao giờ biết nếu bạn cần hỗ trợ nội dung nào đó mà không vi phạm hợp đồng bên ngoài (mã tùy chỉnh trong tập hợp/nhận được) cung cấp cho bạn không gian để làm điều này).

Chưa kể hầu hết các khung ràng buộc dữ liệu không thấy trường, chỉ thuộc tính.

2

Chỉ có thể đặt _text_values trong lớp mà chúng được xác định, nhưng giá trị của chúng có thể được truy cập thông qua các thuộc tính.

6

Đó là để làm cho các giá trị chỉ đọc, mặc dù tôi muốn được thêm nghiêng để viết nó như thế này:

public string Text { get; private set;} 
public string[] Values { get; private set; } 
+3

Điều này sẽ chỉ làm cho các giá trị chỉ đọc đối với nội dung bên ngoài lớp học. –

+0

@AdamHouldsworth Tôi không đồng ý. – asawyer

+2

Chỉ cần làm rõ vì việc ném các từ như chỉ đọc xung quanh có thể bị nhầm lẫn với từ khóa 'chỉ đọc'. –

2

Trong ví dụ của bạn nó làm cho các thuộc tính như chỉ đọc, nhưng có những công dụng khác nữa.

public string Text { get { return _text; } } 

Nếu bạn muốn làm một số hoạt động trong nội bộ trên return_text và sau đó trả lại chống lại proeperty Text bạn có thể một cái gì đó như thế nào.

public string Text { get { return _text.ToUpper(); } } 

Đây là lĩnh vực Encapsulation

Encapsulation đôi khi được gọi là trụ cột đầu tiên hoặc nguyên tắc lập trình hướng đối tượng. Theo nguyên tắc của đóng gói, một lớp hoặc cấu trúc có thể chỉ định cách truy cập của mỗi thành viên là mã bên ngoài lớp hoặc cấu trúc. Phương pháp và các biến không được dự định được sử dụng từ bên ngoài lớp hoặc lắp ráp có thể được ẩn để giới hạn khả năng xảy ra lỗi mã hóa hoặc khai thác độc hại.

Hãy xem xét ví dụ sau:

// private field 
    private DateTime date; 


    // Public property exposes date field safely. 
    public DateTime Date 
    { 
     get 
     { 
      return date; 
     } 
     set 
     { 
      // Set some reasonable boundaries for likely birth dates. 
      if (value.Year > 1900 && value.Year <= DateTime.Today.Year) 
      { 
       date = value; 
      } 
      else 
       throw new ArgumentOutOfRangeException(); 
     } 

    } 

Trong ví dụ này có một lĩnh vực tư nhân date được tiếp xúc công khai thông qua sở hữu Date. Bây giờ nếu bạn muốn thiết lập ranh giới cho ngày thì bạn có thể thấy phần thiết lập của thuộc tính.

Các vấn đề liên quan