Если вы не хотите изменять значения, а также хотите получить доступ к членам коллекции, не требуя случайного доступа, очень простое решение вместо постоянного массива имеет окончательный неизменный список:
static final ImmutableList<Type> arrayOfConstants = ImmutableList.of(t1, t2, t3);
Не в C#, нет.
Однако можно всегда возвращать наборы из свойств, следующим образом:
public IList<Foo> Foos
{
get { return ...; }
}
public IList<Bar> Bars
{
get { return ...; }
}
IList< T> имеет индексатор, таким образом, можно записать следующее:
C whatever = new C();
Foo myFoo = whatever.Foos[13];
На строках "возвращаются..."; можно возвратить любые реализации IList< T> но Вы могли бы, что возвратить обертку только для чтения вокруг Вашего набора, посмотрите AsReadOnly () метод.
СУЩЕСТВУЕТ путь.. если Вы определяете 2 новых типа к внизу компилятору для различения двух различных подписей...
public struct EmployeeId
{
public int val;
public EmployeeId(int employeeId) { val = employeeId; }
}
public struct HRId
{
public int val;
public HRId(int hrId) { val = hrId; }
}
public class Employee
{
public int EmployeeId;
public int HrId;
// other stuff
}
public class Employees: Collection<Employee>
{
public Employee this[EmployeeId employeeId]
{
get
{
foreach (Employee emp in this)
if (emp.EmployeeId == employeeId.val)
return emp;
return null;
}
}
public Employee this[HRId hrId]
{
get
{
foreach (Employee emp in this)
if (emp.HRId == hrId.val)
return emp;
return null;
}
}
// (or using new C#6+ "expression-body" syntax)
public Employee this[EmployeeId empId] =>
this.FirstorDefault(e=>e.EmployeeId == empId .val;
public Employee this[HRId hrId] =>
this.FirstorDefault(e=>e.EmployeeId == hrId.val;
}
Затем для вызова его необходимо было бы записать:
Employee Bob = MyEmployeeCollection[new EmployeeID(34)];
И если Вы записали неявный оператор преобразования:
public static implicit operator EmployeeID(int x)
{ return new EmployeeID(x); }
затем Вы не должны были бы даже делать этого для использования его, Вы могли просто записать:
Employee Bob = MyEmployeeCollection[34];
То же самое применяется, даже если эти два индексатора возвращают различные типы...
При попытке сделать что-то вроде этого:
var myClass = new MyClass();
Console.WriteLine(myClass.Foos[0]);
Console.WriteLine(myClass.Bars[0]);
затем необходимо определить индексаторы на самих классах Foo и Bar - т.е. поместить все объекты Foo в Foos и сделать Foos экземпляром типа, который поддерживает индексацию непосредственно.
Для демонстрации использования выстраивает для свойств элемента (так как они уже поддерживают индексаторы):
public class C {
private string[] foos = new string[] { "foo1", "foo2", "foo3" };
private string[] bars = new string[] { "bar1", "bar2", "bar3" };
public string[] Foos { get { return foos; } }
public string[] Bars { get { return bars; } }
}
позволил бы Вам говорить:
C myThing = new C();
Console.WriteLine(myThing.Foos[1]);
Console.WriteLine(myThing.Bars[2]);
C# не имеет перегрузки типа возврата. Можно определить несколько индексаторов, если их входные параметры отличаются.
Нет Вы наклоняетесь, делают это. Только методы, которые могут иметь их подписи, отличаются только типом возврата, операторы преобразования. Индексаторы должны иметь различные входные типы параметра, чтобы заставить это компилировать.
Это из спецификации C # 3.0
«Перегрузка индексаторов позволяет классу, структуре или интерфейсу объявлять несколько индексаторов при условии, что их подписи уникальны в пределах этого класса, структуры или интерфейса».
public class MultiIndexer : List<string>
{
public string this[int i]
{
get{
return this[i];
}
}
public string this[string pValue]
{
get
{
//Just to demonstrate
return this.Find(x => x == pValue);
}
}
}