2009-09-22 10 views
54

Pomyślałem, że zapytam ... ale czy istnieje sposób na to, aby Get część nieruchomości była dostępna publicznie, ale zachowaj zestaw jako prywatny?Właściwości VB.Net - Public Get, Private Set

W przeciwnym razie myślę, że potrzebuję dwóch właściwości lub własności i metody, po prostu uważam, że to będzie czystsze.

+2

Tak, szkoda, że ​​nie było wersji tak zwięzłej jak C#: 'public bool HasValue {get; prywatny zestaw; } ' –

+0

Czy możesz również rozszerzyć deklarację C#, jeśli chcesz? Na przykład dla settera właściwości 'Name' w VB.NET możesz podzielić go na' FirstName' i 'Surname', jeśli chcesz, a następnie ustawić je w tym samym czasie. Czy C# może to zrobić, czy też deklaracja powyżej leży tak daleko, jak to możliwe? –

+0

@DavidGard można przejść tak daleko w C#, jak można w VB.NET ... ale może również przejść o wiele krócej, co jest całkiem wygodne – Breeze

Odpowiedz

97

Tak, całkiem prosta:

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

Informacje, ta funkcja została wprowadzona do VB w tym samym czasie, co v2.0 .Net Framework został wydany. –

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

Spóźniłeś się pięć minut ;-) –

6

Jeden dodatkowy uszczypnąć warto wspomnieć: Nie jestem pewien, czy to jest .NET 4.0 lub Visual Studio 2010 cecha, ale jeśli używasz zarówno nie trzeba deklarować parametr wartości dla bloku Ustawiacz/mutatorowego kodu:

Private _name As String 

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

Myślę, że to 4.0 – RiddlerDev

-3

Jeśli używasz VS2010 lub później jest jeszcze łatwiejsze niż

Public Property Name as String 

Otrzymujesz prywatne nieruchomości i Get/Set całkowicie za darmo!

zobaczyć ten post na blogu: Scott Gu's Blog

+5

Tak, ale nie dostaniesz prywatnego zestawu. OP chciałby ekwiwalentu automatycznie zaimplementowanej właściwości "ReadOnly", którą można ustawić wewnątrz klasy. Wychowujesz interesujący punkt. Możesz mieć właściwość publiczną typu "tylko do odczytu", ale ustaw ją jako własność prywatną "_Name". Ale jeśli jest jakieś zachowanie, które chcesz umieścić w "Zestawie", które może nie działać tak dobrze. Możesz sobie z tym poradzić i rozwinąć odpowiedź, edytując je :) –

3

Uważam oznakowanie property jak readonly czystsze niż powyższych odpowiedzi. Wierzę, że vb14 jest wymagany.

Private _Name As String 

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

ten może być skondensowany do

Public ReadOnly Property Name As String 

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

+0

To jest ważne w VB10 – adun

+1

To powinna być zaktualizowana odpowiedź. Jest również możliwe bez pola wsparcia https://msdn.microsoft.com/en-us/library/dd293589(v=vs.140).aspx#code-snippet-4 – EvilDr

+0

Mam świadomość, że pole wsparcia nie jest wymagany. Myślałem, że id zawiera pole wsparcia dla kompletności. Zaktualizowana odpowiedź, aby dołączyć przykład bez pola zaplecza.Dzięki –

13

Nie jestem pewien, co minimalna wymagana wersja Visual Studio jest, ale w VS2015 można użyć

Public ReadOnly Property Name As String 

Jest dostępny tylko do odczytu dla publicznego dostępu, ale można go prywatnie modyfikować za pomocą _Name

+1

Tak wygląda na funkcję, która została dodana tylko w Visual Studio 2015 Zobacz https://msdn.microsoft.com/en-us/library/dd293589(v=vs.140).aspx - i porównaj sekcję " Definicje właściwości, które wymagają standardowej składni "do wersji artykułu VS 2013 - a zauważysz, że właściwości ReadOnly wymagają tego w VS2013, ale nie VS2015 –

+0

Problem z" ReadOnly "polega na tym, że nie można ustawić właściwości nawet z w klasie. Gdy oznaczysz zestaw jako chroniony lub prywatny, możesz ustawić go w klasie, co daje miły poziom kontroli. Chciałbym, abyś określił dwa zakresy, na przykład "Public Private Property Name As string" jako skrót. – Brain2000

+0

@ Brain2000 jak wspomniano w odpowiedzi można ustawić właściwość z wewnątrz klasy przy użyciu podkreślenia przed nazwą właściwości. Niestety, intellisense o tym nie wie. – Breeze

Powiązane problemy