为什么 VS 建议我将此 class 引用添加为静态而不是?

Why VS suggests me to add this class reference as static when it isn't?

我想知道为什么 Visual Studio 2017 v15.9.5 中的 IntelliSense 实际上建议我将此 class 引用添加为静态 since:

Class的代码:

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();
            }
        }
    }
}

Class 引用了之前的代码(在构造函数上使用):

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 进行快速添加 references/usings 它会建议我两个选项:

选择 a) 会导致添加静态引用,我不明白为什么。

选择b) 将导致添加完整的命名空间引用。我个人总是尝试删除所有类型限定符以简化代码阅读。

欢迎任何澄清这一点的信息。

P.S:很抱歉没有翻译代码,但我想关注“为什么”而不是内容本身。 继承的class没有引用“非静态”Formularios.Tiposclass。

你的"RangoDatosProvider"class没有理由成为实例class;它只对参数和枚举进行操作,这意味着 class 中没有任何东西可以改变状态。

我不知道您使用的是哪个代码分析规则集,但有几个持有 "if it doesn't need to be instance, it is better off being static" 的推理。 当然,您是否同意这取决于您,但这就是 visual studio

向您推荐的原因

首先,建议不要添加 "class reference as static",而是添加“static import”。

Modo 不适用于您的代码,因为您在 frmConfiguracionPerfilEmail 构造函数中引用它。它嵌套在 Tipos class 中,因此无法按原样使用。

建议 1 使 Tipos class 的所有静态成员和嵌套类型无需限定即可使用,例如Modo 而不是 Tipos.Modo.

建议 2 不会像您所说的那样用完整的命名空间对其进行限定。 Formularios 是一个命名空间; Tipos 是一个 class。它只是建议通过 class 名称进行资格认证。它不需要命名空间,因为使用它的 frmConfiguracionPerfilEmail class 已经在 Formularios 命名空间 (Formularios.Configuration) 下,因此可以引用 Tipos 而无需命名空间限定。

如果你真的想简化代码的阅读,就像你说的那样,那么首先要取消嵌套这些枚举。嵌套类型有它们的用途,但是使用 class 只不过是其他类型的容器是多余的。命名空间就是为此目的而存在的。将枚举直接放在 Formularios 命名空间下。或者,如果您希望它们以某种方式分组,请将它们放在 Formularios.Tipos 命名空间 中。

namespace Formularios.Tipos
{
    // enums
}

如果你这样做,请确保你这样做:

using Formularios.Tipos;

这相当于使用您当前的设置 using static Formularios.Tipos;