Доступ к общедоступному массиву 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
    }
Другие вопросы по тегам