2009-09-22 20 views
54

Tôi nghĩ mình sẽ hỏi ... nhưng liệu có cách nào để có phần Nhận tài sản có sẵn ở chế độ công khai, nhưng giữ riêng tư?VB.Net Properties - Public Get, Private Set

Nếu không, tôi nghĩ tôi cần hai thuộc tính hoặc thuộc tính và phương pháp, chỉ cần tìm ra điều này sẽ sạch hơn.

+2

Yea, tôi ước có một phiên bản ngắn gọn như C#: 'public bool HasValue {get; bộ tư nhân; } ' –

+0

Bạn cũng có thể mở rộng khai báo C# nếu muốn? Ví dụ, đối với setter của thuộc tính 'Name' trong VB.NET bạn có thể chia nó thành' FirstName' và 'Surname' nếu bạn muốn và sau đó đặt chúng cùng một lúc. C# có thể làm điều đó, hoặc là tuyên bố ở trên như xa như bạn có thể đi? –

+0

@DavidGard bạn có thể đi xa như trong C# như bạn có thể trong VB.NET ... nhưng cũng có thể đi ngắn hơn rất nhiều những gì là khá thuận tiện – Breeze

Trả lời

97

Vâng, khá thẳng về phía trước:

Private _name As String 

Public Property Name() As String 
    Get 
     Return _name 
    End Get 
    Private Set(ByVal value As String) 
     _name = value 
    End Set 
End Property 
+1

Đối với thông tin, tính năng này đã được giới thiệu với VB cùng một lúc như v2.0 của .Net Framework đã được phát hành. –

7
Public Property Name() As String 
     Get 
      Return _name 
     End Get 
     Private Set(ByVal value As String) 
      _name = value 
     End Set 
    End Property 
+4

Bạn trễ năm phút ;-) –

6

thêm Một tinh chỉnh đáng nói: Tôi không chắc chắn nếu điều này là một .NET 4.0 hoặc Visual Studio 2010 tính năng, nhưng nếu bạn đang sử dụng cả hai bạn không cần phải khai báo giá trị tham số cho khối setter/mutator mã:

Private _name As String 

Public Property Name() As String 
    Get 
     Return _name 
    End Get 
    Private Set 
     _name = value 
    End Set 
End Property 
+0

Tôi nghĩ rằng đó là 4.0 – RiddlerDev

-3

Nếu bạn đang sử dụng VS2010 hay muộn nó thậm chí còn dễ dàng hơn mà

Public Property Name as String 

Bạn nhận được các thuộc tính riêng tư và Nhận/Đặt hoàn toàn miễn phí!

thấy bài đăng blog: Scott Gu's Blog

+5

Có, nhưng bạn không nhận được một bộ riêng tư. OP sẽ tương đương với thuộc tính 'ReadOnly' được tự động thực hiện mà bạn có thể đặt bên trong lớp. Bạn mang đến một điểm thú vị mặc dù. Bạn có thể có thuộc tính công khai 'ReadOnly', nhưng sử dụng thuộc tính riêng của' _Name' để đặt nó. Nhưng nếu có bất kỳ hành vi nào bạn muốn đặt trong 'Bộ' có thể không hoạt động tốt. Bạn có thể lộn xộn xung quanh với nó và mở rộng câu trả lời của bạn bằng cách chỉnh sửa nó :) –

3

tôi tìm đánh dấu property như readonly sạch hơn so với câu trả lời ở trên. Tôi tin rằng vb14 là bắt buộc.

Private _Name As String 

Public ReadOnly Property Name() As String 
    Get 
     Return _Name 
    End Get 
End Property 

này có thể được ngưng tụ để

Public ReadOnly Property Name As String 

https://msdn.microsoft.com/en-us/library/dd293589.aspx?f=255&MSPPError=-2147217396

+0

Nó hợp lệ trong VB10 – adun

+1

Đây phải là câu trả lời được cập nhật. Nó cũng có thể không có trường sao lưu https://msdn.microsoft.com/en-us/library/dd293589(v=vs.140).aspx#code-snippet-4 – EvilDr

+0

Tôi biết trường sao lưu không phải là cần thiết. Tôi nghĩ id bao gồm các lĩnh vực sao lưu cho đầy đủ. Đã cập nhật câu trả lời để bao gồm ví dụ không có trường sao lưu.Cảm ơn –

13

Tôi không chắc chắn những gì phiên bản yêu cầu tối thiểu của Visual Studio, nhưng trong VS2015 bạn có thể sử dụng

Public ReadOnly Property Name As String 

Chỉ đọc cho truy cập công cộng nhưng có thể được chỉnh sửa riêng bằng cách sử dụng _Name

+1

Có vẻ như là một tính năng chỉ được thêm vào trong Visual Studio 2015 Xem https://msdn.microsoft.com/en-us/library/dd293589(v=vs.140).aspx - và so sánh phần " Định nghĩa tài sản yêu cầu cú pháp chuẩn "cho phiên bản VS 2013 của bài viết - và bạn sẽ nhận thấy rằng thuộc tính ReadOnly yêu cầu nó trong VS2013, nhưng không phải VS2015 –

+0

Vấn đề với" ReadOnly "là bạn không thể đặt thuộc tính ngay cả từ trong lớp học. Khi bạn đánh dấu tập hợp là được bảo vệ hoặc riêng tư, bạn có thể đặt nó trong lớp, điều này mang lại mức kiểm soát tốt. Tôi muốn bạn có thể chỉ định hai phạm vi, như "Tên thuộc tính công khai dưới dạng chuỗi" dưới dạng một tay ngắn. – Brain2000

+0

@ Brain2000 như được đề cập trong câu trả lời, bạn có thể đặt thuộc tính từ bên trong lớp bằng dấu gạch dưới ở trước tên thuộc tính. Đáng buồn là intellisense không biết về điều đó. – Breeze

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