Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.09.2016, 05:15   #71
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
а почему на втором скрине две ссылки на Data? O_o
В смысле ?
Вот ещё один скрин, с контрольными значениями. Функция после трассировки (F10) дала true (прописывал вычисление ещё раз).
Так же вложил два архива с двумя exe в каждом (Debug и Release). В одном архиве есть getter-setter, во втором - нет.
Ща отлажусь по последним указаниям.
Изображения
Тип файла: jpg toSet.jpg (67.8 Кб, 143 просмотров)
Вложения
Тип файла: zip bin.zip (10.3 Кб, 14 просмотров)
Тип файла: zip bin_(getter-setter).zip (10.3 Кб, 13 просмотров)
Подпись ? Не, не слышал ...

Последний раз редактировалось OmegaBerkut; 15.09.2016 в 05:17.
OmegaBerkut вне форума Ответить с цитированием
Старый 15.09.2016, 05:25   #72
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Закрытие студии, удаление папок (obj && bin), и отладка по новой дала те же результаты.
Ладно. Мне попытались объяснить, что я говно, а в результате всё обернулось багом, и тем, что я оказался прав ... Переустанавливать студию / ставить другую редакцию не собираюсь - это уже долго.
Как вариант, можно перезапустить компьютер / переустановить систему / купить новый компьютер / переехать в другу страну. И так далее по нарастающей ... Если это баг, то пускай будет баг. Меня и такой расклад устраивает.

Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
У меня такое ощущение, что меня где то на***ли.
Так вот где ...
Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
у нас не копия массива
Согласно результату функции
Код:
object.ReferenceEquals(data,value)
Таки копия
Во всяком случае, я понял, что вы хотели мне объяснить - после возврата ссылки на массив нет необходимости перезаписывать эту же ссылку на этот же массив, но у меня почему то ссылка уже на другой массив. И, как уже было написано мною
Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
Я просто "гну свою точку зрения", потому что отлаживался в таких ситуациях
Подпись ? Не, не слышал ...

Последний раз редактировалось OmegaBerkut; 15.09.2016 в 06:39.
OmegaBerkut вне форума Ответить с цитированием
Старый 15.09.2016, 10:14   #73
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

если бы это поведение удалось повторить, вопросов бы не возникло.
но мало-того что его не удалось повторить ни на одном компиляторе C#(CSC разных версий, Mono, Roslyn), так он еще и логику нарушает.
я могу дать доступ к своей машине, если не верите.(последняя лицензионная студия)

в вашем getter-setter
Код:
.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Размер кода:       33 (0x21)
  .maxstack  3
  .locals init (class TestProperties.PropertiesTest V_0)
  IL_0000:  newobj     instance void TestProperties.PropertiesTest::.ctor()
  IL_0005:  stloc.0
  IL_0006:  ldloc.0
  IL_0007:  callvirt   instance uint8[] TestProperties.PropertiesTest::get_Data()
  IL_000c:  ldc.i4.5
  IL_000d:  ldc.i4.s   10
  IL_000f:  stelem.i1
  IL_0010:  ldstr      "setter"
  IL_0015:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_001a:  call       string [mscorlib]System.Console::ReadLine()
  IL_001f:  pop
  IL_0020:  ret
} // end of method Program::Main
код метода Main почему-то таков.(IL_0015 - это не нормально)
причем в сеттере вывода на консоль нет.

либо это чья-то дурацкая шутка, либо у вас реальные проблемы со студией.

как я говорил, уберите сеттер вообще, код работать не перестанет.
Цитата:
В смысле ?
в том что в коде, студия показала две ссылки на член Data, хотя должно было быть одна.
CodeInsight не успел обновить код?
Изображения
Тип файла: jpg toSet_nb.jpg (14.6 Кб, 42 просмотров)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 15.09.2016 в 10:24.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.09.2016, 11:56   #74
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Пепел Феникса
На счёт "верю не верю" я уже сказал: меня устраивает такой расклад, при котором у меня проблемы, которые, собственно, не зависят от меня. И я так же писал, что ваш посыл мне ясен. Но конкретно в моём случае я прав: именно поэтому я ищу красивый способ сделать так, что бы мне приносили книжку с полки, а не саму полку (в данном случае - её самостоятельную копию).
На счёт ссылок - понятия не имею; никогда не пользовался этой фичой (и не обращал на неё внимания). Иногда она даже мешала. По возможности перепроверю - возможно, что это просто я игрался доступами к самому свойству, и ваше предположение верно.
Подпись ? Не, не слышал ...

