Свойства частного метода set в C# 3.0 возражают инициализации

Взгляните в отражателе:

международный Синтаксический анализ ("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) в комментарии говорится.

11
задан Agent_L 27 April 2016 в 10:12
поделиться

4 ответа

Частный набор на 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 , вы получите ошибку компилятора , потому что частное является личным.

6
ответ дан 3 December 2019 в 03:53
поделиться

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

Лучше всего использовать конструктор, который явно устанавливает эти свойства.

14
ответ дан 3 December 2019 в 03:53
поделиться

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

5
ответ дан 3 December 2019 в 03:53
поделиться

У меня было это требование в прошлом, а также для вещей 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; } 
}
1
ответ дан 3 December 2019 в 03:53
поделиться
Другие вопросы по тегам:

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