【问题标题】:C# Static class with Enum带有枚举的 C# 静态类
【发布时间】:2012-09-04 10:55:18
【问题描述】:

我有一个棘手的问题困扰了我一段时间。我有以下代码声明...

namespace ESEGURCI.WEB.BusinessLogicLayer.Commons
{
    public static class ParameterUtilities
    {
        public enum ParameterEnum
        {
            MAX_LOGIN_ATTEMPTS,
            AUDIT_MODIFICATIONS
        }
    }
}

我这样称呼代码“ParameterUtilities.ParameterEnum.MAX_LOGIN_ATTEMPTS” 问题是每个满月我都会在这一行收到错误“对象引用未设置为对象的实例”。 .. 就像代码只在 99.9% 的情况下有效...

我唯一想到的是,由于枚举是一种值类型,因此在调用静态类时枚举可能为空......但我找不到任何关于这种行为的文档...

有人能告诉我为什么会这样吗?我知道我可能应该从静态类中删除枚举,并将枚举声明为独立的,但我想知道为什么会首先发生这种情况......

谢谢, S

更新

好的,对于要求更多代码的每个人,以下是发生错误的完整功能......

    public static int GetPageSize(int companyId)
    {
        int pageSize = 0;

        // error happens bellow this line

        ESEGURCI.WEB.BusinessLogicLayer.Entities.Parameter parameter = ESEGURCI.WEB.BusinessLogicLayer.Entities.Parameter.GetParameter(ParameterUtilities.ParameterEnum.AUDIT_MODIFICATIONS.ToString(), companyId);

        // error happens above this line

        int.TryParse(parameter.Value, out pageSize);

        return pageSize;
    }

【问题讨论】:

  • 为什么不在课堂之外使用Enum 定义?
  • 这一行不能用 NullReference 抛出,你确定错误不在其他语句中吗?请显示更多代码你如何使用枚举值
  • 异常源于违规行中的其他内容,枚举不能为空。你能告诉我们发生异常的实际代码块吗?
  • 这不能抛出空引用异常。通过您提到的那一行,这意味着您正在获取该类型的 2 个可能值之一。抛出空引用异常的这一行类似于数字 1 或字符串“C# is a language”正在抛出空引用异常。此外,“对象引用未设置为对象的实例”意味着您正在尝试访问尚未初始化或分配值的 ref 类型对象。贴一些代码。
  • GetParameter 可能有问题。将此语句放在 try 块中并捕获异常。另外,当你得到异常时,检查枚举的值,你就会知道枚举不是问题。

标签: c# enums static-class


【解决方案1】:

ParameterUtilities.ParameterEnum.MAX_LOGIN_ATTEMPTS 永远不会抛出空引用异常,无论月球长什么样。该错误可能是由同一行上的另一条指令触发的(赋值给变量?)。

【讨论】:

    【解决方案2】:

    enum 不能是 null

    按照下面的清单拆分行,看看哪个语句引发了异常。我敢打赌它发生在Parameter.GetParameter()的某个地方:

    using ESEGURCI.WEB.BusinessLogicLayer.Entities;
    
    // ...
    
    var auditModifications = 
        ParameterUtilities.ParameterEnum.AUDIT_MODIFICATIONS.ToString();
    var parameter = Parameter.GetParameter(auditModifications, companyId);
    

    【讨论】:

    • 我敢打赌这是第三个,因为如果您查看 OP 的代码 ESEGURCI.WEB.BusinessLogicLayer.Entities.Parameter 是一种类型(请参阅我的回答)。
    • @James 如果Parameter.GetParameter() 不是静态的,它根本不会工作。
    • 是的,我在重新阅读问题后意识到这一点!还是觉得问题出在GetParameter方法上。
    • 抱歉,ESEGURCI.WEB.BusinessLogicLayer.Entities 是一个命名空间...我相应地更新了问题...
    • @bastos.sergio 更容易找到。我相应地更新了我的答案。
    【解决方案3】:

    枚举(和任何其他类型)不能有空值,因为它不是一个值而是一个类型。

    异常是由其他东西引发的。

    【讨论】:

    • 使这一点更加明确——类型不是值(为此,您需要一个实例,不管是静态的还是非静态的)。
    【解决方案4】:

    如前所述,您的enum 不会是错误的来源。根据您的更新,我认为 NRE 很可能来自您的 GetParameter 方法。

    【讨论】:

    • 就像我说的那样,代码在 99.9% 的情况下都能正常工作......静态的 GetParameter 方法没有理由不起作用......如果这不是由于 enum 变量,那么你认为这可以归因于类参数的声明吗?该类被声明为部分......更具体地说是“公共部分类参数”
    • @bastos.sergio "你认为这可以归因于类参数的声明" - 是的,更具体地说是GetParameter 方法。看看里面的代码,看看有没有可能抛出 NRE 的场景。
    • 就是这样......我的日志中的堆栈跟踪没有显示错误源自 Parameter 类......所以你说的对我来说毫无意义......错误开始于函数 GetPageSize 并从那里向下传播...
    • @bastos.sergio 以下行不会抛出 NRE - ParameterUtilities.ParameterEnum.AUDIT_MODIFICATIONS.ToString() 因此只有 2 种其他可能性,GetParameter 中的 NRE 或者它返回 null 然后您尝试稍后在您的代码块中使用。您坚持认为该错误专门发生在该行上,因此我认为这是GetParameter中的错误。
    • 就像我说的堆栈跟踪非常清楚,异常从那行开始......我想正确解决这个问题的唯一方法是添加更多审计代码并等待错误再次出现。 ..
    猜你喜欢
    • 1970-01-01
    • 2015-04-26
    • 2014-06-01
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 2011-06-01
    相关资源
    最近更新 更多