Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
Австрал
79 / 57 / 7
Регистрация: 16.12.2013
Сообщений: 175
#1

Что это было? public Foo MyFoo { get; set; } // в не абстрактном классе, не абстрактное - C#

25.01.2014, 10:19. Просмотров 1936. Ответов 45
Метки нет (Все метки)

Вобщем, жили мы долго и счастливо, сначала на С++ потом на С#, но на С# писали код имея в виду, что, может, он пригодится в старых проектах на С++, т.е. консервативно. Типы переменных все объявляли явно, LINQ только там где он вправду нужен.

И вот является товарищ из Ирана с опытом на JS и давай писать везде var. Ну, думаю, ладно, пианист играет как умеет, а этот код, вроде, на С++ никогда не надо будет переводить.

А вчера гляжу его код и вижу такую, блин, конструкцию...

C#
1
2
3
4
5
6
class A{
  public List<TypeBar> Bar{ get; set; }
 
// тут нет конструктора, то есть, все равно, что есть конструктор public A(){}
 
}
Класс не абстрактный, член не абстрактный. А компилятор это спокойно ест.
Дальше еще хуже...

В коде, который пользует этот класс:

C#
1
2
3
4
5
...
var bar = GetBar(); // Эта функция возвращает значение типа List<TypeBar> - все честно
...
// А дальше тихий ужас
var a = new A { Bar = bar; }
Че это за фигня? Компилятор создает в полете новый конструктор, который еще и видит местные переменные? Че делать? Ну, или:

C#
1
2
3
4
5
6
7
8
9
class A{
public TypeBar Bar;
}
 
// И
class A {
public TypeBar Bar { get; set; } 
// Это одно и то же или нет??? Компилятор одинаковый код генерирует, или нет???
}
Заранее спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.01.2014, 10:19
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Что это было? public Foo MyFoo { get; set; } // в не абстрактном классе, не абстрактное (C#):

Клонирование в абстрактном классе - C#
Есть абстрактный класс с полями и методом клон, и два потомка со своими полями. Я хочу чтобы поля абстрактного класса клонировались в...

Константа в абстрактном классе - C#
Добрый день! Может быть кто знает, есть ли метод, которым можно гарантировать, что константа, описанная в абстрактном классе или...

Интерфейс в абстрактном классе - C#
Есть у меня абстрактный класс Figure, от которого наследуются Circle, Romb, Triangle и т.д. Я хочу, чтобы все производные классы...

.NET 4.x Передача параметра в абстрактном классе - C#
В задании нужно написать абстрактный класс n-мерный вектор. Суть в том, что я не знаю, как указать этот параметр в классе. Сначала сделал...

