Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.65/37: Рейтинг темы: голосов - 37, средняя оценка - 4.65
9 / 9 / 9
Регистрация: 19.09.2011
Сообщений: 272
1

const или static?

25.07.2012, 15:27. Показов 7685. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Предположим, что класс использует заранее известную строку, которую можно определить как "const". Каждый экземпляр этого класса будет использовать эту строку. Строка меняться не будет.
Вопрос следующий - const string vs static string.

static string создаст единственную копию нужной мне строки для всех объектов сразу.
а const string будет создаваться во время выполнения конструктора объектов класса, для каждого свой?

в плане поставленной выше задачи, статик стринг позволяет экономить память. Или компилятор оптимизирует конст поле? (искал...не нашёл)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.07.2012, 15:27
Ответы с готовыми решениями:

Static Util Class или Extensions?
Тема, конечно же, основана на личном опыте и возможно нет правильного ответа, но всё же... Сижу...

static const
объясните, пожалуйста, вот такую странную конструкцию (накопал в старой проге): после #include...

static и const
static void A(); Что дает этот статик? Что он вообще дает? int A() const; Что дает конст в...

static const?
если мне нужна константа в классе, как ее лучше объявить со static или без? разница будет только в...

12
199 / 199 / 78
Регистрация: 10.07.2012
Сообщений: 409
25.07.2012, 15:46 2
в C# реализован пул строк
так что объект для одинаковых строк будет один

Добавлено через 12 минут
C#
1
2
3
4
5
6
7
8
9
    class Program
    {
        static void Main(string[] args)
        {
            string s1 = "ab";
            string s2 = "a" + "b";
            Console.WriteLine(s1 == s2); // True
        }
    }
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
25.07.2012, 15:52 3
IcyWind, imo лучше статик. Хотя
0
Jupiter
25.07.2012, 16:02
  #4

Не по теме:

Цитата Сообщение от Psilon Посмотреть сообщение
imo лучше статик. Хотя
чем лучше, обоснуй?
Цитата Сообщение от IcyWind Посмотреть сообщение
а const string будет создаваться во время выполнения конструктора объектов класса, для каждого свой?
не нужно держать создателей и разработчиков языка за идиотов

0
9 / 9 / 9
Регистрация: 19.09.2011
Сообщений: 272
25.07.2012, 16:26  [ТС] 5
Цитата Сообщение от Jupiter Посмотреть сообщение
не нужно держать создателей и разработчиков языка за идиотов
но и не нужно верить в то, что они всесведущи и всёпредусматривающие)
для этого как раз и задавал вопрос. Раз есть пул строк, то думаю, эквивалентно. А с точки зрения замысла предпочтительнее конст - т.к. по смыслу, строка не должна меняться
0
47 / 47 / 7
Регистрация: 09.06.2012
Сообщений: 148
25.07.2012, 16:43 6
"поле const по своему поведению является статическим. Оно относится к типу, а не к экземплярам типа. Поэтому к полям const можно обращаться с использованием той же нотации ClassName.MemberName, что и используемой для статических полей. Необходим экземпляр объекта." (c)MSDN
иначе говоря для всех экземпляров будет существовать только одно поле конст
0
Неадекват
1492 / 1230 / 246
Регистрация: 02.04.2010
Сообщений: 2,789
25.07.2012, 16:44 7
Цитата Сообщение от IcyWind Посмотреть сообщение
строка не должна меняться
Строка никогда не меняется, ибо неизменяемый объект.
Цитата Сообщение от IcyWind Посмотреть сообщение
А с точки зрения замысла
Совсем странный вопрос: У этих ключевых слов разный контекстный смысл. Static создает переменную принадлежащую собственно типу, а не его экземплярам. А const объявляет переменную не доступную для изменения. Единственное, что их объединяет это возможность обращения к ним как из статического контекста, так и из экземляра класса.
0
27 / 27 / 8
Регистрация: 25.07.2012
Сообщений: 48
25.07.2012, 16:58 8
после окончательной компиляции твоего приложения строка помеченная как конст везде заменится на просто строку, т.е. как поле она уже представлена не будет, и если в будущем твоя сборка изменится то во всех сборках наследуемых от твоей константное выражение не поменяется.... так что лучше статик, хотя его ты сможешь менять... или readonly, но согластна с предыдущим комментарием - совершенно разные вещи
0
Эксперт .NET
17686 / 12872 / 3365
Регистрация: 17.09.2011
Сообщений: 21,138
25.07.2012, 17:01 9
const - это и есть статик.
Вопрос в том, должна она быть static readonly или просто const.
В первом случае значение этой переменной вычисляется во время выполнения, во втором - во время компиляции.
0
Почетный модератор
Эксперт .NET
8721 / 3673 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
25.07.2012, 23:41 10
Цитата Сообщение от freeba Посмотреть сообщение
Строка никогда не меняется, ибо неизменяемый объект.
Нет.
Цитата Сообщение от kolorotur Посмотреть сообщение
const - это и есть статик.
Нет.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
        const string buffer0 = "123";
        static readonly string buffer1 = "null";
 
        unsafe static void Main ( string[] args )
        {
            Console.WriteLine( " ~ MAIN ~" );
 
            fixed ( char* ptr0 = buffer0,
                    ptr1 = buffer1 )
            {
                Console.WriteLine( "ptr buffer0: 0x{0:X8}", (ulong)ptr0 );
                Console.WriteLine( "ptr buffer1: 0x{0:X8}", (ulong)ptr1 );
 
                ptr0[0] = 'W';
                ptr1[0] = 'N';
            }
 
            Console.WriteLine( buffer0 );
            Console.WriteLine( buffer1 );
            new Program().Print();
            Console.ReadKey();
        }
 
        unsafe public void Print ( )
        {
            Console.WriteLine( " ~ PRINT ~" );
 
            fixed ( char* ptr0 = buffer0,
                    ptr1 = buffer1 )
            {
                Console.WriteLine( "ptr buffer0: 0x{0:X8}", (ulong)ptr0 );
                Console.WriteLine( "ptr buffer1: 0x{0:X8}", (ulong)ptr1 );
            }
 
            Console.WriteLine( buffer0 );
            Console.WriteLine( buffer1 );
        }
