2009-12-25 60 views
22

Xin lỗi Nếu tôi là noob, tôi có nghi ngờ này, tại sao chúng ta sử dụng các biến riêng tư và đặt chúng bằng cách sử dụng các thuộc tính?Tại sao tôi nên sử dụng biến riêng tư trong trình truy cập thuộc tính?

Tại sao chúng ta không thể chỉ sử dụng các sản phẩm thích hợp?

tôi đang nói về những tình huống như thế này

private string _testVariable; 

public string MyProperty 
{ 
    get { return _testVariable;} 
    set {_testVariable = value;} 
} 

Tôi đang nghĩ đến việc chỉ đơn giản là sử dụng

public string MyProperty { get; set; } 

Tại sao dự phòng biến tư nhân? hai chiến lược này có khác nhau không? bất cứ ai có thể vui lòng ném một số ánh sáng về điều này.

Cảm ơn

+0

xin lỗi tôi vừa sao chép từ đoạn trích đầu tiên của mình .. quên xóa trong phần thứ hai .. cảm ơn :) –

+0

bạn có thể đặt câu hỏi noob. – Cheeso

+0

cảm ơn, tôi mới phát triển phần mềm, nhưng tôi muốn tìm hiểu :) –

Trả lời

29

Ví dụ của bạn có ngữ nghĩa giống nhau. Cú pháp khai báo tài sản ngắn gọn (chỉ có { get; set; }) là một lối tắt có sẵn trong C# 3.0. Trình biên dịch thực sự tạo ra một biến sao lưu riêng và một getter đơn giản và setter như trong ví dụ đầu tiên của bạn.

Nếu tất cả những gì bạn đang làm là tạo một trình gỡ rối và setter (và không có gì thực sự xảy ra khi xảy ra), thì cú pháp ngắn gọn là một lựa chọn tốt. Nếu bạn phải thực hiện bất kỳ hành động nào khác (vẽ lại một điều khiển, ví dụ) khi bạn đặt giá trị, thì cú pháp đầy đủ là bắt buộc.

+0

Một điều tốt trong trường hợp bạn không chắc chắn bạn sẽ cần phải sử dụng logic bổ sung, là nếu bạn sử dụng viết tắt bạn luôn có thể tăng nó sau và mã bên ngoài sẽ không nhận thấy nó đã từng chỉ là một biến vinh quang. –

2

Ví dụ thứ hai mà bạn cung cấp:

public string MyProperty { get; set; } 

là chỉ có sẵn trong các phiên bản sau của .Net framework (v3.0 trở đi tôi tin)

Ví dụ đầu tiên cho phép bạn đặt các điểm ngắt trên các câu lệnh return và gán, khiến trình gỡ rối của bạn bị ngắt khi thuộc tính được gán/đọc.

+1

Không, bạn có thể sử dụng .Net 2.0 làm mục tiêu. Nhưng bạn cần một trình biên dịch C# 3. – helium

2

Snip mã đầu tiên giúp bạn sửa đổi một số trạng thái lớp riêng tư. Gói trạng thái riêng tư trong một thuộc tính là tốt đẹp vì nó ẩn thực hiện. Sau đó bạn có thể thay đổi việc triển khai và thuộc tính (giao diện bên ngoài) có thể không thay đổi.

Ví dụ: giả sử thay vì đặt một chuỗi trong bộ đặt, bạn đặt chuỗi trong một cửa hàng riêng của một số loại. Bạn viết nó vào một tập tin, hoặc ghi nó vào bộ nhớ dùng chung. Hoặc có thể bạn chỉ tính giá trị băm của chuỗi và không lưu trữ nó ở tất cả, như bạn có thể làm với mật khẩu.

Thuộc tính tự động trong đoạn mã 2 của bạn không liên quan đến biến riêng tư. Thiết kế thuộc tính tự động, giống như thiết kế thuộc tính rõ ràng được sử dụng trong snip đầu tiên, cho phép sửa đổi trong tương lai. Ví dụ như một phần của sửa đổi đó, bạn có thể chuyển đổi từ các thuộc tính tự động thành các thuộc tính được triển khai một cách rõ ràng.

0

Thuộc tính cơ bản là trình bao bọc xung quanh một trường. Trình bao bọc này cho phép sử dụng biến từ thế giới bên ngoài. Trong C# 3.0, bạn chỉ cần khai báo một thuộc tính như là public string MyProperty { get; set; } Trình biên dịch khai báo một biến riêng tư tự động và nhận các phương thức thiết lập cho nó. Nếu bạn cần thực hiện bất kỳ phép tính nào bên trong lớp đang khai báo thuộc tính, thì bạn nên sử dụng trường riêng cho điều đó.

0

