C# 3.0: Автоматические Свойства - каково было бы название частной переменной, созданной компилятором

Ищите эти access() функция, найденная в unistd.h. Можно заменить функцию [1 112]

if( access( fname, F_OK ) != -1 ) {
    // file exists
} else {
    // file doesn't exist
}

, можно также использовать R_OK, W_OK, и X_OK вместо F_OK, чтобы проверить на разрешение чтения, записать разрешение и выполнить разрешение (соответственно), а не существование, и Вы можете ИЛИ любой из них вместе (т.е. проверьте и на чтение и на разрешение записи с помощью R_OK|W_OK)

Обновление : Обратите внимание, что в Windows, Вы не можете использовать W_OK для надежного тестирования на разрешение записи, так как функция доступа не принимает DACLs во внимание. access( fname, W_OK ) может возвратиться 0 (успех), потому что файлу не установили атрибут "только для чтения", но у Вас все еще не может быть разрешения записать в файл.

8
задан Jon Skeet 14 August 2009 в 10:29
поделиться

4 ответа

Переписано для большей ясности

Поле создается правильно, но не отображается в вашем коде как обычное поле.

Вот ваше типичное автоматическое свойство:

public string FirstName  { get; set; }

который , если мы посмотрим на скомпилированную сборку, создаст это поле резервного хранилища:

[CompilerGenerated]
private string <FirstName>k__BackingField;

Обратите внимание на <и> там, которые не являются символами, которые вы можете использовать в своих собственных именах полей. Вы также не можете получить доступ к этому полю, потому что оно не «существует», насколько это важно для компилятора, когда он смотрит на ваш код.

Настоящий вопрос здесь, от меня, , почему вам следует хотите получить доступ к этому полю. Другими словами, зачем вам нужен доступ к полю и что он делает для вашего кода, чего не делает доступ к свойству?

Если вы хотите предотвратить доступ на запись к полю извне, это легко сделать с помощью сделать метод установки закрытым, примерно так:

public string FirstName  { get; private set; }

Обратите внимание, что, поскольку поле фактически присутствует в сборке, это означает, что это не магия JITter, а магия компилятора, и, таким образом, вы можете использовать отражение для поиска и доступа к этому полю.

Но опять же, зачем вам это нужно?

Теперь давайте предположим, что у вас действительно есть законная причина, по которой вы хотите использовать поле вместо свойства. Я могу придумать одно, хотя я, вероятно, сделал бы это по-другому, и это было бы то, что вы хотите передать имя поля методу как параметр out или ref, например:

public void AdjustName(ref String name)
{
    name = Capitalize(name);
}

Вы не можете передавать свойства как out / ref-parameters, поэтому этот код не будет работать:

AdjustName(ref string FirstName);

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

private string firstName;
public string FirstName
{
    get { return firstName; }
    set { firstName = value; }
}

С этим на месте, вы можете вызвать этот метод:

AdjustName(ref string firstName); // note the field, not the property

Однако,

19
ответ дан 5 December 2019 в 06:54
поделиться

Если вы используете автоматические свойства, вы не можете получить доступ к частному полю. Это не только конфиденциально, но и анонимно.

1
ответ дан 5 December 2019 в 06:54
поделиться

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

public string FirstName  { get; private set; }

Теперь у вас есть частный сеттер и открытый геттер.

4
ответ дан 5 December 2019 в 06:54
поделиться

Итак, как я могу использовать / получить доступ к частной переменной, если я хочу использовать ее в методе этого класса?

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

Компилятор автоматически создаст частную переменную-член или резервное поле, но это существует в коде CIL . Его нет нигде в вашем исходном коде.

0
ответ дан 5 December 2019 в 06:54
поделиться
Другие вопросы по тегам:

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