Вывод в Print будет таким (какой есть) только благодаря тому что ссылка на константу заменяется компилятором на значение константы, которые располагаются в различных участках памяти (о чем говорят разные адреса). А вывод в Main это как раз таки пример того что значение константы было кэшировано и используется одно и тоже на протяжении всего метода (Отладчик, кстати, будет уверенно показывать изначально значение константы). Из-за того что buffer1 - это static поле, везде будет использоваться адрес который в buffer1.

Из кода можно сделать вывод что: строки - изменяемый объект, и const это не static. Да и readonly, такое чувство что проверяется только при компиляции...
1
Неадекват
1492 / 1230 / 246
Регистрация: 02.04.2010
Сообщений: 2,789
26.07.2012, 00:15 11
Цитата Сообщение от SSTREGG Посмотреть сообщение
строки - изменяемый объект
SSTREGG, имелся ввиду безопасный контекст В unsafe, да вооружившись fixed можно любой массив крутить и вертеть как душе угодно.
0
Почетный модератор
Эксперт .NET
8721 / 3673 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
26.07.2012, 00:21 12
freeba, если Вас прям так контекст волнует:
C#
1
2
3
4
5
            // buffer1 из предыдущего примера
            var gch = GCHandle.Alloc( buffer1, GCHandleType.Pinned );
            Marshal.WriteInt16( gch.AddrOfPinnedObject(), 'N' );
            Console.WriteLine( buffer1 );
            gch.Free();
Только с buffer0 не сработает...
Цитата Сообщение от freeba Посмотреть сообщение
В unsafe, да вооружившись fixed можно любой массив крутить и вертеть как душе угодно.
А про массивы речь не шла... не надо в сторону уходить
0
Неадекват
1492 / 1230 / 246
Регистрация: 02.04.2010
Сообщений: 2,789
26.07.2012, 22:22 13
Цитата Сообщение от SSTREGG Посмотреть сообщение
А про массивы речь не шла... не надо в сторону уходить
Это не работа с фиксированным массивом? Странно...
C#
1
2
3
4
5
6
7
8
9
fixed ( char* ptr0 = buffer0,
                    ptr1 = buffer1 )
            {
                Console.WriteLine( "ptr buffer0: 0x{0:X8}", (ulong)ptr0 );
                Console.WriteLine( "ptr buffer1: 0x{0:X8}", (ulong)ptr1 );
 
                ptr0[0] = 'W';
                ptr1[0] = 'N';
            }

Цитата Сообщение от SSTREGG Посмотреть сообщение
если Вас прям так контекст волнует:
Хех. Оспорить нечем, но это по прежнему шаманства с неуправляемыми ресурсами.
0
26.07.2012, 22:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.07.2012, 22:22
Помогаю со студенческими работами здесь

Переопределение CONST и STATIC
Можно ли в дочерних классах переопределять свойства класса, объявленные в родительском, как CONST...

Static const в dll
Встретил в библиотек такое: Color.hpp class SFML_GRAPHICS_API Color { public: ... static...

const static vector<type>
Мне нужно создать внутри класса вектор цветов предлагаемых в конструкторе как дефолтные... лучше...

Запись в static const char[]
У меня есть строка, содержащая некий текст. std::string ex_text = &quot;&lt;h1&gt;TextTextText&lt;/h1&gt;&quot;; Также...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru