Взгляните в отражателе:
международный Синтаксический анализ ("32"):
public static int Parse(string s)
{
return System.Number.ParseInt32(s, NumberStyles.Integer, NumberFormatInfo.CurrentInfo);
}
, который является вызовом к:
internal static unsafe int ParseInt32(string s, NumberStyles style, NumberFormatInfo info)
{
byte* stackBuffer = stackalloc byte[1 * 0x72];
NumberBuffer number = new NumberBuffer(stackBuffer);
int num = 0;
StringToNumber(s, style, ref number, info, false);
if ((style & NumberStyles.AllowHexSpecifier) != NumberStyles.None)
{
if (!HexNumberToInt32(ref number, ref num))
{
throw new OverflowException(Environment.GetResourceString("Overflow_Int32"));
}
return num;
}
if (!NumberToInt32(ref number, ref num))
{
throw new OverflowException(Environment.GetResourceString("Overflow_Int32"));
}
return num;
}
Преобразовывают. ToInt32 ("32"):
public static int ToInt32(string value)
{
if (value == null)
{
return 0;
}
return int.Parse(value, CultureInfo.CurrentCulture);
}
Как первое (M Dave) в комментарии говорится.
Частный набор на myName означает, что вы можете инициализировать (установить) его только из того, что является членом MyClass . Например:
public class MyClass {
public string myName { get; private set; }
public string myId { get; set; }
public static MyClass GetSampleObject() {
MyClass mc = new MyClass
{
myName = "Whatever",
myId = "1234"
};
return mc;
}
}
(Я скопировал и вставил ваш код инициализации в метод GetSampleObject ).
Но если вы попытаетесь установить его вне MyClass , вы получите ошибку компилятора , потому что частное является личным.
Нет, этого невозможно добиться. Инициализаторы объектов позволяют получить доступ только к полям и свойствам, которые в противном случае были бы доступны за пределами инициализатора.
Лучше всего использовать конструктор, который явно устанавливает эти свойства.
Если они должны быть установлены при инициализации, рассмотрите возможность передачи их в качестве аргументов конструктору
У меня было это требование в прошлом, а также для вещей OR / M. В основном я использую недвижимость с полем поддержки и проверяю, было ли свойство уже установлено. В этом случае вызовите исключение.
public string myName
{
get{ return _myName; }
set
{
if( _myName != null && _myName != value )
throw new Exception( "The myName property may only be set once." );
_myName = value;
}
}
private string _myName;
И еще один вариант совместимости OR / M, который также использует преимущества инициализации конструктора:
public class MyClass
{
[Obsolete( "For ORM use only!" )]
[EditorBrowsableState( EditorBrowsableState.Never )]
public MyClass(){}
public MyClass( string name ){ myName = name; }
public string myName { get; private set; }
public string myId { get; set; }
}