Есть ли способ лучше? - PullRequest
       1

Есть ли способ лучше?

0 голосов
/ 21 сентября 2010

Есть ли лучший способ сделать это.

FileInfo f = new FileInfo("C://notebook.txt");`

public bool Archived
        {
            get
            {
                return (((File.GetAttributes(f.FullName)) 
                        & FileAttributes.Archive) == FileAttributes.Archive);
            }
            set
            {
                if (value == true)
                {
                    if (!this.Archived)
                    {
                        File.SetAttributes(f.FullName, 
                        File.GetAttributes(f.FullName) | FileAttributes.Archive);
                    }
                }
                else if (value == false)
                {
                    if (this.Archived)
                    {
                        File.SetAttributes(f.FullName, 
                        File.GetAttributes(f.FullName) 
                        & ~FileAttributes.Archive);
                    }
                }
            }

        }

`

Ответы [ 4 ]

5 голосов
/ 21 сентября 2010

Да, поскольку у вас есть объект FileInfo, вы можете использовать его свойство Attributes вместо методов File.GetAttributes и File.SetAttributes:

public bool Archived {
  get {
    return (f.Attributes & FileAttributes.Archive) != 0;
  }
  set {
    if (value) {
      if (!this.Archived) {
        f.Attributes |= FileAttributes.Archive;
      }
    } else {
      if (this.Archived) {
        f.Attributes &= ~FileAttributes.Archive;
      }
    }
  }
}
2 голосов
/ 21 сентября 2010

Ну, вы всегда можете начать с упрощения способа обработки value в сеттере.Тогда вы могли бы избежать двойного получения, читая атрибуты в верхней части установщика.

    public bool Archived
        {
            get
            {
                return (((File.GetAttributes(f.FullName)) & FileAttributes.Archive) != 0);
            }
            set
            {
                var attributes = File.GetAttributes(f.FullName);
                bool archived = ((attributes & FileAttributes.Archive) != 0);

                if (value)
                {
                    if (!archived)
                        File.SetAttributes(f.FullName, attributes | FileAttributes.Archive);
                }
                else
                {
                    if (archived)
                        File.SetAttributes(f.FullName, attributes & ~FileAttributes.Archive);
                }
            }
        }

Теперь у Guffa есть точка зрения о том, что атрибуты кэшируются FileInfo, хотя я вижу это больше какаргумент против использования FileInfo в первую очередь.Я бы предпочел хранить только путь в виде строки.

Я также изменил битовый тест для сравнения с нулем, что я должен был сделать в первую очередь.Спасибо, KeithS и Guffa.

И, чтобы сохранить все это в одном месте, если бы мы использовали C # 4.0, мы можем сказать:

bool archived = attributes.HasFlag(FileAttributes.Archive);
1 голос
/ 21 сентября 2010

Нет, это довольно стандартно при работе с помеченными (скорее побитовыми) значениями.

Возможно, вы захотите потерять бит else if, так как логические значения обычно имеют только 2 состояния.

0 голосов
/ 21 сентября 2010

В получателе, если поразрядное И оценивает любое ненулевое значение, бит устанавливается, поэтому ваш получатель может быть несколько сокращен:

get
{
   return (((File.GetAttributes(f.FullName)) & FileAttributes.Archive) != 0);
}

Все остальное в значительной степени оптимально; Вы можете потерять некоторые скобки и одну оценку, избавившись от скобок вокруг if и else от установщика, и сделав «else if» просто «else». Или объедините внутренние и внешние выражения; действительно, внутренние выражения не нужны, поскольку 1 | 1 == 1 и 1 & ~ 1 == 0, поэтому установка его на одно и то же значение несколько раз не повредит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...