Đôi khi bạn không biết khi nào bạn lần đầu tiên viết mã cho dù bạn có thể thêm một số mã sau này mà cần sử dụng biến riêng tư. Chắc chắn, bạn có thể thêm nó sau này nếu cần. Tôi chỉ tự động tạo biến riêng, giả định rằng nó sẽ được sử dụng sau này.

Điều này có thể phù hợp hơn trong các ứng dụng doanh nghiệp lớn hoặc các ứng dụng phát triển nhanh (nhanh nhẹn), nơi việc triển khai đầy đủ có thể không được biết đến trong quá trình viết mã ban đầu.

+1

Thay đổi từ một thuộc tính tự động sang một thuộc tính được hỗ trợ bởi một biến riêng tư rõ ràng là khá dễ dàng và không phá vỡ. Tôi không thấy lý do tại sao bạn muốn làm lộn xộn mã của bạn một cách không cần thiết về khả năng mà ai đó có thể cần đến sau này. Bạn có làm điều này với các phần khác của mã của bạn không? – Chris

+0

Không, chỉ là tài sản. Luôn tạo các biến riêng cho tôi một trạng thái mã có thể dự đoán được. Và việc thực hiện điều này dễ dàng hơn nếu bạn sử dụng trình tạo mã để tạo tất cả các thuộc tính :) Nhưng điểm của bạn được thực hiện tốt. – DOK

12

Tại sao biến riêng tư dư thừa? hai chiến lược này có khác nhau không? có thể bất kỳ ai vui lòng ném một số ánh sáng trên điều này.

Nếu tất cả những gì bạn đang làm là đọc/ghi một biến, thì không. Nếu không, có hai lý do tại sao bạn muốn có một biến tin:

xác nhận dữ liệu

// Data validation 
public class IntWrapper 
{ 
    private int _value; 
    public int Value 
    { 
     get { return _value; } 
     set 
     { 
      if (value < 0) { throw new Exception("Value must be >= 0"); } 
      _value = value; 
     } 
    } 
} 

Getter/setter kết thúc tốt đẹp một cửa hàng dữ liệu cơ bản

public class StringBuffer 
{ 
    List<char> chars = new List<char>(); 

    // Wraps up an underlying data store 
    public string Value 
    { 
     get { return new String(chars.ToArray()); } 
     set { chars = new List<char>(value.ToCharArray()); } 
    } 

    public void Write(string s) { Write(chars.Count, s); } 

    public void Write(int index, string s) 
    { 
     if (index > chars.Count) { throw new Exception("Out of Range"); } 
     foreach(char c in s) 
     { 
      if (index < chars.Count) { chars[index] = c; } 
      else { chars.Add(c); } 
      index++; 
     } 
    } 
} 
2

Mashesh, Tất cả chúng ta phải bắt đầu một nơi nào đó! Bạn hỏi về vars tin vs tính với cựu này:

private string _testVariable; 

public string MyProperty 
{ 
    get { return _testVariable;} 
    set {_testVariable = value;} 
} 

-or- 

public string MyProperty { get; set; } 

Bạn có cân nhắc:

public string MyProperty { get; private set; } 

Bạn có thể áp dụng phạm vi để thu khí tài sản/setters. . . . những thứ tuyệt vời. Oh yeah. . . khi sử dụng kiểu thuộc tính này trong lớp định nghĩa (như trong một hàm khởi tạo), hãy thêm nó vào với một 'cái này'. - do đó, một nhiệm vụ sẽ giống như 'this.MyProperty = "Một chuỗi được gán";'. Điều này làm cho ý định của bạn nhiều hơn rõ ràng hơn. . .

-1

Điều này không liên quan đến C# langugage, nhưng nhiều ứng dụng hơn.

Một lý do để sử dụng các thuộc tính, là điều được coi là "Đặc biệt" trong nhiều khung công tác. Ví dụ: Silverlight và WPF sẽ liên kết với các thuộc tính chứ không phải vào các trường

0

Tôi đặt biến số sao lưu khi chúng không cần thiết.

Rõ ràng là nếu bạn có nhu cầu làm điều gì đó đặc biệt trong bộ nạp hoặc setter thì hình thức ngữ nghĩa đầy đủ nên được sử dụng chứ không phải đường.

Ngoài ra tôi thích sử dụng các thuộc tính làm phương pháp gỡ lỗi cách thuộc tính được đặt hoặc được sử dụng đôi khi điều này không rõ ràng vì phản ánh và đó là lý do tôi thích sử dụng chúng.

Tôi thấy khó chịu khi cố gắng gỡ lỗi mã khi có khả năng biến số sao lưu có thể được truy cập nội bộ trong lớp bởi thuộc tính tự nó hoặc biến sao lưu và không có gì báo cho trình mã đúng cách truy cập.

Bạn có thể truy cập biến số sao lưu nội bộ cũng như thuộc tính sao cho đúng cách? Nó không rõ ràng ...

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