Функция или свойство?
От: Аноним  
Дата: 22.03.11 14:20
Оценка:
Есть некоторая структура для передачи данных

   [StructLayout(LayoutKind.Explicit)]
    public struct SomeStruct
    {
        [FieldOffset(0)]
        public byte v1;
        [FieldOffset(1)]
        public byte v2;
        [FieldOffset(2)]
        public float v3;
        ......
    }


Допустим некоторые поля типа byte имеют битовые флаги нескольких переменных.(т.е. например v1 содержит 8 переменных).

На помощь создается класс SomeStructHelper

    class SomeStructHelper
    {
        public static SomeStruct StructData
        {
            get
            {
                 SomeStruct returnStruct;
                 BitArray bit = new BitArray(new bool[] { Bit1, Bit2, Bit3, Bit4, Bit5, Bit6, Bit7, Bit8 });
                 Array array = Array.CreateInstance(typeof(byte), 1);
                 bit.CopyTo(array, 0);
                 returnStruct.v1 = (byte)array.GetValue(0);
                 ..............
            }
            set
            {
                BitArray bits = new BitArray(new byte[] { value.v1});
                Bit1 = bits.Get(0);
                Bit2 = bits.Get(1);
                ...........
            }
        }
        
        public static bool Bit1 { get; set; }                        
        public static bool Bit2 { get; set; }                        
        public static bool Bit3 { get; set; }                        
        .....................
    }


Вот вопрос: StructData лучше оставить свойством или желательно сделать два статических метода(Get и Set)?
Re: Функция или свойство?
От: Codechanger Россия  
Дата: 22.03.11 14:26
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть некоторая структура для передачи данных


А>
А>   [StructLayout(LayoutKind.Explicit)]
А>    public struct SomeStruct
А>    {
А>        [FieldOffset(0)]
А>        public byte v1;
А>        [FieldOffset(1)]
А>        public byte v2;
А>        [FieldOffset(2)]
А>        public float v3;
А>        ......
А>    }
А>


А>Допустим некоторые поля типа byte имеют битовые флаги нескольких переменных.(т.е. например v1 содержит 8 переменных).


А>На помощь создается класс SomeStructHelper


А>
А>    class SomeStructHelper
А>    {
А>        public static SomeStruct StructData
А>        {
А>            get
А>            {
А>                 SomeStruct returnStruct;
А>                 BitArray bit = new BitArray(new bool[] { Bit1, Bit2, Bit3, Bit4, Bit5, Bit6, Bit7, Bit8 });
А>                 Array array = Array.CreateInstance(typeof(byte), 1);
А>                 bit.CopyTo(array, 0);
А>                 returnStruct.v1 = (byte)array.GetValue(0);
А>                 ..............
А>            }
А>            set
А>            {
А>                BitArray bits = new BitArray(new byte[] { value.v1});
А>                Bit1 = bits.Get(0);
А>                Bit2 = bits.Get(1);
А>                ...........
А>            }
А>        }
        
А>        public static bool Bit1 { get; set; }                        
А>        public static bool Bit2 { get; set; }                        
А>        public static bool Bit3 { get; set; }                        
А>        .....................
А>    }
А>


А>Вот вопрос: StructData лучше оставить свойством или желательно сделать два статических метода(Get и Set)?



В данном случае лучше методы. При использовании свойств могут возникнуть некоторые, скажем так, иллюзии.
Re: Функция или свойство?
От: Kalina9001  
Дата: 22.03.11 14:29
Оценка:
Я бы из set сделал конструктор
... << RSDN@Home 1.2.0 alpha 5 rev. 1495>>
Re: Функция или свойство?
От: _FRED_ Черногория
Дата: 22.03.11 14:32
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Вот вопрос: StructData лучше оставить свойством или желательно сделать два статических метода(Get и Set)?


Choosing Between Properties and Methods

В данном случае (учитывая, что тип возвращаемого значения — структура) определяющим фактором я бы назвал

The operation is orders of magnitude slower than a field set would be.


Так ли это у вас? Тогда делайте метод. Если не ообо, то можно и свойство оставить.
Help will always be given at Hogwarts to those who ask for it.
Re: Функция или свойство?
От: hardcase Пират http://nemerle.org
Дата: 22.03.11 14:37
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Вот вопрос: StructData лучше оставить свойством или желательно сделать два статических метода(Get и Set)?


А зачем в данном случае для работы с битами использовать BitArray? Почему бы не сделать enum с флагами?
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: Функция или свойство?
От: Аноним  
Дата: 22.03.11 14:38
Оценка:
Здравствуйте, Codechanger, Вы писали:

C>Здравствуйте, Аноним, Вы писали:


