Должен ли я объявить атрибуты моего абстрактного класса с помощью get; задавать;? - PullRequest
2 голосов
/ 05 февраля 2010

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

Моя идея состоит в том, чтобы иметь базовый класс File и реализовывать классы Picture.cs, Video.cs и Document.cs, унаследованные от класса File.cs.

Вот мой код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SharpLibrary_MediaManager
{
    public abstract class File
    {
        public string name;
        public string fileType;
        public int size;
        public DateTime creationDate;
        public DateTime modificationDate;        
    }
}

Должен ли я объявить сокращенный код для каждого атрибута следующим образом:

public string name { get; set; }

Любое руководство будет полезно. Спасибо. :)

Изменить:

Я имею в виду , буквально заменяющий эту строку:

public string name;

с этой строкой:

public string name { get; set; }

Ответы [ 7 ]

5 голосов
/ 05 февраля 2010

Во-первых, «атрибуты» здесь не являются правильной терминологией. Когда вы объявляете члена класса, для которого определены get и / или set (формально известные как «методы доступа»), вы определяете свойство. Свойства - это удобный способ предоставления значений приватных полей, поскольку вы можете добавить логику в механизмы получения и установки.

Во-вторых, когда вы объявляете участника name, как вы сделали через

public string name { get; set; } 

компилятор расширит это до следующего:

private string _name;
public string name {
    get {
        return _name;
    }
    set {
        _name = value;
    }
}

То есть компилятор автоматически создаст для вас вспомогательное поле и определит методы доступа. Это так называемые "автоматические свойства" (для людей) 1 .

В-третьих, вы никогда не должны 2 публично выставлять поля. Итак, если вы хотите выставить строку name как часть вашего открытого интерфейса, лучше сделать это как свойство. Во-первых, это обеспечивает лучшую инкапсуляцию. Во-вторых, он может быть объявлен виртуальным и переопределен в классах с производными данными. В-третьих, вы можете иметь собственную логику. В-четвертых, у вас могут быть разные уровни доступа к механизмам чтения и записи свойств, но вы не можете использовать поле.

В-четвертых, в соответствии с принятыми соглашениями об именах, публичные свойства должны быть названы с помощью CamelCase , чтобы вы предпочитали Name вместо name.

1 : Извините, плохая шутка, которую я так долго ждала.

2 : Почти никогда.

4 голосов
/ 05 февраля 2010

Вы описываете не короткий синтаксис для отдельного элемента, а два совершенно разных типа членов. Версия get / set создает свойство C #, а версия non-get / set создает поле.

// field
public string name;  

// property
public string name {get; set;}

Итак, что вы на самом деле спрашиваете здесь, следует ли вам указывать имя как поле или свойство. Ответ почти наверняка является собственностью.

1 голос
/ 05 февраля 2010

Просто чтобы прояснить, атрибуты - это средство для декларативного программирования. Они используются для украшения методов, классов и т. Д. msdn link

1 голос
/ 05 февраля 2010

Если вы ищете эти свойства, то есть добавление { get; set; } сделает переменные, тогда вы должны объявить часть set; свойства как protected.

Так становится:

public string name { get; protected set; }

Преимущество этого заключается в том, что вы гарантируете, что свойство может быть установлено только базовым классом или любым классом, который наследует базовый класс.

Как и другие предлагали, следовать соглашениям о присвоении имен C # - хорошая идея, а также настоятельно рекомендуется использовать свойства.

0 голосов
/ 05 февраля 2010

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

class Base
{
public virtual int X
{
get
{
Console.Write("Base GET");
return 10;
}
set
{
Console.Write("Base SET");
}
}
}

class Derived : Base
{
public override int X
{
get
{
Console.Write("Derived GET");
return 10;
}
set
{
Console.Write("Derived SET");
}
}
}

Еще одна полезная уловка, которая применима при использовании свойств, - это возможность изменить модификатор производных свойств, например, перейти от открытого доступа к защищенному.

Следовательно, во многих случаях лучше использовать свойства в базовом классе для получения.

0 голосов
/ 05 февраля 2010

Как говорит Люк, при прочих равных свойствах предпочтительнее полей.

Кроме того, вы можете изменить регистр полей в соответствии со стандартными соглашениями об именах C # .

Наконец, вы можете избежать использования имени «File» для вашего класса, поскольку вы, вероятно, будете использовать пространство имен System.IO, которое также имеет класс File. Кроме того, System.IO.FileInfo может уже включать многие свойства, которые вы планируете создать - нет смысла изобретать велосипед.

0 голосов
/ 05 февраля 2010

Если вы спрашиваете, следует ли выставлять свойства, а не открытые поля, тогда ответ будет Да .

Вы должны также использовать PascalCase для имен свойств, а не camelCase:

public string Name { get; set; }
public string FileType { get; set; }
// etc
...