В Visual Basic .Net существует так называемая процедура свойств, которая может иметь следующий вид

public property Name(ByVal x As String) As String

    get
       return name & x;
    end get
    set
       name = x & value;
    end set
end property

Что эквивалентно в C # .net. Я знаю, что в C # есть свойства, а также поля, но на всем сайте MSDN я не смог найти никаких ссылок на процедуры свойств C #.

Любой пример приветствуется

-3
Blaatz0r 23 Фев 2015 в 11:37

2 ответа

Лучший ответ

Я думаю, вы спрашиваете о параметризованных средствах доступа (также известных как параметризованные геттеры). VB.NET поддерживает их, а C # - нет - по крайней мере, с лаконичным синтаксисом. Если я правильно помню, CIL (базовый язык CLR) поддерживает их, но C # не предоставляет эту функциональность (аналогично тому, как CIL поддерживал фильтры исключений, как и VB.NET, но C # не поддерживал их до этого года).

Поскольку C # не поддерживает их изначально, вы должны обойти это ограничение, воспользовавшись поддержкой C # для анонимно-индексированных свойств (также известного как this[T]). Это работает путем замены параметризованного свойства объектом, который затем представляет свойство. Вот так (используя ваш пример):

public class Foo {

    public class FooAccessor<TKey,TValue> {

        private readonly Func<TKey,TValue>   getter;
        private readonly Action<TKey,TValue> setter;

        private FooAccessor(Func<TKey,TValue> accessor, Action<TKey,TValue> mutator) {
            this.getter = accessor;
            this.setter = mutator;
        }

        public TValue this[TValue key] {
            get { return this.getter( key ); }
            set { this.setter( key, value ); }
        }
    }

    private String name;
    private FooAccessor<String,String> someProperty;

    public FooAccessor<String,String> SomeProperty {
        get {
            // Lazily-initialize this.someProperty:
            return this.someProperty ?? this.someProperty = new FooAccessor<String,String>(
                delegate(String x) {
                    return this.name + x;
                },
                delegate(String x, String value) {
                    this.name = x + value;
                }
            );
        }
    }
}

Таким образом, вы можете использовать его, как если бы это было именованное и параметризованное свойство:

Foo foo = new Foo();
// Getter
String ret = foo.SomeProperty[ "foo" ];
// Setter
foo.SomeProperty[ "bar" ] = "value";
5
Dai 16 Апр 2018 в 17:40

'Процедура свойств состоит из двух частей. Первая - это Set Part (которая является WriteOnly), а вторая - Get Part (которая является ReadOnly). Для меня Set Part Satement похож на подпрограмму, а Get part Statement похож на функцию, которая возвращает значение. 'сначала мы должны установить значение для его Set Part, а во-вторых, мы получаем значение из Get Part после того, как значение инициализировано SetPart'. Процедура свойства не сохраняет никакого значения, поэтому мы объявляем переменную для хранения значения.

Dim stName As String = ""

Public Property SetGetName() As String
    Set(value As String)
        If value = "A" Then
            value += " Letter is "
        End If
        stName = value
    End Set
    Get
        If stName <> "" Then
            Return stName
        End If

        Return "Empty"
    End Get

End Property
Public WriteOnly Property SetName As String

    Set(value As String)

        If value = "A" Then
            value += " Letter is "
        End If
        stName = value
    End Set

End Property

Public ReadOnly Property GetName As String
    Get
        If stName <> "" Then
            Return stName
        End If

        Return "Empty"
    End Get
End Property



Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

    SetName = "AAA" ' here we set value 
    MsgBox(GetName) ' here we get value

    'or 
    SetGetName = "AAA"
    MsgBox(SetGetName)
End Sub
0
Muhammed Farooq 28 Дек 2019 в 09:21