Кроме очевидной разницы [1 129]
const
значения VS readonly
могут быть вычислены динамично, но потребность, которая будет присвоена перед выходами конструктора.. после этого это замораживается. static
. Вы используете ClassName.ConstantName
нотация для доступа к ним. существует тонкое различие. Считайте класс определенным в AssemblyA
.
public class Const_V_Readonly
{
public const int I_CONST_VALUE = 2;
public readonly int I_RO_VALUE;
public Const_V_Readonly()
{
I_RO_VALUE = 3;
}
}
AssemblyB
ссылки AssemblyA
и использование эти значения в коде. Когда это компилируется,
const
значение, оно похоже на находить-замену, значение 2 'испеклось в' AssemblyB
IL. Это означает это, если завтра я обновлю I_CONST_VALUE
к 20 в будущем. AssemblyB
все еще имел бы 2, пока я не перекомпилировал его . readonly
значение, это похоже ref
к ячейке памяти. Значение не испеклось в [1 116] IL. Это означает, что, если ячейка памяти обновляется, AssemblyB
, получает новое значение без перекомпиляции. Таким образом, если I_RO_VALUE
обновляется к 30, только необходимо создать AssemblyA
. Все клиенты не должны быть перекомпилированы. Поэтому, если Вы уверены, что значение константы не изменится, используют const
.
public const int CM_IN_A_METER = 100;
, Но если у Вас есть константа, которая может измениться (например, w.r.t. точность).. или когда в сомнении, используйте readonly
.
public readonly float PI = 3.14;
Обновление: Aku должен получить упоминание, потому что он указал на это сначала. Также я должен включиться, где я изучил это.. Эффективный C# - Bill Wagner
Вы используете метод обрезки, что означает, что он смотрит только на внешние края строки. Вы, вероятно, получаете что-то вроде: «555) 555-555» в качестве номера телефона, правильно?
Мне неизвестен метод NS (Mutable) String в строке «replaceOccurrencesOfCharactersInSet: (NSCharacterSet *) set ", и я признаю, что, вероятно, было бы действительно неплохо иметь.
Будучи мной, я бы, вероятно, просто использовал регулярное выражение. Если вы используете RegexKitLite , тогда вы легко можете сделать:
#import "RegexKitLite.h"
NSString * number = @"(555) 555-555 Office";
NSString * strippedNumber = [number stringByReplacingOccurrencesOfRegex:@"[^0-9]" withString:@""];
Это может быть немного излишним, но он сделает именно то, что вы ищете.
FYI: "[^ 0-9 ] "означает" любой символ, кроме 0, 1, 2, 3, 4, 5, 6, 7, 8 или 9 ".