Ищите эти 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 (успех), потому что файлу не установили атрибут "только для чтения", но у Вас все еще не может быть разрешения записать в файл.
Переписано для большей ясности
Поле создается правильно, но не отображается в вашем коде как обычное поле.
Вот ваше типичное автоматическое свойство:
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
Однако,
Если вы используете автоматические свойства, вы не можете получить доступ к частному полю. Это не только конфиденциально, но и анонимно.
Как уже было сказано: вы не можете получить доступ к автоматически сгенерированной переменной (без использования плохих уловок). Но я предполагаю, что вы задаете этот вопрос, потому что хотите иметь только геттер, но все же хотите использовать автоматические свойства ... верно? В этом случае вы можете использовать это:
public string FirstName { get; private set; }
Теперь у вас есть частный сеттер и открытый геттер.
Итак, как я могу использовать / получить доступ к частной переменной, если я хочу использовать ее в методе этого класса?
В исходном коде вам нужно только и разрешено только для работы с аксессором свойства person.LastName
или LastName
, если вы пишете код внутри класса person.
Компилятор автоматически создаст частную переменную-член или резервное поле, но это существует в коде CIL . Его нет нигде в вашем исходном коде.