Если бы мне пришлось угадывать, я бы сказал, что этот разработчик привык к другому языку, такому как Java, и не был полностью осведомлен о стандартной практике в C #.Номенклатура «get [Property]» очень интенсивно используется в Java, javascript и т. Д. C # заменяет это свойствами и индексаторами.Свойства столь же мощны, как и методы получения и установки, но их легче писать и использовать.Единственный раз, когда вы обычно видите «Получить [что-то]» в C #, это если:
- Операция, вероятно, будет достаточно дорогой, так что вы действительно хотите отвезти домой тот факт, что это не простой доступ к элементу(например,
GetPrimeNumbers()
) или - Ваша коллекция фактически содержит несколько проиндексированных коллекций.(Например,
GetRow(int i)
и GetColumn(int i))
. Даже в этом случае чаще всего просто представлять каждую из этих проиндексированных коллекций как свойство для себя, которое имеет индексированный тип ("table.Rows[2]
").
Если вы только обращаетесь к этим значениям в циклах for
, коллекция должна реализовать IEnumerable<Thing>
, что даст вам доступ к методам LINQ и конструкции foreach
.вам нужно иметь индексированные геттеры, вам следует рассмотреть возможность использования собственного интерфейса, который расширяет IEnumerable<T>
, но дополнительно обеспечивает:
T this[int i] { get; }
Таким образом, у потребителей не создается впечатление, что они могут Add
и Remove
объекты в этой коллекции.
Обновление
Я знаю, что это в основном вопрос стиля, который подлежит обсуждению, но я действительно думаю, чтоРешение GetThings
не является правильным способом решения проблемы. Следующая стратегия, хотя она и требует немного больше работы, в большей степени соответствует способу разработки стандартных классов и сред .NET:
public class ThingHolderDataAccess
{
public ThingHolder GetThingHolderForSomeArgs(int arg1, int arg2)
{
var oneThings = GetOneThings(arg1);
var otherThings = GetOtherThings(arg2);
return new ThingHolder(oneThings, otherThings);
}
private IEnumerable<OneThing> GetOneThings(int arg)
{
//...
return new List<OneThing>();
}
private IEnumerable<AnotherThing> GetOtherThings(int arg2)
{
//...
return new List<AnotherThing>();
}
}
public class ThingHolder
{
public IIndexedReadonlyCollection<OneThing> OneThings
{
get;
private set;
}
public IIndexedReadonlyCollection<AnotherThing> OtherThings
{
get;
private set;
}
public ThingHolder(IEnumerable<OneThing> oneThings,
IEnumerable<AnotherThing> otherThings)
{
OneThings = oneThings.ToIndexedReadOnlyCollection();
OtherThings = otherThings.ToIndexedReadOnlyCollection();
}
}
#region These classes can be written once, and used everywhere
public class IndexedCollection<T>
: List<T>, IIndexedReadonlyCollection<T>
{
public IndexedCollection(IEnumerable<T> items)
: base(items)
{
}
}
public static class EnumerableExtensions
{
public static IIndexedReadonlyCollection<T> ToIndexedReadOnlyCollection<T>(
this IEnumerable<T> items)
{
return new IndexedCollection<T>(items);
}
}
public interface IIndexedReadonlyCollection<out T> : IEnumerable<T>
{
T this[int i] { get; }
}
#endregion
Использование приведенного выше кода может выглядеть примерно так:
var things = _thingHolderDataAccess.GetThingHolderForSomeArgs(a, b);
foreach (var oneThing in things.OneThings)
{
// do something
}
foreach (var anotherThing in things.OtherThings)
{
// do something else
}
var specialThing = things.OneThings[c];
// do something to special thing