2016-01-17 3 views
2

В программе, которую я пишу, у меня есть класс, в котором есть открытый массив байтов, который я хочу получить и использовать.Доступ к общедоступному массиву 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 
} 

В настоящее время массив I доступ через theInstance.theByteArray это все 0 по какой-то причине, что я хотел бы знать.

Спасибо.

+1

Это плохая практика, чтобы объявить член класса общедоступных, лучше инкапсулировать его как свойство с Get/Set согласно к вашим потребностям. Что касается вашей проблемы, работает ли конструктор так, как должен? Вы пытались его отладить? –

+0

@FelixAv Мне еще предстоит узнать о get/set, но я рассмотрю это. Конструктор работает, и в фактическом коде есть больше публичных переменных, к которым я могу получить доступ, и они сохраняют свои значения. Это просто проблема с массивом. – RuvenS

+0

Вы уверены, что разместили правильный код; Ваш код не будет компилироваться, так как 'theInstance' инициализируется нестационарным' адресом'. Может быть, WantsByte - это метод, а не класс? – jHilscher

ответ

1

В ваш класс WantsByte вы пытаетесь инициализировать элемент theInstance через другого нестатического элемента address, а компилятор должен быть жалован на Error 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 
+0

Я что-то пропустил? Его код совершенно корректен с точки зрения статического/нестатического. Он работает с локальными переменными. 'Адрес IPAddress = IPAddress.Parse (" 192.168.1.1 "); HasByte theInstance = new HasByte (адрес); 'не будет вызывать ошибку предупреждения/компилятора – Rob

+0

Глядя на класс' WantsByte', я вижу, что как переменные 'address', так и' theInstance' не являются локальными переменными, а полями классов. Они оба нестатические, и компилятор действительно выдает ошибку. _Инициализатор поля не может ссылаться на нестатическое поле, метод или свойство «WantsByte.address'_» в строке, которая инициализирует «theInstance». –

+0

Вы абсолютно правы - у меня был мозговой пердит; Я читаю 'WantsByte' как метод – Rob

2

Кроме того, что я сказал о инкапсулировании в комментариях, вот код, который должен работать для вас, обратите внимание, что вы не можете инициализировать theInstance при объявлении, поэтому вы переместите его в конструктор:

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 
    } 
+0

Я попытался запустить код, который я опубликовал, и он отлично работает, поэтому у вас не должно быть никаких проблем с ним, если вы сообщите нам об этом –

+0

Ваш код работает, кажется, что ошибка - это что-то еще. Я буду продолжать смотреть. Спасибо, кстати. – RuvenS

Смежные вопросы