Gli indicizzatori statici non sono supportati in C #? [duplicare]
Domanda
Questa domanda ha già una risposta qui:
- Indicizzatori statici? 7 risposte
Ho provato questo in diversi modi, ma sto raggiungendo la conclusione che non può essere fatto. È una caratteristica linguistica che mi è piaciuta in altre lingue in passato. È solo qualcosa che dovrei semplicemente cancellare?
Soluzione
No, gli indicizzatori statici non sono supportati in C #. A differenza di altre risposte, tuttavia, vedo come potrebbe essere facilmente utile averle. Prendere in considerazione:
Encoding x = Encoding[28591]; // Equivalent to Encoding.GetEncoding(28591)
Encoding y = Encoding["Foo"]; // Equivalent to Encoding.GetEncoding("Foo")
Sospetto che sarebbe usato relativamente raramente, ma penso che sia strano che sia proibito - dà asimmetria senza un motivo particolare per quanto posso vedere.
Altri suggerimenti
Puoi simulare indicizzatori statici usando le proprietà indicizzate statiche:
public class MyEncoding
{
public sealed class EncodingIndexer
{
public Encoding this[string name]
{
get { return Encoding.GetEncoding(name); }
}
public Encoding this[int codepage]
{
get { return Encoding.GetEncoding(codepage); }
}
}
private static EncodingIndexer StaticIndexer;
public static EncodingIndexer Items
{
get { return StaticIndexer ?? (StaticIndexer = new EncodingIndexer()); }
}
}
Utilizzo:
Encoding x = MyEncoding.Items[28591]; // Equivalent to Encoding.GetEncoding(28591)
Encoding y = MyEncoding.Items["Foo"]; // Equivalent to Encoding.GetEncoding("Foo")
No, ma è possibile creare un campo statico che contiene un'istanza di una classe che utilizza un indicizzatore ...
namespace MyExample {
public class Memory {
public static readonly MemoryRegister Register = new MemoryRegister();
public class MemoryRegister {
private int[] _values = new int[100];
public int this[int index] {
get { return _values[index]; }
set { _values[index] = value; }
}
}
}
}
... A cui è possibile accedere nel modo in cui si intende. Questo può essere testato nella finestra immediata ...
Memory.Register[0] = 12 * 12;
?Memory.Register[0]
144