Есть ли разница между закрытыми константными и закрытыми переменными только для чтения в C #?

Вам просто нужно добавить захватывающие скобки, в дополнение к вашей скошенной скобке.

<?php
    $in = "hello (world), my name (is andrew) and my number is (845) 235-0184";
    preg_match_all('/\(([A-Za-z0-9 ]+?)\)/', $in, $out);
    print_r($out[1]);
?>

Выводит:

Array ( [0] => world [1] => is andrew [2] => 845 ) 
30
задан Hosam Aly 4 January 2009 в 09:30
поделиться

8 ответов

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

С точки зрения использования, константы врезаются в код вызова. Это означает, что, если Вы перекомпилировали библиотека dll для изменения общественность постоянный, но не изменяете потребителей, тогда он, потребители будут все еще использовать исходное значение. С переменной только для чтения этого не произойдет. Зеркальное отражение этого - то, что константы (очень, очень немного) более быстры, так как это просто загружает значение (вместо того, чтобы иметь необходимость разыменовать его).

интернирование Ре; хотя можно сделать это вручную, это - обычно функция компилятора/времени выполнения литералов; если Вы init поле только для чтения через литерал:

someField = "abc";

тогда эти "abc" будет интернирован. При чтении его из конфигурации это не будет. Поскольку постоянная строка должна быть литералом, она будет также интернирована, но к ней получают доступ по-другому: снова, чтение из поля является разыменовыванием, а не ldstr .

33
ответ дан Marc Gravell 4 January 2009 в 09:30
поделиться
  • 1
    Метод 4), кажется, больше не поддерживается... Там какая-либо опция состоит в том, чтобы сделать это? В настоящее время I' m enclosuring одноэлементный экземпляр в функции лямбды и передаче его к функции регистра фабрики SimpleIoc. – Arthur Nunes 24 May 2016 в 15:57

Что-то для замечания о константах, они на самом деле хранятся в исполняемом файле, таким образом объявляя, что многие из них будут увеличивать размер исполняемого файла.

Обычно, это не огромная проблема, а мой друг работал в компании, которая осуществила, "все должно быть константой" правило и управляемый для значительного увеличения их скомпилированного исполняемого размера.

5
ответ дан Soviut 4 January 2009 в 09:30
поделиться
  • 1
    Вопрос был о различии между пред/сообщение/методы установки. Документы API скорее соглашаются с различными вариантами каждого преобразования. Существует, конечно, некоторое последствие для значений параметров при применении преобразований в различных заказах, но that' s немного вне темы здесь. – Albin 27 August 2014 в 13:31

Действительно, два типа не могут быть изменены после того, как они были инициализированы, но существуют некоторые различия между ними:

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

, Например, константа могла использоваться в этой ситуации:

public class MathValues
{
  public const double PI = 3.14159;
}

И только для чтения было бы лучше для этого случая:

public class Person
{
    public readonly DateTime birthDate;

    public Person(DateTime birthDate)
    {
        this.birthDate = birthDate;
    }
}

или

public class Person
{
    public readonly DateTime birthDate = new DateTime(1986, 1, 24);
}
  • 'константа' статична, таким образом, она совместно используется всеми экземплярами того класса и может быть получена доступ непосредственно (как MathValues. PI), тогда как 'только для чтения' не статично. Как следствие объявление как 'статическая константа' недопустимо, потому что константа является статическими, но 'помехами, только для чтения', законен

  • , 'константа' может содержать только целочисленный тип (sbyte, байт, короткий, ushort, интервал, uint, долго, ulong, символ, плавание, дважды, десятичное число, bool, или строка), перечисление или ссылка на пустой указатель (не классы или структуры, потому что они инициализируются во времени выполнения с 'новым' ключевым словом), тогда как 'только для чтения' может содержать составные типы, структуры или классы (при помощи нового ключевого слова при инициализации), но не может содержать перечисления

11
ответ дан melculetz 4 January 2009 в 09:30
поделиться
  • 1
    Некоторый комментарий относительно координат, которые это использует, был бы супер в этом ответе также. например, " вращение сопровождается translation" довольно очевидно: но как делает это achive это с точки зрения x & ось y? Как повернуть что-то о его центральной точке а не координатном корне. – HörmannHH 15 August 2014 в 12:58

Используемый? Едва ли. Consts оценены во время компиляции, тогда как только для чтения оценены во времени выполнения. Можно также присвоить переменной только для чтения значение в конструкторе.

2
ответ дан Steven Robbins 4 January 2009 в 09:30
поделиться
  • 1
    Когда я пробую свой сценарий этот путь, он имеет синтаксическую ошибку с недостающей кавычкой конца. Метод 2 ниже работ для меня – Michele 23 January 2019 в 18:34

Поля только для чтения могут быть инициализированы или в объявление или в конструктор из класса. Поэтому поля только для чтения могут иметь различные значения в зависимости от конструктора, используемого .

А участник только для чтения может также быть используется для констант этапа выполнения как в следующем примере:

public static readonly uint currentTicks = (uint)DateTime.Now.Ticks;

