2013-04-10 12 views
5

Tôi nhận ra rằng đây có thể là điều thực sự cơ bản, nhưng tôi không chắc về cách thực hành tốt nhất để đạt được những điều sau đây.Thuộc tính lớp học, dễ đặt và có thể đặt trong nội bộ, nhưng chỉ có bên ngoài

Tôi có lớp sau với một tài sản chuỗi myString:

public class MyClass 
{ 
    public string myString 
    { 
     get { 
      return myString; 
     } 
    } 

    public void AFunction() 
    { 
     // Set the string within a function 
     this.myString = "New Value"; // Error because the property is read-only 
    } 
} 

Tôi muốn sau đây là đúng đối với myString tài sản:

  • phaïm nội
  • Gettable nội
  • KHÔNG thể đặt ở bên ngoài
  • Ge ttable externally

Vì vậy, tôi muốn có thể đặt biến myString trong lớp và làm cho giá trị của nó chỉ đọc từ bên ngoài lớp học.

Có cách nào để đạt được điều này mà không cần dùng một get riêng biệt và thiết lập chức năng và làm cho myString sở hữu tư nhân, như vậy:

public class MyClass 
{ 
    private string myString { get; set; } 

    public void SetString() 
    { 
     // Set string from within the class 
     this.myString = "New Value"; 
    } 

    public string GetString() 
    { 
     // Return the string 
     return this.myString; 
    } 
} 

Ví dụ trên cho phép tôi đặt biến trong nội bộ, nhưng không có quyền truy cập chỉ đọc vào thuộc tính thực tế myString từ bên ngoài lớp học.

Tôi đã thử protected nhưng điều này không làm cho giá trị có thể truy cập từ bên ngoài.

Trả lời

7

Bạn có thể cho phép các setter chỉ dành cho các thành viên lớp, thường constructor:

public class MyClass 
{ 
    public string myString { get; private set; } 
} 

Hoặc bạn có thể cho phép setter trong memebers nội bộ/lắp ráp:

public class MyClass 
{ 
    public string myString { get; internal set; } 
} 

Các getter sẽ được công khai.

+0

Hoàn hảo, cảm ơn sự giúp đỡ của bạn! :) – Luke

10

Có vẻ như bạn chỉ muốn:

public string MyString { get; private set; } 

Đó là một tài sản với một getter công cộng và một setter tin.

Không cần thêm phương pháp nào cả.

(Lưu ý rằng việc sử dụng các từ "nội bộ" là có khả năng gây nhầm lẫn ở đây, do ý nghĩa cụ thể của các từ khóa internal trong C#.)

2

Bạn có thể chỉ định bổ truy cập vào get và thiết lập, ví dụ:

public string MyString 
{ 
    get; 
    private set; 
} 
2
public string myString { get; private set; } 
+0

Điều này sẽ gây ra tình trạng tràn ngăn xếp khi get/set tự động gọi lại nhiều lần. Bạn cần phải có nó truy cập một lĩnh vực sao lưu có tên khác nhau. –

+0

Tôi đã cập nhật nó - bạn không làm mới trang. Lúc đầu, đã không nhận thấy lỗi ban đầu trong mã @ Coulton của –

+0

Xin lỗi vì thời gian xấu! +1 –