Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
4 / 4 / 1
Регистрация: 12.02.2013
Сообщений: 290
1

Почему в начале класса нельзя инициализировать переменную?

30.03.2013, 23:56. Показов 1286. Ответов 9
Метки нет (Все метки)

C#
1
2
3
4
    public partial class Winter : Form
    {
        List<string>[] list = new List<string>[3];
        list[0] = new List<string>();
Вот так работать не будет, но если написать инициализацию в конструкторе - работает нормально.
Как программа это понимает? Если навести курсор на
C#
1
list[0] = new List<string>()
- пишет: list is a field but it used like a type. Используется как тип это что значит?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.03.2013, 23:56
Ответы с готовыми решениями:

Почему (для чего?) нельзя инициализировать статик переменную внутри класса?
Привет. Почему (для чего?) нельзя инициализировать статик переменную внутри класса? И какие есть...

Почему нельзя инициализировать словарь таким образом?
Dictionary&lt;char, int&gt; d2 = new Dictionary&lt;char, int&gt;() {new KeyValuePair&lt;char, int&gt;('a', 1), ...

Конструктор класса не дает инициализировать переменную класса
Привет. Вот такой вот класс. Когда пытаюсь в конструкторе присвоить name и hobby что либо, пишет...

Почему нельзя использовать переменную из блока try/catch
Вечер добрый. import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser;...

9
710 / 677 / 126
Регистрация: 30.03.2012
Сообщений: 1,124
31.03.2013, 00:02 2
это означает, что класс содержит поля, свойства, методы
строка
C#
1
list[0] = new List<string>();
ничем из этого не является
если вам так хочется присвоить 0му элементу массива значение думаю вы сможете сделать это при помощи чего то вроде этого (не проверял, студии под рукой нет):
C#
1
List<string>[] list = new List<string>[] {new List<string>(), null, null};
Добавлено через 3 минуты
з.ы. а какая вам собственно разница будет ли это значение присвоено в конструкторе или так как вы написали? что от этого изменится?
0
-6 / 6 / 4
Регистрация: 23.05.2010
Сообщений: 133
31.03.2013, 00:08 3
Tessen верно написал)
как вариант можно создать статическую функцию и уже в ней инициализировать елементи списка
0
4 / 4 / 1
Регистрация: 12.02.2013
Сообщений: 290
31.03.2013, 04:44  [ТС] 4
Да мне ничего конкретного не нужно, просто интересно.
Поле это же какая-то переменная класса, как и list. Почему ругаеся начальник на него?
Компилятор не должен по идее ругаться.

C#
1
2
List<string>[] list = new List<string>[3];
list[0] = new List<string>();
Объявление поля - нормально
Присвоение - нет. Почему?
0
710 / 677 / 126
Регистрация: 30.03.2012
Сообщений: 1,124
31.03.2013, 05:17 5
потому что это не присвоение значения полю
присвоение это вот так
C#
1
List<string>[] list = new List<string>[3];
или так
C#
1
List<string>[] list = new List<string>[] {new List<string>(), null, null};
а вот это:
C#
1
list[0] = new List<string>();
это инструкция что с этим полем делать
а в какой момент ее выполнять? до или после присвоения значения полю?
а если вы ее два раза напишете?
а если вы за пределы кол-ва элементов листа вышли?

существуют конструкторы, не надо перетаскивать в объявление поля логику которая должна быть в конструкторе
вам нужно присвоить значение по умолчанию - ок, это можно (пример выше)

а если сделать как вы хотите то будет возможность написать скажем подобное:

C#
1
2
Random r=new Random();
list[0]=r.Next(10)>5?new List<string>(10):new List<string>(5);
все еще нормально?
а так?
C#
1
2
Random r=new Random();
list[0]=r.Next(10)>5?new List<string>(10):new List<string>(Enumerable.Range(10).Select(x=>r.Next).ToList());;
подобная логика должна находиться в конструкторе, чтобы не было необходимости искать ее по всему классу
самое простенькое присвоение - ради бога, инициализатор коллекций это позволяет
хотите сложнее - добро пожаловать в конструктор
1
Заблокирован
31.03.2013, 09:34 6
Цитата Сообщение от GuitarFan Посмотреть сообщение
C#
1
2
3
4
    public partial class Winter : Form
    {
        List<string>[] list = new List<string>[3];
        list[0] = new List<string>();
Вот так работать не будет, но если написать инициализацию в конструкторе - работает нормально.
Как программа это понимает? Если навести курсор на
C#
1
list[0] = new List<string>()
- пишет: list is a field but it used like a type. Используется как тип это что значит?
1 Заменить vs на русскую
2 Везде, где есть метод Add можно писать инициализатор {} со значениями добавляемыми через Add (соглашение).
C#
1
 List<string> str = new List<string> {"One","Two","Three" };
3 Создавать и инициализировать переменную можно только сразу.
4 Научиться пользоваться ресурсами интернета.
1
Эксперт .NET
15314 / 11608 / 3044
Регистрация: 17.09.2011
Сообщений: 19,430
31.03.2013, 11:25 7
Цитата Сообщение от Urety Посмотреть сообщение
2 Везде, где есть метод Add можно писать инициализатор {} со значениями добавляемыми через Add (соглашение).
Небольшое дополнение: класс для этого должен реализовать IEnumerable.
0
4 / 4 / 1
Регистрация: 12.02.2013
Сообщений: 290
31.03.2013, 15:54  [ТС] 8
это инструкция что с этим полем делать
Называйте как хотите, это присвоение значения.
а в какой момент ее выполнять? до или после присвоения значения полю?
По порядку обычно выполняется.
а если вы ее два раза напишете?
По логике, так же - по порядку.
а если вы за пределы кол-ва элементов листа вышли?
Ошибка

Ответа внятного я так и не получил.
Я не понял, почему присвоение не работает в одном месте, а работает в конструкторе.
Что за это отвечает? Должен же быть какой-то механизм конкретный.
0
307 / 305 / 125
Регистрация: 29.01.2013
Сообщений: 638
Записей в блоге: 1
31.03.2013, 16:45 9
Ну существуют же правила написания класса, где четко описано, как может быть задано поле, вот компилятор и требует от Вас, чтобы Вы начинали строку с имени типа, раз уж зарезервированных модификаторов не встретил.
1
Эксперт .NET
15314 / 11608 / 3044
Регистрация: 17.09.2011
Сообщений: 19,430
31.03.2013, 17:26 10
Цитата Сообщение от GuitarFan Посмотреть сообщение
Я не понял, почему присвоение не работает в одном месте, а работает в конструкторе.
Потому что инструкции могут выполняться только в методах.
Класс — это не метод.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.03.2013, 17:26

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Почему выдает ошибку, что нельзя использовать переменную y1?
Почему выдает ошибку, что нельзя использовать переменную y1? Если заменить переменную y1 на любую...

Почему лучше инициализировать объекты класса во время инициализации конструктора?
Имеется класс Rnd: class Rnd { public: Rnd::Rnd(int x); private: int val; };

Почему нельзя объявить в описание класса статический double?
Ближе к делу :) class SuperClass { public: SuperClass() {} static const int A = 0;...

Почему нельзя присвоить переменным a, b, c, d значения тексбоксов внутри класса
Почему нельзя присвоить переменным a,b,c,d значения тексбоксов внутри класса? public class...


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

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

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