поля Readonly не неявно статичны, и поэтому , статическая банка ключевого слова (должна) быть применена к полю только для чтения явно при необходимости. Это не позволяется для полей константы, которые неявно статичны.

участники Только для чтения могут держать сложные объекты при помощи новое ключевое слово при инициализации .

0
ответ дан splattne 4 January 2009 в 09:30
поделиться
  • 1
    Гм - I' ve выполняют этот второй сценарий много различных путей от пакетных файлов, IDE Visual Studio, строк команды DOS и powershell консольных сессий, но это - первый раз I' ve пытался выполнить его из другого powershell сценария. Какие вещи могли там быть в самом сценарии, который сохранит его от того, чтобы успешно быть запущенным через Вызывать-выражение? – Hoobajoob 12 October 2012 в 02:00

Вот различия между.NET C# константа , только для чтения и статичный только для чтения поля (от эта статья ).

Константы :

  • Статичный значением по умолчанию
  • Должен иметь значение времени компиляции (т.е.: Вы можете иметь + "B", но не можете иметь вызовов метода)
  • , Может использоваться в атрибутах
  • , копируются в каждый блок, который использует их (каждый блок добирается, локальная копия значений)
  • Мог быть объявлен в функциях

поля экземпляра Только для чтения :

  • оценены, когда экземпляр создается
  • , Должен иметь установленное значение к тому времени, когда конструктор выходит

Статические поля только для чтения :

  • оценены, когда выполнение кода поражает ссылку класса (т.е.: новый экземпляр создается, или статический метод выполняется)
  • , Должно быть, оценил значение к тому времени, когда статический конструктор сделан
  • , Вы действительно не хотите помещать ThreadStaticAttribute на них (так как статический конструктор будет выполняться в одном потоке только, и это будет установленное значение для своего потока; все другие потоки будут иметь это значение неинициализированным)
4
ответ дан Rinat Abdullin 4 January 2009 в 09:30
поделиться
  • 1
    Это помогает много, я думаю так, что команда Разработки Android должна включать его в их документы. – tim687 17 August 2015 в 11:37

Различие - то, что значение статического поля только для чтения установлено во время выполнения и может таким образом быть изменено содержанием класса, тогда как значение поля константы установлено к постоянному времени компиляции.

В статическом случае только для чтения содержанию класса позволяют изменить его только

в объявлении переменной (через переменный инициализатор) в статическом конструкторе (конструкторы экземпляра, если это не статично) статичный только для чтения обычно используется, если тип поля не позволяется в объявлении константы, или когда значение не известно во время компиляции.

Экземпляр поля только для чтения также позволяется.

Помните, что для ссылочных типов, в обоих случаях (статичный и экземпляр) модификатор только для чтения только препятствует тому, чтобы Вы присвоили новую ссылку на поле. Это конкретно не делает неизменным объект указанный ссылкой.

class Program

{

  public static readonly Test test = new Test();

  static void Main(string[] args)

  {

     test.Name = "Program";

     test = new Test(); // Error: A static readonly field cannot be assigned to (except in a static constructor or a variable initializer)

  }

}

class Test

{

   public string Name;

}

Различие - то, что статичный только для чтения может быть изменен содержанием класса, но константа никогда не может изменяться и должна быть инициализирована к постоянному времени компиляции. Чтобы подробно остановиться на статическом случае только для чтения немного, содержание класса может только изменить его:

- в объявлении переменной (через переменный инициализатор).

- в статическом конструкторе (конструкторы экземпляра, если это не статично).


Ключевое слово константы в.NET C#

Пример: public const string abc = “xyz”; Инициализированный только в объявлении. Значение оценено во время компиляции и не может быть изменено во время выполнения. Попытка изменить его вызовет ошибку компиляции. Константа уже довольно статична. Так как классы и структуры инициализируются во время выполнения с новым ключевым словом, Вы не можете установить константу на класс или структуру. Но, это должен быть один из целочисленных типов. Ключевое слово только для чтения в.NET C#

Пример: public readonly string abc; Может быть инициализирован в коде объявления или коде consturctor. Значение оценено во время выполнения. Может быть объявлен как статичный или атрибут уровня экземпляра. Поле только для чтения может содержать сложный объект при помощи нового ключевого слова во время выполнения.

1
ответ дан pravprab 27 November 2019 в 22:03
поделиться

Еще одна вещь. Я не видел этого в комментариях выше, хотя, возможно, я пропустил это. Вы не можете создать постоянный массив.

private const int[] values = new int[] { 1, 2, 3 };

Но вы можете создать его, используя статическое поле только для чтения.

private static readonly int[] values = new int[] { 1, 2, 3 };

Так что если вам нужна константа массива, такая как список допустимых значений, и перечисление будет не подходит, тогда статический readonly - единственный путь. Например, если массив состоял из целых чисел, допускающих значение NULL, например:

private static readonly int?[] values = new int?[] { null, 1, 2, 3 };

Не можете сделать , что с константой, не так ли?

2
ответ дан 27 November 2019 в 22:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: