VB.NET Public Property в одну строку - PullRequest
       1

VB.NET Public Property в одну строку

4 голосов
/ 23 сентября 2011

Можно ли как-нибудь разместить публичные свойства в одной строке в VB.NET, как в C #?Я получаю кучу ошибок каждый раз, когда пытаюсь переместить все в одну строку.

C #:

public void Stub{ get { return _stub;} set { _stub = value; } }

VB.NET

Public Property Stub() As String
    Get
        Return _stub
    End Get
    Set(ByVal value As String)
        _stub = value
    End Set
End Property

Спасибо

РЕДАКТИРОВАТЬ: я должен был уточнить, я использую VB 9.0.

Ответы [ 3 ]

11 голосов
/ 23 сентября 2011

Вы можете использовать автоматически реализованные свойства в VB 10 и C # , оба из которых будут короче, чем показанный вами C #:

public string Stub { get; set; }

Public Property Stub As String

Для нетривиальных свойств это звучит так, как будто вы могли бы сойти с рук, поместив все в одну строку в VB - но, поскольку это немного более многословно, я подозреваю, что вы в конечном итоге получите действительно длинную строку, вредящуючитаемость ...

2 голосов
/ 23 сентября 2011

Да, вы можете

Public Property Stub() As String : Get : Return _stub : End Get : Set(ByVal value As String) :_stub = value : End Set : End Property

, и вы можете даже сделать его короче и совсем не читаемым; -)

Public Property Stub() As String:Get:Return _stub:End Get:Set(ByVal value As String):_stub = value:End Set:End Property
0 голосов
/ 27 июля 2018

Можно определить переменную в одной строке, которая будет вести себя как свойство, если кто-то желает использовать немного другой синтаксис и связать его со сборкой C # (или поиграть с IL).

Протестировано с VS2017 и .Net 4.7.2.

Код C # (в настоящее время недоступен в VB.Net):

public class Propertor<T>
{
    public T payload;
    private Func<Propertor<T>, T> getter;
    private Action<Propertor<T>, T> setter;

    public T this[int n = 0]
    {
        get
        {
            return getter(this);
        }
        set
        {
            setter(this, value);
        }
    }

    public Propertor(Func<T> ctor = null, Func<Propertor<T>, T> getter = null, Action<Propertor<T>, T> setter = null)
    {
        if (ctor != null) payload = ctor();
        this.getter = getter;
        this.setter = setter;
    }
    private Propertor(T el, Func<Propertor<T>, T> getter = null)
    {
        this.getter = getter;
    }
    public static implicit operator T(Propertor<T> el)
    {
        return el.getter != null ? el.getter(el) : el.payload;
    }
    public override string ToString()
    {
        return payload.ToString();
    }
}

Затем в вашей программе VB,например:

Private prop1 As New Propertor(Of String)(ctor:=Function() "prop1", getter:=Function(self) self.payload.ToUpper, setter:=Sub(self, el) self.payload = el + "a")
Private prop2 As New Propertor(Of String)(ctor:=Function() "prop2", getter:=Function(self) self.payload.ToUpper, setter:=Sub(self, el) self.payload = el + "a")
public Sub Main()
    Console.WriteLine("prop1 at start : " & prop1.ToString)
    Dim s1 As String = prop1
    Console.WriteLine("s1 : " & s1)
    Dim s2 As String = prop1()
    Console.WriteLine("s2 : " & s2)
    prop1() = prop1()
    Console.WriteLine("prop1 reassigned : " & prop1.ToString)
    prop1() = prop2()
    Console.WriteLine("prop1 reassigned again : " & prop1.ToString)
    prop1() = "final test"
    Console.WriteLine("prop1 reassigned at end : " & prop1.ToString)
end sub

В результате:

prop1 at start : prop1
s1 : PROP1
s2 : PROP1
prop1 reassigned : PROP1a
prop1 reassigned again : PROP2a
prop1 reassigned at end : final testa
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...