Hey zusammen
Ich weiss das ist eigentlich keine wirklich große Sache. Aber ich bin mir nicht ganz schlüssig wie ichs machen soll.
Ich habe mir für einen Speicherbereich folgende Klasse definiert:
[highlight=c#]
public class MemoryBlock:IEnumerable<AddressedByte>
{
private readonly int _startAddress;
private readonly Byte[] _bytes;
public MemoryBlock(int startAddress, byte[] bytes)
{
_startAddress = startAddress;
_bytes = bytes;
}
public byte this[int address]
{
get { return _bytes[GetArrayIndex(address)]; }
set { _bytes[GetArrayIndex(address)] = value; }
}
public MemoryBlock GetPart(int startAddress, int length)
{
var bytes = from addressedByte in this
where addressedByte.Address > startAddress - 1 && addressedByte.Address < startAddress + length
select addressedByte.Value;
return new MemoryBlock(startAddress,bytes.ToArray());
}
private int GetArrayIndex(int address)
{
return address - _startAddress;
}
#region Implementation of IEnumerable
public IEnumerator<AddressedByte> GetEnumerator()
{
return new MemoryBlockEnumerator(this);
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
#endregion
}
[/highlight]
[highlight=c#]
public class AddressedByte
{
public int Address { get; set; }
public byte Value { get; set; }
}
[/highlight]
Jetzt gibt aber der Array Zugriff über this [int address] etwas anderes zurück als der Enumerator. Allerdings stelle ichs mir für die Benützung praktischer vor. Ist das Inkonsequent?
Ich weiss das ist eigentlich keine wirklich große Sache. Aber ich bin mir nicht ganz schlüssig wie ichs machen soll.
Ich habe mir für einen Speicherbereich folgende Klasse definiert:
[highlight=c#]
public class MemoryBlock:IEnumerable<AddressedByte>
{
private readonly int _startAddress;
private readonly Byte[] _bytes;
public MemoryBlock(int startAddress, byte[] bytes)
{
_startAddress = startAddress;
_bytes = bytes;
}
public byte this[int address]
{
get { return _bytes[GetArrayIndex(address)]; }
set { _bytes[GetArrayIndex(address)] = value; }
}
public MemoryBlock GetPart(int startAddress, int length)
{
var bytes = from addressedByte in this
where addressedByte.Address > startAddress - 1 && addressedByte.Address < startAddress + length
select addressedByte.Value;
return new MemoryBlock(startAddress,bytes.ToArray());
}
private int GetArrayIndex(int address)
{
return address - _startAddress;
}
#region Implementation of IEnumerable
public IEnumerator<AddressedByte> GetEnumerator()
{
return new MemoryBlockEnumerator(this);
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
#endregion
}
[/highlight]
[highlight=c#]
public class AddressedByte
{
public int Address { get; set; }
public byte Value { get; set; }
}
[/highlight]
Jetzt gibt aber der Array Zugriff über this [int address] etwas anderes zurück als der Enumerator. Allerdings stelle ichs mir für die Benützung praktischer vor. Ist das Inkonsequent?
Comment