【问题标题】:C# Is it possible to call a method from a property within a class?C# 是否可以从类中的属性调用方法?
【发布时间】:2013-05-16 19:59:13
【问题描述】:

所以我对编程很陌生,我尝试通过尝试很多东西来学习新东西。但此刻我卡在了一些东西上……

基本上我想要完成的是能够使用以下代码行: Url.QueryStringParser.HasParam(""); Url 是类,QueryStringParser 是 Url 类中的属性,HasParamQueryStringParser 类中的方法。 它有效,期待我在QueryStringParser 属性上获得NullReferenceException 的事实。而且我无法弄清楚为什么会发生这种情况......

这是Url 类。

public class Url
{
    public static QueryStringParser QueryStringParser { get; private set;}
}

这是 QueryStringParser 类。

public class QueryStringParser
{
    public bool HasParam(string parameter)
    {
        return !string.IsNullOrEmpty(HttpContext.Current.Request[parameter]);
    }
}

这是我的 asp.net 网页。

if (Url.QueryStringParser.HasParam("Id"))
{ 
    // Do stuff.
}

所以我的问题是,是否可以像我刚才提到的那样创建一些东西?

【问题讨论】:

  • 试试看。它编译吗?它运行吗?这是一个问题的示例,您可以通过自己尝试和玩耍来更快地获得答案,而不是在这里提问。
  • 试试看。它奏效了吗?如果没有,出了什么问题?这就是你应该问的问题。

标签: c# class methods properties


【解决方案1】:

您的问题在于属性QueryStringParser 调用HasParam 方法需要对象QueryStringParser 的实例(名称选择错误)。此实例永远不会由您的代码创建,因此会出现 NullReferenceException。
所以你需要在你的属性的get和set中修改一些代码

public class Url
{
    private static QueryStringParser _qsp = null;
    public static QueryStringParser QueryStringParser 
    { 
       get
       {
          if(_qsp == null) _qsp = new QueryStringParser();
          return _qsp;
       }
       private set
       { 
           _qsp = value;
       }
    }
}

通过此更改,当您需要该属性时,您的代码将检查它是否为空,并初始化用于存储 QueryStringParser 实例的内部对象,然后返回此实例。

绕过异常的另一种可能性是使您的 HasParam 方法也静态,在这种情况下,您不需要对象 QueryStringParser 的实例。

顺便说一句,虽然它可以工作,但我发现将属性命名为类非常令人困惑。我建议为该属性选择另一个名称QueryStringParser

【讨论】:

  • 啊,好的,谢谢你的解释^.^我将用这些东西做更多的实验,并在互联网上阅读更多关于它的内容以完全理解它。
【解决方案2】:

您需要做的就是在 URL 的静态构造函数中为其分配一个实例:

public class Url
{
     public static Url()
     { 
         QueryStringParser = new QueryStringParser();
     }

     public static QueryStringParser QueryStringParser { get; private set;}
}

【讨论】:

    【解决方案3】:
    public class Url
    {
        public static QueryStringParser QueryStringParser { get; private set; }
    }
    

    这是不对的,你需要创建一个类的实例来访问它的方法和属性。我认为这对你来说是一个很好的学习练习来研究这个问题并解决它。

    【讨论】:

      猜你喜欢
      • 2014-04-30
      • 1970-01-01
      • 2011-01-17
      • 1970-01-01
      • 2013-05-22
      • 1970-01-01
      • 2015-11-14
      • 2010-10-28
      • 1970-01-01
      相关资源
      最近更新 更多