Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
EVG-1980
190 / 197 / 82
Регистрация: 11.04.2013
Сообщений: 1,086
#1

Декларация структуры без NEW

25.02.2014, 15:26. Просмотров 1167. Ответов 13
Метки нет (Все метки)

C#
1
2
3
4
5
6
7
8
9
public struct parseLine
    {
        private string str;
        public string Str
        {
            get { return str; }
            set { str = value; }
        }
    }
C#
1
2
3
4
5
6
7
8
9
 class Program
    {
        static void Main(string[] args)
        {
            string str = "123";
            parseLine k1;
            k1.Str = str;
        }
    }
Использование локальной переменной "k1", которой не присвоено значение с какого перепуга?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.02.2014, 15:26
Ответы с готовыми решениями:

Получить структуры из DLL без промежуточного кода
Есть нативная длл. Для работы с длл необходимо написать программу на С# . ...

Методы изменения даты без использования структуры datetime
Здравствуйте. Пытаюсь реализовать методы изменения года,месяца и дня. Ввёл...

Запись структуры в файл - Как сделать так, чтобы в файл записывались только данные структуры?
Здравствуйте! using System.Runtime.Serialization.Formatters.Binary; ...

Моя декларация
Задекларировал вот так: Type TAudioTypes =...

БП: Декларация по ЕНВД
Бухгалтерия 2.0. Создается декларация по ЕНВД. В разделе 1 идет разбивка...

13
паха76
26 / 26 / 10
Регистрация: 22.12.2013
Сообщений: 153
25.02.2014, 15:30 #2
у меня код отработал
0
tezaurismosis
Администратор
Эксперт .NET
8480 / 3807 / 723
Регистрация: 17.04.2012
Сообщений: 8,505
Записей в блоге: 14
25.02.2014, 15:32 #3
Так ей и не присвоено значение, имя определено, память не выделена. Поля устанавливаются в свои значения по-умолчанию по вызову конструктора.
0
EVG-1980
190 / 197 / 82
Регистрация: 11.04.2013
Сообщений: 1,086
25.02.2014, 15:34  [ТС] #4
паха76, у меня в 10 студии не фига не компилируется , выдает ошибку

если делать так то все нормально отрабатывает
C#
1
parseLine k = new parseLine();
в чем может быть косяк?
0
tezaurismosis
Администратор
Эксперт .NET
8480 / 3807 / 723
Регистрация: 17.04.2012
Сообщений: 8,505
Записей в блоге: 14
25.02.2014, 15:34 #5
Цитата Сообщение от паха76 Посмотреть сообщение
у меня код отработал
У меня нет. Ошибка та же.

Добавлено через 29 секунд
Цитата Сообщение от EVG-1980 Посмотреть сообщение
в чем может быть косяк?
Вы пост выше читали?
0
EVG-1980
190 / 197 / 82
Регистрация: 11.04.2013
Сообщений: 1,086
25.02.2014, 15:35  [ТС] #6
tezaurismosis,

уникальная возможность структур создание объектов без использования оператора new.

http://msdn.microsoft.com/ru-ru/library/0taef578.aspx

Она сама по умолчанию должна выставить нули у полей
0
tezaurismosis
Администратор
Эксперт .NET
8480 / 3807 / 723
Регистрация: 17.04.2012
Сообщений: 8,505
Записей в блоге: 14
25.02.2014, 15:38 #7
Лучший ответ Сообщение было отмечено tezaurismosis как решение

Решение

Из вашего источника
При создании объекта структуры с помощью оператора new объект создается и вызывается соответствующий конструктор. В отличие от классов структуры можно создавать без использования оператора new. В таком случае вызов конструктора отсутствует, что делает выделение более эффективным. Однако поля остаются без значений и объект нельзя использовать до инициализации всех полей.
1
паха76
26 / 26 / 10
Регистрация: 22.12.2013
Сообщений: 153
25.02.2014, 15:40 #8
У меня восьмая студия
В отличие то классов, структуры могут быть созданы без использования нового оператора.
http://msdn.microsoft.com/ru-ru/library/saxz13w4%28v=vs.90%29.aspx
И в где правда
а, сори, у меня только свойство в структуре
0
EVG-1980
190 / 197 / 82
Регистрация: 11.04.2013
Сообщений: 1,086
25.02.2014, 15:42  [ТС] #9
tezaurismosis,

