Почему VS предлагает мне добавить ссылку на класс как статическую, если это не так? - PullRequest
0 голосов
/ 24 января 2019

Мне было интересно, почему IntelliSense в Visual Studio 2017 v15.9.5 фактически предлагает мне добавить эту ссылку на класс как статическую , так как :

  • Не имеет частного конструктора
  • Нет статических методов
  • Нет статических членов
  • В классе, который ссылается на этот нестатический класс, я просто обращаюсь к общедоступным enum ("Modo")

Код класса:

using System.Collections.Generic;

namespace Formularios
{
    public class Tipos
    {
        public enum GridControlMenusEdicion
        {
            Predeterminado,
            Siempre,
            Nunca
        }

        public enum Modo
        {
            Nuevo,
            Modificacion,
            Consulta
        }

        public enum TipoCampo
        {
            Texto,
            Fecha,
            Numero,
            SiNo
        }

        public enum EstadoEntidad
        {
            Nueva,
            Modificacion
        }

        public enum RangoDatos
        {
            Hoy,
            Ayer,
            EstaSemana,
            SemanaPasada,
            EsteMes,
            MesPasado,
            Ultimos3Meses,
            AnoEncurso
        }

    }

    class RangoDatosProvider
    {

        public Dictionary<Tipos.RangoDatos, string> DiccionarioRangoDatos()
        {
            return new Dictionary<Tipos.RangoDatos, string>
            {
                { Tipos.RangoDatos.Hoy, "Hoy" },
                { Tipos.RangoDatos.Ayer, "Ayer" },
                { Tipos.RangoDatos.EstaSemana, "Esta semana" },
                { Tipos.RangoDatos.SemanaPasada, "Semana pasada" },
                { Tipos.RangoDatos.EsteMes, "Este mes" },
                { Tipos.RangoDatos.MesPasado, "Mes pasado" },
                { Tipos.RangoDatos.Ultimos3Meses, "Últimos 3 meses" },
                { Tipos.RangoDatos.AnoEncurso, "Año en curso" }
            };
        }

        public string GetTextoLoadingRangoDatos(Tipos.RangoDatos seleccionUser)
        {
            switch (seleccionUser)
            {
                case Tipos.RangoDatos.SemanaPasada:
                    return "la " + DiccionarioRangoDatos()[seleccionUser].ToLower();
                case Tipos.RangoDatos.Ultimos3Meses:
                    return "los " + DiccionarioRangoDatos()[seleccionUser].ToLower();
                case Tipos.RangoDatos.AnoEncurso:
                    return "este año";
                default:
                    return DiccionarioRangoDatos()[seleccionUser].ToLower();
            }
        }
    }
}

Класс, который ссылается на предыдущий код (используется в конструкторе):

using Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Formularios.Configuracion
{
    public partial class frmConfiguracionPerfilEmail : frmBase
    {
        private readonly PerfilEmailGestion _perfilEmailGestion = new PerfilEmailGestion();
        private readonly HashSet<string> _aliasExistentes;

        public frmConfiguracionPerfilEmail(PerfilEmail mailSettings, HashSet<string> aliasExistentes, Modo modo)
        {
            InitializeComponent();
            Inicializar(mailSettings);
            _aliasExistentes = aliasExistentes;
            Modo = modo;
        }

    }

}

Если я вызываю IntelliSense для быстрого добавления ссылок / использования, он предлагает мне два варианта:

  • a) «использование статического Formularios.Tipos»
  • b) «Modo» в качестве параметра конструкторастанет "Tipos.Modo"

Выбор a) приведет к добавлению статической ссылки, чего я не понимаю, почему.

Выбор b) приведет к добавлениюполная ссылка на пространство имен.Лично я всегда стараюсь удалить все классификаторы типов, чтобы упростить чтение кода.

Любой свет, брошенный на прояснение этого, будет весьма кстати.

PS: Извините, что не переводил код, но я хотелсосредоточиться на «почему», а не на самом контенте. Унаследованный класс не ссылается на класс "no-static" Formularios.Tipos.

Ответы [ 2 ]

0 голосов
/ 24 января 2019

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

Modo недоступен вашему коду, так как вы ссылаетесь на него в конструкторе frmConfiguracionPerfilEmail. Он вложен в класс Tipos, поэтому он не доступен как есть.

Предложение 1 позволяет использовать все статические элементы и вложенные типы класса Tipos без необходимости их квалификации, например, Modo вместо Tipos.Modo.

Предложение 2, как вы сказали, не будет соответствовать его полному пространству имен. Formularios - пространство имен; Tipos это класс. Это только предполагает квалификацию по названию класса. Ему не нужно пространство имен, потому что класс frmConfiguracionPerfilEmail, в котором он используется, уже находится под пространством имен Formularios (Formularios.Configuration), поэтому на 1010 * можно ссылаться без указания пространства имен.

Если вы действительно хотите упростить чтение кода, как вы говорите, то начните с удаления этих перечислений. Вложенные типы имеют свое применение, но использование класса не более чем контейнер для других типов. Для этой цели существуют пространства имен. Поместите перечисления непосредственно в пространство имен Formularios. Или, поместите их в Formularios.Tipos пространство имен , если вы хотите, чтобы они как-то сгруппировались.

namespace Formularios.Tipos
{
    // enums
}

И если вы это сделаете, убедитесь, что вы делаете это:

using Formularios.Tipos;

Это будет эквивалентно выполнению using static Formularios.Tipos; с вашей текущей настройкой.

0 голосов
/ 24 января 2019

Ваш класс "RangoDatosProvider" не имеет причин быть классом экземпляра; он работает только с параметрами и перечислениями, то есть в классе нет ничего, что могло бы изменить состояние.

Я не знаю, какой набор правил анализа кода вы используете, но некоторые придерживаются мнения, что «если ему не нужно , нужно быть экземпляром, лучше быть статичным». согласен ли ты с этим, конечно, решать тебе, но именно поэтому его рекомендует Visual Studio

...