Пара вещей:
1.) Что касается вашего фактического вопроса , у вас есть два варианта:
Вы можете перебрать поле Bar
(или свойство, если вы измените его на свойство, как описано ниже) в вашем коде:
Foo foo = new Foo();
foreach(Bar bar in foo.Bar)
{
...
}
Или вы можете Foo
реализовать IEnumerable<Bar>
(это более сложно):
public class Foo : IEnumerable<Bar>
{
.. your existing code goes here
public IEnumerator<Bar> GetEnumerator()
{
return Bar.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return Bar.GetEnumerator();
}
}
Это позволит вам сделать это:
Foo foo = new Foo();
foreach(Bar bar in foo)
{
}
Лично я бы порекомендовал первый вариант. Это проще, и если Foo
действительно не является (а не просто имеет ) коллекцию Bar
объектов, то это кажется более интуитивным.
2.) То, что у вас есть выше, не является свойствами, это открытые поля. Свойство имеет геттер и сеттер и выглядит примерно так:
public class Foo
{
public string Something
{
get { return ...; }
set { ... = value; }
}
}
Свойства обычно работают с одной переменной, называемой резервным хранилищем. Для вышеуказанного свойства, что-то вроде этого:
public class Foo
{
private string something;
public string Something
{
get
{
return something;
}
set
{
something = value;
}
}
}
Строго говоря, вы можете поместить абсолютно любой блок кода, который возвращает строку, в блок get
, и вы можете поместить что угодно в блок set
(включая ничего, хотя это не очень хорошая идея).
Свойства позволяют вам определять что-то, что ведет себя как поле (поскольку вы можете назначить это с помощью знака равенства), но использует поведение, которое вы указываете, когда его значение извлекается или устанавливается. Однако одна из проблем с очень простыми свойствами (которые просто получают / устанавливают переменную поддержки без какой-либо другой логики) заключается в том, что она немного многословна для того, что она на самом деле делает. Вот почему в C # 3.0 была введена концепция автоматических свойств, которая выглядит следующим образом:
public class Foo
{
public string Something { get; set; }
}
Здесь Something
выглядит немного как поле, но на самом деле это свойство. Компилятор C # распознает этот синтаксис (заменяя блоки кода для get
и set
только точкой с запятой) и создает для вас вспомогательную переменную и вставляет код для чтения из него и записи в него.