Последний раз редактировалось OmegaBerkut; 15.09.2016 в 12:06.
OmegaBerkut вне форума Ответить с цитированием
Старый 15.09.2016, 12:03   #75
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

как я говорил, удалите сеттер вообще, код работать не перестанет.
Код:
    class Program
    {
        static void Main(string[] args)
        {
            PropertiesTest testing = new PropertiesTest();
            testing.Data[5] = 10;
            Console.ReadLine();
        }
    }
    class PropertiesTest
    {
        public PropertiesTest()
        {
            data = new byte[10];
            for (int i = 0; i < 10; i++)
                data[i] = (byte)(i + 1);
        }
        private byte[] data;
        public byte[] Data
        {
            get
            {
                Console.WriteLine("getter");
                return data;
            }
        }
    }
потому что не должно быть обратного присвоения by-design в принципе.
так же как его нет тут:
Код:
        static void Main(string[] args)
        {
            PropertiesTest testing = new PropertiesTest();
            var data=testing.Data;
            data[5]=10;
            Console.ReadLine();
        }
(код равнозначен если что)



я бы на вашем месте не спускал такое, ибо если у вас из кода
Код:
using System;

namespace TestProperties
{
    class Program
    {
        static void Main(string[] args)
        {
            PropertiesTest testing = new PropertiesTest();
            testing.Data[5] = 10;
            Console.ReadLine();
        }
    }
    class PropertiesTest
    {
        public PropertiesTest()
        {
            data = new byte[10];
            for (int i = 0; i < 10; i++)
                data[i] = (byte)(i + 1);
        }
        private byte[] data;
        public byte[] Data
        {
            set
            {
                Console.WriteLine("setter");
                data = value;
            }
            get
            {
                Console.WriteLine("getter");
                return data;
            }
        }
    }
}
Код:
.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Размер кода:       33 (0x21)
  .maxstack  3
  .locals init (class TestProperties.PropertiesTest V_0)
  IL_0000:  newobj     instance void TestProperties.PropertiesTest::.ctor()
  IL_0005:  stloc.0
  IL_0006:  ldloc.0
  IL_0007:  callvirt   instance uint8[] TestProperties.PropertiesTest::get_Data()
  IL_000c:  ldc.i4.5
  IL_000d:  ldc.i4.s   10
  IL_000f:  stelem.i1
  IL_0010:  ldstr      "setter"
  IL_0015:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_001a:  call       string [mscorlib]System.Console::ReadLine()
  IL_001f:  pop
  IL_0020:  ret
} // end of method Program::Main
сгенерировалось это
что в шарп обратно переводится как
Код:
        static void Main(string[] args)
        {
            PropertiesTest testing = new PropertiesTest();
            testing.Data[5] = 10;
            Console.WriteLine("setter");
            Console.ReadLine();
        }
то явно что-то не чисто, вам не кажется?

тут дело не в верю, не верю.
а в том что при таком подходе кодо-генератора работать нельзя.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.09.2016, 12:08   #76
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ну или если вы утверждаете что с создания проекта все работает так, то снимите видео(от создания нового проекта).
и отправьте в МС, потому что это явный баг.
особенно то что у вас вызвался private set.(тут и инкапсуляции капец)
Цитата:
По возможности перепроверю - возможно, что это просто я игрался доступами к самому свойству, и ваше предположение верно
маленький нюанс, если она показала такое во время отладки, значит было изменение файла.
CodeLens кстати, а не Code insight.
перепутал фичи.

и кстати, версия студии у вас куплена?


еще есть вариант что вы меняли файл извне, вы как-то говорили в одной из тем что этим иногда занимаетесь.
не просто же вы так открыли папку с проектом(где лежит cs файл, exe там не лежат)

