В 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 #.
Любой пример приветствуется
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";
'Процедура свойств состоит из двух частей. Первая - это 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
Похожие вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.