Массив структур в абстрактном классе - C#
Объясните пожалуйста на пальцах, почему возникает ошибка namespace ConsoleApplication3 { public struct _Information { ...

Поля в абстрактном классе и наследниках - C#
Подскажите пожалуйста. Почему Age одно на двоих, можно ли сделать чтобы у каждого было свое(но при этом наследовалоась, а не прописывалось...

45
Psilon
Master of Orion
Эксперт .NET
5935 / 4834 / 636
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 5
Завершенные тесты: 4
31.01.2014, 22:10 #31
pycture, нагуглил нубский вопрос за моим же авторством (как и полно других тем, можете если интереса по возрастанию дат запустить, позорище ) : Зачем нужны автосвойства?
2
Grishaco
435 / 359 / 48
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
31.01.2014, 22:12 #32
Цитата Сообщение от pycture Посмотреть сообщение
Grishaco, я сейчас не вспомню где на это нарвался. Но надеюсь вы не станете отрицать, что для специфичных задач никто не обязывает (особенно самописный) сериализатор сохранять и поля, и свойства?
Да нет я особо то и не отрицаю, но сообщение Jupiter заставило проверить, и оказалось, что XML сериализация работает и с полями (всегда пользовался только свойствами).
0
pycture
1168 / 557 / 71
Регистрация: 20.09.2012
Сообщений: 1,811
Завершенные тесты: 3
31.01.2014, 22:14 #33
Цитата Сообщение от Jupiter Посмотреть сообщение
это следствие, а не причина появления их в языке
Причем тут причина и следствие. Разница между свойством и полем в языке есть? Есть. Разница между GetField(String) и GetProperty(String) есть? Есть. Остальное вторично.
0
Grishaco
435 / 359 / 48
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
31.01.2014, 22:15 #34
Если честно для меня разница только в возможности использования интерфейса INotifyPropertyChanged, в остальном же не вижу разницы.
0
Psilon
Master of Orion
Эксперт .NET
5935 / 4834 / 636
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 5
Завершенные тесты: 4
31.01.2014, 22:22 #35
Grishaco, сериализация отвечает в том числе за corrupted state (по крайней мере та, которая реально используется во всяких WCF, обычныый XmlSerializer трогает только открытые члены, но и поля, и свойства, ЧСХ) и не имеет права его допускать, поэтому сериализуются вообще все свойства. Поэтому список из двух элементов будет сериализован в виде 1 2 0 0, что нетрудно получить с помощью такого кода:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        static void Main(string[] args)
        {
            var list = new List<int>();
            list.Add(1);
            list.Add(2);
 
            var serializer = new NetDataContractSerializer();
            var sb = new StringBuilder();
            using (var writer = XmlWriter.Create(sb))
            {
                serializer.WriteObject(writer, list);
                writer.Flush();
                File.WriteAllText("D:\\test.xml", sb.ToString());
            }
        }
Добавлено через 46 секунд
Grishaco, посмотрите ссылку выше, я скидывал, мне в свое время хорошо объяснили (на последней странице).
0
Grishaco
435 / 359 / 48
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
31.01.2014, 22:24 #36
Цитата Сообщение от Psilon Посмотреть сообщение
Поэтому список из двух элементов будет сериализован в виде 1 2 0 0, что нетрудно получить с помощью такого кода:
Стоп, стоп, не совсем понял, ведь вот этот код сделает xml вида 1 2, при чем здесь еще 2 нуля?

C#
1
2
3
4
5
6
7
8
9
10
11
12
            var list = new List<int>(2);
            list.Add(1);
            list.Add(2);
 
            var serializer = new NetDataContractSerializer();
            var sb = new StringBuilder();
            using (var writer = XmlWriter.Create(sb))
            {
                serializer.WriteObject(writer, list);
                writer.Flush();
                File.WriteAllText("test.xml", sb.ToString());
            }
Я так понимаю что при создании листа память выделяется блоками по 4 элемента и по этому мы получаем 1 2 0 0. Или нет?
0
Psilon
Master of Orion
Эксперт .NET
5935 / 4834 / 636
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 5
Завершенные тесты: 4
31.01.2014, 22:31 #37
Grishaco, да, потому что если посмотреть на декомпилированный List, то:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
  [DebuggerDisplay("Count = {Count}")]
  [DebuggerTypeProxy(typeof (Mscorlib_CollectionDebugView<>))]
  [__DynamicallyInvokable]
  [Serializable]
  public class List<T> : IList<T>, ICollection<T>, IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>, IEnumerable<T>, IEnumerable
  {
    private static readonly T[] _emptyArray = new T[0];
    private T[] _items;
    private int _size;
    private int _version;
    [NonSerialized]
    private object _syncRoot;
    private const int _defaultCapacity = 4;
то есть по-умолчанию во внутреннем представлении имеем 3 приватных поля: _items, _size и _version, которые он и сериализовал. А число элементов как-раз коррелирует с константой _defaultCapacity

Добавлено через 2 минуты
Я так понимаю что при создании листа память выделяется блоками по 4 элемента и по этому мы получаем 1 2 0 0. Или нет?
нет, неправильно, число элементов удваивается, иначе при добавлении 10к элементов мы имели бы 10к/4 = 2500 аллокаций, а с удвоением - всего лишь 15
0
Grishaco
435 / 359 / 48
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
31.01.2014, 22:34 #38
Цитата Сообщение от Psilon Посмотреть сообщение
_items, _size и _version, которые он и сериализовал.
Вы хотите сказать, что в сериализаторе есть привязка к этим полям? Я думаю, что для каждого поля есть свое свойство (Нет возможности посмотреть весь код листа).

Цитата Сообщение от Psilon Посмотреть сообщение
нет, неправильно, число элементов удваивается, иначе при добавлении 10к элементов мы имели бы 10к/4 = 2500 аллокаций, а с удвоением - всего лишь 15
Я имел ввиду, что если в листе есть 8 элементов, то при добавлении 9 го он будет расширен еще на 4, т.е. до 12
0
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
31.01.2014, 22:38 #39
Цитата Сообщение от pycture Посмотреть сообщение
Причем тут причина и следствие. Разница между свойством и полем в языке есть? Есть. Разница между GetField(String) и GetProperty(String) есть? Есть. Остальное вторично.
притом что ваш ответ "сериализация" на вопрос "почему использованы свойства, а не поля?" не верный
0
Psilon
Master of Orion
Эксперт .NET
5935 / 4834 / 636
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 5
Завершенные тесты: 4
31.01.2014, 23:41 #40
Grishaco, еще раз: удвоение места. То есть при добавлении 9гоэ лемента будет расширен до 16ти, иначе при 1кк элементов было бы 1кк/4= 250к аллокаций памяти, что убило бы производительность в ноль, а так имеем log(1kk) = 20 аллокаций.

Вы хотите сказать, что в сериализаторе есть привязка к этим полям? Я думаю, что для каждого поля есть свое свойство (Нет возможности посмотреть весь код листа).
посмотрите сами, при сериализации он сериализовал в элементы с key и value соответствующими. Достаточно посмотреть, что поля одноименны с соответствующими значениями в xml файле.
0
Grishaco
435 / 359 / 48
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
31.01.2014, 23:54 #41
Цитата Сообщение от Psilon Посмотреть сообщение
Grishaco, еще раз: удвоение места. То есть при добавлении 9гоэ лемента будет расширен до 16ти, иначе при 1кк элементов было бы 1кк/4= 250к аллокаций памяти, что убило бы производительность в ноль, а так имеем log(1kk) = 20 аллокаций.
Ваша правда.

Цитата Сообщение от Psilon Посмотреть сообщение
посмотрите сами, при сериализации он сериализовал в элементы с key и value соответствующими. Достаточно посмотреть, что поля одноименны с соответствующими значениями в xml файле.
На сколько я знаю, приватные поля не сериализуются в XML. Совпадение имен еще ни о чем не говорит. Ну если это только не ветка if в сериализаторе для листа от microsoft.
0
Psilon
Master of Orion
Эксперт .NET
5935 / 4834 / 636
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 5
Завершенные тесты: 4
01.02.2014, 00:36 #42
Grishaco, еще раз. Вы видите, во что сериализовался List. После этого как-то его нужно десериализовать. Вопрос: какие именно поля list'а будут восстанавливаться по этому файлу, ваши альтернативы?
0
Grishaco
435 / 359 / 48
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
01.02.2014, 00:58 #43
Psilon, ваша правда, вопрос только в том, что все описанное вами верно только в рамках NET, в любом другом случае (я имею в виду обмен данными с другими системами), не возможно использовать NetDataContractSerializer, а приходится использовать XmlSerializer, который в свою очередь, не только не сериализует коллекции, но и внутренние поля.
0
Psilon
Master of Orion
Эксперт .NET
5935 / 4834 / 636
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 5
Завершенные тесты: 4
01.02.2014, 01:19 #44
Grishaco, .Net работает исключительно с .Net, за исключением С\С++, где он работает с сырыми структурами данных, со структурами (извиняюсь за тавтология). Другие среды и соглашения не слишком интересуют. Все-таки основным межсетевым соглашением в .Net является WCF, от него и танцуем.

В заключение: свойства принципиально отличаются от полей тем, что свойства - это пара методов, когда как поля - это просто поля.
0
Wolfdp
688 / 681 / 106
Регистрация: 15.06.2012
Сообщений: 2,651
Записей в блоге: 1
Завершенные тесты: 1
03.02.2014, 13:09 #45
Столько текста, и никто не упомянул, что интерфейсы могут иметь свойства, но не могу иметь поля?
0
03.02.2014, 13:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.02.2014, 13:09
Привет! Вот еще темы с ответами:

Как организовать индексатор в абстрактном классе? - C#
1. Есть абстрактный класс сущности Entity.cs public abstract class Entity { protected Entity() { ...

Метод с модификатором override в абстрактном классе - C#
проблема с override,студия 10 ругается. abstract class A{ public void output(){} } class B:A{ public override void...

Get и set: что это - C#
Сабж в названии ) Для чего эти два ключевых слова и что они означают ?

В абстрактном классе Товар реализовать метод CompareTo - C#
Здравствуйте уважаемые программисты, если вам не сложно сделайте пожалуйста задачку. В абстрактном классе Товар реализовать метод...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
45
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru