Каков наилучший способ определения переменных полупостоянного класса в C #? - PullRequest
0 голосов
/ 05 июня 2009

У меня есть класс с именем ItemBase, от которого наследуется ряд классов.

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

Я использовал Getter, как я использую в PHP и Java , так как я всегда делал это так:

public class ItemBase
{
    protected string GetApplicationPath()
    {
        return System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase);
    }

    protected string GetApplicationDataPath()
    {
        return GetApplicationPath() + @"..\..\..\TestServices\";
    }
}

Тем не менее, я заметил, что геттеры и сеттеры на самом деле не используются в C # , как в Java или PHP, и я подозреваю, что есть лучший, более краткий / стандартный способ сделать это в C #.

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

protected string _applicationPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase);

Я держусь подальше от открытых полей после прочтения о недостатках, которые у вас есть с ними в будущем в статье Джона Скита . Кроме того, это слишком много кода для простого определения.

protected string ApplicationPath
{
    get
    {
        return System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase);
    }
}

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

protected string ApplicationPath { get; set; }

public ItemBase()
{
    ApplicationPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase);
}

Итак, я остановился на , используя эти геттеры точно так же, как я делаю в PHP и Java , хотя это, похоже, не совсем C # способ сделать это.

Какие условные обозначения вы используете в C # для хранения этих «однострочных переменных класса», которые просто содержат часть информации или выполняют небольшие вычисления?

ОТВЕТ:

protected string ApplicationPath
{
    get { return System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase); }
}

protected string ApplicationDataPath
{
    get { return ApplicationPath + @"..\..\..\TestServices\"; }
}

Ответы [ 3 ]

3 голосов
/ 05 июня 2009

«Я мог бы использовать сокращенные свойства C #, но тогда каждый маленький кусочек информации имеет код в двух местах, а имя используется дважды, просто не похоже на краткое решение»

Что вы подразумеваете под этим? Свойства являются просто синтаксическим сахаром для методов получения / установки, которые вы обычно делаете в Java. Где вы видите код в двух местах?

public string MyProp
{
   get{return "MyProp";}
}
2 голосов
/ 05 июня 2009

Какие условные обозначения вы используете в C # для хранения этих «однострочных переменных класса», которые просто содержат часть информации или выполняют небольшие вычисления?

После вашего описания: используйте свойства только для чтения. Это способ сделать это в C #, и в большинстве случаев это действительно единственная разумная альтернатива. Как ты сам сказал:

Я заметил, что геттеры и сеттеры на самом деле не используются в C #, как в Java или PHP

Да, и причина проста: свойства .NET предлагают специальный синтаксический сахар для экспрессии геттеров и сеттеров. В некотором смысле, последние - это просто обходной путь для компенсации отсутствия первых.

В некоторых случаях вы можете не хотеть использовать свойства:

  • Константы времени компиляции, которые гарантированно никогда и никогда не изменятся: используйте открытые константы (const) для них:

    public const string Uuid = "D4D5DF8E-51DD-11DE-825A-1A5C55D89593";
    
  • Случаи, когда вы хотите дать понять потребителю, что операция (потенциально) отнимает много времени и / или не имеет побочных эффектов: используйте метод с префиксом Get. Однако в случае побочных эффектов, вероятно, было бы лучше, чтобы имя метода также отражало это.

1 голос
/ 05 июня 2009

Ответ точно такой же, как один из вариантов, который вы уже обесценили как слишком много кода? За исключением того, что имена этих свойств начинаются с Get, что не имеет никакого смысла ..

Защищенное свойство только с реализацией get - это действительно правильный путь. Это должно быть указано компилятором, если кому-то интересно.

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