【问题标题】:Why VS suggests me to add this class reference as static when it isn't?为什么VS建议我将此类引用添加为静态而不是静态的?
【发布时间】:2019-01-24 07:35:20
【问题描述】:

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

  • 没有任何私有构造函数
  • 没有任何静态方法
  • 没有任何静态成员
  • 在引用这个非静态类的类上,我只是访问公共 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) 将导致添加完整的命名空间引用。我个人总是尝试删除所有类型限定符以简化代码阅读。

欢迎任何澄清这一点的线索。

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

【问题讨论】:

  • 我很确定这是因为在您的frmConfigurationPerfilEmail 中您没有Tipos 的实例。那么 IntelliSense 试图告诉您的是,您可以通过静态或类命名空间访问 Tipos 的公共属性。

标签: c# .net visual-studio static roslyn


【解决方案1】:

首先,建议不要添加“静态类引用”,而是添加“static import”。

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

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

如您所说,建议 2 不会使用完整的命名空间来限定它。 Formularios 是一个命名空间; Tipos 是一个类。它只是通过类名来暗示资格。它不需要命名空间,因为正在使用它的 frmConfiguracionPerfilEmail 类已经在 Formularios 命名空间 (Formularios.Configuration) 下,因此可以在没有命名空间限定的情况下引用 Tipos

如您所说,如果您真的想简化代码的阅读,请先取消嵌套这些枚举。嵌套类型有其用途,但将类仅用作其他类型的容器是过度的。命名空间就是为此目的。将枚举直接放在 Formularios 命名空间下。或者,如果您希望它们以某种方式分组,请将它们放在 Formularios.Tipos 命名空间中。

namespace Formularios.Tipos
{
    // enums
}

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

using Formularios.Tipos;

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

【讨论】:

  • 感谢您的澄清和提示。这完全有道理!
【解决方案2】:

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

我不知道您使用的是哪个代码分析规则集,但有几个人认为“如果它不需要 是实例,那么最好是静态的”。 当然,你是否同意这取决于你,但这就是 Visual Studio 向你推荐它的原因

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-17
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    • 2014-07-13
    • 1970-01-01
    相关资源
    最近更新 更多