C#
1
2
// Initialize:
k1.Str = str;
не?
0
паха76
26 / 26 / 10
Регистрация: 22.12.2013
Сообщений: 153
25.02.2014, 15:43 #10
не,
private string str
не инициализирован
0
EVG-1980
190 / 197 / 82
Регистрация: 11.04.2013
Сообщений: 1,086
25.02.2014, 15:48  [ТС] #11
Цитата Сообщение от паха76 Посмотреть сообщение
private string str не инициализирован
Дык он должен автоматом инициализироваться при k1.Str = str или я что то недопонимаю?

Как инициализировать приватные поля структуры?
0
tezaurismosis
Администратор
Эксперт .NET
8480 / 3807 / 723
Регистрация: 17.04.2012
Сообщений: 8,505
Записей в блоге: 14
25.02.2014, 15:48 #12
Лучший ответ Сообщение было отмечено tezaurismosis как решение

Решение

EVG-1980, благо что поле одно, а если несколько - инициализация последующего будет над недоинициализированным экземпляром. Под инициализацией я пониманию создание экземпляра путём вызова конструктора.
1
паха76
26 / 26 / 10
Регистрация: 22.12.2013
Сообщений: 153
25.02.2014, 15:49 #13
Лучший ответ Сообщение было отмечено tezaurismosis как решение

Решение

Декларация структуры без NEW
1
kolorotur
Эксперт .NET
10196 / 8555 / 2111
Регистрация: 17.09.2011
Сообщений: 14,691
Завершенные тесты: 1
25.02.2014, 16:43 #14
Лучший ответ Сообщение было отмечено tezaurismosis как решение

Решение

EVG-1980, стандарт языка требует, чтобы при инициализации структуры без вызова конструктора всем полям были присвоены значения, и это должно быть статически проверяемо на стадии компиляции.
В вашем примере происходит присвоение значения свойству, а не полю, что фактически является вызовом метода, то есть происходит использование структуры... а структурой нельзя пользоваться до присвоения всем полям значений.
Компилятор же не берется проверять, во всех ли случаях в сеттере свойства происходит присвоение полю и не происходит ли обращение к какому-нибудь другому, еще не проинициализированному, полю.

Примеры:
C#
1
2
3
4
struct Stubborn
{
   public int x;
}
C#
1
2
3
4
5
6
Stubborn k;
k.ToString(); // Нельзя, т.к. поле x не проинициализировано
 
Stubborn z;
z.x = 12;
z.ToString(); // OK
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct Stubborn
{
   public int x;
   public string y;
}
 
Stubborn k;
k.x = 2;
k.ToString(); // Еще нельзя, т.к. не всем полям присвоены значения
 
Stubborn z;
z.x = 3;
z.y = "Hello!";
k.ToString(); // OK
Подводя итог: инициализировать структуру без использования конструктора можно только в том случае, если все поля в ней открыты для прямого доступа из вызывающего объекта.
Ну или если инициализация памяти проведена через небезопасный контекст:
C#
1
2
3
4
5
6
7
8
9
10
11
struct Stubborn
{
   public int x;
}
 
Stubborn k;
 
int* ptr = (int*)&k;
*ptr = 120;
 
k.ToString(); // OK
Но на то он и небезопасный.
3
25.02.2014, 16:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.02.2014, 16:43

Декларация о НДС
Возникла такая проблема. Изменилась форма регламентированного отчёта Декларация...

Декларация типа
Нашёл в книге одну непонятную декларацию: fmap:: (a->b) -> f a -> f b Так...

декларация в классе
я хочу в класс добавить указатель на другой класс и получаю следующую ошибку:...


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

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

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