Цитата:
Но конкретно в моём случае я прав
в конкретном вашем случае кодогенератор сгенерировал код, которого нет.
это как вместо 2+2==4, он поставит 3+3==4.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 15.09.2016 в 12:25.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.09.2016, 12:35   #77
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Пепел Феникса
В папку с проектом я сохранял скрины, проще работать с путями - Ctrl+C/Ctrl+V, ибо у меня браузер не запоминает директорию из последней загрузки.
И это не та папка, в которой лежат cs файлы; папка, о которой вы говорите - следующая в той папке, которая у меня открыта (названия одинаковы). И я не редактирую файлы из-вне студии, если открыт проект в студии.
Лицензия халявная студенческая. Версия 2013 Ultimate.
На счёт ссылок - не знаю. Я кстати вспомнил: счётчики этих ссылок у меня показывали ахинею (когда писал на C++ MFC/CLI); и если нажать на ссылку, счётчик которой показывает больше чем есть на самом деле - студия падала полностью. Поэтому я забил на эту фичу.

Говорите, убрать сеттер ? Вот, как этот код работает.
Изображения
Тип файла: jpg toSet.jpg (58.9 Кб, 128 просмотров)
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 15.09.2016, 12:42   #78
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Итог: это не у меня проблемы восприятия информации, это проблемы подачи этой информации. И я не отрицаю, что у меня есть проблемы, но часто эти проблемы зависят не от меня.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 15.09.2016, 12:46   #79
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

почему-то у меня работает отлично.



вообще я бы вам советовал обновится до 2015(можно взять Community, она бесплатна)
как я говорил в постах 73 и 75, в такой студии работать нельзя.
у вас генерируется не тот код что написан, это не нормально.
Цитата:
Итог: это не у меня проблемы восприятия информации, это проблемы подачи этой информации. И я не отрицаю, что у меня есть проблемы, но часто эти проблемы зависят не от меня.
итого, у вас баг кодогенератора, а вы вместо того чтоб избавится от него, строите костыли вокруг него.

вы уж простите, но багонутый кодогенератор, тут обсуждать не вижу смысла, как и не вижу смысла писать код под него.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 15.09.2016 в 12:48.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.09.2016, 13:51   #80
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Пепел Феникса
Ну в прочем это всё ладно. Теперь вернусь к своему первому указанию фразы "так правильнее":
Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
но куда правильнее было бы вытащить элемент из private массива не возвращая весь массив
Сейчас говорю с поправкой: не возвращая ссылку на массив. Всё же в моём понимании это было бы "правильнее", и вы сказали, что "инкапсуляция - это хорошо, но и перегибать не стоит" - частично согласен.
Но: если говорить аналогиями - то вариант с книжной полкой был уместен, но не конкретизирован. Сейчас я придумал две аналогии, касающиеся конкретно программирования:
1) базы данных: когда программа формирует SQL-запрос - в ответе она (программа) получает уже готовый обработанный результат, а не "ссылку на базу/таблицу"
2) DNS сервер: когда браузер обращается в интернеты с адресной строкой - DNS-сервер не возвращает перечень всех известных ему (DNS-серверу) доменных имён (IP-адресов), и не даёт доступ к собственному хранилищу адресов; DNS-сервер ищет соответствие в таблице IP-адресов с полученной строкой; что он (DNS-сервер) делает с найденным IP - я уже не знаю (либо возвращает браузеру, либо обращается на запрашиваемый браузером сервер, таким образом выступая ключевым промежуточным узлом).

Так же само и здесь: я запрашиваю конечный элемент по индексу, а не ссылку на массив; а это значит, что в связке запрос -> ссылка -> значение часть ссылка (по логике вещей) является лишней. Понятное дело, что всё равно придётся работать со ссылкой, но работать с этой ссылкой "правильнее" там, куда поступил запрос.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Wordpress, как создавать отдельные рубрики для страниц? AlienNation WordPress и другие CMS 0 09.10.2012 11:42
Именованные таблицы DiemonStar Microsoft Office Excel 4 02.10.2012 18:02
Операции класса, индексаторы Rectangle 6666 Общие вопросы .NET 4 08.05.2012 11:31
Именованные ячейки Foxx Microsoft Office Excel 1 20.02.2012 00:33
Как в Delphi создавать и использовать скины для програм SeRhy Помощь студентам 3 20.12.2007 20:59