Доступ к общедоступному массиву byte[] из другого класса
В программе, которую я пишу, у меня есть класс с открытым байтовым массивом, к которому я хочу получить доступ и использовать.
class HasByte
{
public byte[] theByteArray = new byte[4];
public HasByte(IPAddress someAddress)
{
theByteArray = someAddress.GetAddressBytes();
}
}
class WantsByte
{
IPAddress address = IPAddress.Parse("192.168.1.1");
HasByte theInstance = new HasByte(address);
//do something with theInstance.theByteArray[2] for example
}
В настоящее время байтовый массив, к которому я получаю доступ через theInstance.theByteArray, имеет все 0 по какой-то причине, которую я хотел бы знать.
Благодарю.
2 ответа
В вашем классе WantsByte
вы пытаетесь инициализировать член theInstance
через другой нестатический член address
и компилятор должен жаловаться с ошибкой CS0236. Вы можете двигаться theInstance
инициализация для конструктора:
class WantsByte
{
IPAddress address = IPAddress.Parse("192.168.1.1");
HasByte theInstance;
public WantsByte()
{
theInstance = new HasByte(this.address);
}
}
Демо-пример:
using System;
using System.Net;
using System.Linq;
public class Program
{
public static void Main()
{
var wants = new WantsByte();
}
}
class HasByte
{
public byte[] theByteArray = new byte[4];
public HasByte(IPAddress someAddress)
{
theByteArray = someAddress.GetAddressBytes();
}
}
class WantsByte
{
IPAddress address = IPAddress.Parse("192.168.1.1");
HasByte theInstance;
public WantsByte()
{
theInstance = new HasByte(this.address);
// do something with theInstance.theByteArray[2] for example
// Let's print all elements of the array
Console.WriteLine(String.Join(",", theInstance.theByteArray.Select(o => o.ToString()).ToArray()));
}
}
дает вывод:
192,168,1,1
Альтернативно, в классе WantsByte
, ты можешь сделать address
быть static
член, который будет гарантировать, что он будет инициализирован перед первым использованием класса. Вы можете ссылаться на это в theInstance
инициализатор:
using System;
using System.Net;
using System.Linq;
public class Program
{
public static void Main()
{
var wants = new WantsByte();
wants.DoSomethingWithHasByte();
}
}
class HasByte
{
public byte[] theByteArray = new byte[4];
public HasByte(IPAddress someAddress)
{
theByteArray = someAddress.GetAddressBytes();
}
}
class WantsByte
{
static IPAddress address = IPAddress.Parse("192.168.1.1");
HasByte theInstance = new HasByte(WantsByte.address);
public void DoSomethingWithHasByte()
{
Console.WriteLine(String.Join(",", theInstance.theByteArray.Select(o => o.ToString()).ToArray()));
}
}
также дает тот же результат:
192,168,1,1
Помимо того, что я сказал об инкапсуляции в комментарии, вот код, который должен работать для вас, обратите внимание, что вы не можете инициализировать экземпляр при объявлении, поэтому вы перемещаете его в конструктор:
public class HasByte
{
public byte[] theByteArray = new byte[4];
public HasByte(IPAddress someAddress)
{
theByteArray = someAddress.GetAddressBytes();
}
}
public class WantsByte
{
IPAddress address = IPAddress.Parse("192.168.1.1");
HasByte theInstance;
public WantsByte()
{
theInstance = new HasByte(address);
}
//do something with theInstance.theByteArray[2] for example
}