А>>Вот вопрос: StructData лучше оставить свойством или желательно сделать два статических метода(Get и Set)?



C>В данном случае лучше методы. При использовании свойств могут возникнуть некоторые, скажем так, иллюзии.


Спасибо! Так и сделаю!
Re[2]: Функция или свойство?
От: Аноним  
Дата: 22.03.11 14:47
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Здравствуйте, Аноним, Вы писали:


H>А зачем в данном случае для работы с битами использовать BitArray? Почему бы не сделать enum с флагами?


Допустим у нас есть панель с тумблерами(состояние вкл. или выкл.) Тогда проще хранить в дном байте 8 тумблеров. Думаю в этом случае enum с флагами все усложнит. Ведь мы же должны на стороне графики считывать структуру и отображать состояния тумблеров, а на стороне логики записывать....
Re[3]: Функция или свойство?
От: _nn_  
Дата: 22.03.11 14:50
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, hardcase, Вы писали:


H>>Здравствуйте, Аноним, Вы писали:


H>>А зачем в данном случае для работы с битами использовать BitArray? Почему бы не сделать enum с флагами?


А>Допустим у нас есть панель с тумблерами(состояние вкл. или выкл.) Тогда проще хранить в дном байте 8 тумблеров. Думаю в этом случае enum с флагами все усложнит. Ведь мы же должны на стороне графики считывать структуру и отображать состояния тумблеров, а на стороне логики записывать....


Вы наверное не поняли.
Вам рекоммендуют System.FlagsAttribute.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: Функция или свойство?
От: Аноним  
Дата: 22.03.11 15:00
Оценка:
Здравствуйте, _nn_, Вы писали:

А>>Допустим у нас есть панель с тумблерами(состояние вкл. или выкл.) Тогда проще хранить в дном байте 8 тумблеров. Думаю в этом случае enum с флагами все усложнит. Ведь мы же должны на стороне графики считывать структуру и отображать состояния тумблеров, а на стороне логики записывать....


__>Вы наверное не поняли.

__>Вам рекоммендуют System.FlagsAttribute.

Не очень понял чем этот вариант удобнее для чтения и записи данных(на стороне графики и логике). Могли бы вы предложить реализацию enum для переменной типа byte в которой находятся 8 тумблеров?
PS: c FlagsAttribute я знаком
Re[5]: Функция или свойство?
От: Аноним  
Дата: 22.03.11 15:40
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, _nn_, Вы писали:


А>>>Допустим у нас есть панель с тумблерами(состояние вкл. или выкл.) Тогда проще хранить в дном байте 8 тумблеров. Думаю в этом случае enum с флагами все усложнит. Ведь мы же должны на стороне графики считывать структуру и отображать состояния тумблеров, а на стороне логики записывать....


__>>Вы наверное не поняли.

__>>Вам рекоммендуют System.FlagsAttribute.

А>Не очень понял чем этот вариант удобнее для чтения и записи данных(на стороне графики и логике). Могли бы вы предложить реализацию enum для переменной типа byte в которой находятся 8 тумблеров?

А>PS: c FlagsAttribute я знаком

Вы так перелагали?

        [FlagsAttribute] 
        enum Tumbler : byte
        {
            OFF = 0,
            ON_1 = 1,
            ON_2 = 2,
            ON_3 = 4,
            ON_4 = 8,
            ON_5 = 16,
            ON_6 = 32,
            ON_7 = 64,
            ON_8 = 128
        }


А разве удобнее будет проверять эти флаги для чтения и записи?(например нам нужно пройтись по всем тумблерам)
Re[6]: Функция или свойство?
От: hardcase Пират http://nemerle.org
Дата: 22.03.11 15:50
Оценка:
Здравствуйте, Аноним, Вы писали:


А>А разве удобнее будет проверять эти флаги для чтения и записи?(например нам нужно пройтись по всем тумблерам)


Свойства-то вы и так уже объявили, просто использование массива в этой задаче совсем не оправдано:
    [Flags]
    enum Bits : byte
    {
        Bit1 = 1,
        Bit2 = 2,
        Bit3 = 4,
        Bit4 = 8,
        Bit5 = 16,
        Bit6 = 32,
        Bit7 = 64,
        Bit8 = 128,
    }

    class BitsData
    {
        public Bits Value { get; set; }

        public bool Bit1
        {
            get { return Value.HasFlag(Bits.Bit1); }
            set { Value = value ? Value | Bits.Bit1 : Value & ~Bits.Bit1; }
        }

        public bool Bit2
        {
            get { return Value.HasFlag(Bits.Bit2); }
            set { Value = value ? Value | Bits.Bit2 : Value & ~Bits.Bit2; }
        }
    }
/* иЗвиНите зА неРовнЫй поЧерК */
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.