在C#中使用静态函数和变量的困难

时间:2013-10-04 06:51:27

标签: c# asp.net oop

我有一个这样的课程

#region Properties
    private static string inputURL;
    public static string InputURL
    {
        get { return inputURL; }
        set { inputURL = value; }
    }
    private static string outputURL;
    private static string ffBaseURL = "format=xml&";
    public static string FFBaseURL
    {
        get { return ffBaseURL; }
        set { ffBaseURL = value; }
    }
    private static string excludeParam = "fullurl,log";
    public static string ExcludeParam
    {
        get { return excludeParam; }
        set { excludeParam = value; }
    }
    private static string currentCategoryID = "234";
    public static string CurrentCategoryID
    {
        get { return currentCategoryID; }
        set { currentCategoryID = value; }
    }
    private static string navigationParameters = "query=*&log=navigation&filterCategoryId=" + currentCategoryID;
    public static string NavigationParameters
    {
        get { return navigationParameters; }
        set { navigationParameters = value; }
    } 
    #endregion

    #region Methods
    public static string NavigationCall()
    {

        List<string> excludeParams = new List<string>(excludeParam.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries));
        foreach (string key in HttpContext.Current.Request.QueryString.Keys)
        {
            if (!excludeParams.Contains(key))
            {
                FFBaseURL += key + "=" + HttpContext.Current.Request[key] + "&";
            }
        }
        FFBaseURL += NavigationParameters;


        if (Common.IsInternalIP())
        {
            FFBaseURL += "&log=internal";
        }
        outputURL = ffBaseURL;
        return outputURL;
    } 
    #endregion

正如你所看到我有一个名为NavigationCall()的静态函数,这个函数必须保持静态。当我从我的网站调用这个函数时,由于静态属性,函数在每个函数调用中返回错误的值声明。我们都知道静态属性会在执行程序后保留它们的值。

所以,当我第一次调用这些函数时,我得到一个结果“tesresult1”,第二次当我重新加载我的网页时,它给我一个结果“testresult1testresult1”。我认为你现在遇到了问题。

  1. 我试图通过再次声明静态变量值来解决这个问题,但它似乎不是编写程序的好方法。

  2. 我试图使属性非静态。但它返回错误,因为NavigationCall()是一个静态函数,我不能在其中调用非静态属性。

  3. 现在我正在寻找解决这个问题的正确方法,我认为这个问题是由于对OOPS概念的错误理解而来找我的。任何人都可以在这里解决问题,或者问题是否存在问题在某些资源中,我可以理解如何找到解决方案?

3 个答案:

答案 0 :(得分:4)

您可以将所有参数传递给静态方法,而不是使用静态属性。

public static string NavigationCall(
     string inputURL,
     string ffBaseURL,
     string excludeParam,
     string currentCategoryID,
     string navigationParameters
)
{
     // the body of your method
}

答案 1 :(得分:3)

您还可以将所有属性捆绑到Custom对象中并​​将其传递给方法。此外,您必须使NavigationCall线程对任何解决方案都安全。 Are static methods thread safe ?

public static string NavigationCall(CustomNavigation objCustomNavigation)

//Custom object.
public class CustomNavigation
{
  public string InputURL {get;set;}
  public string FBaseURL{get;set;}
  public string ExcludeParam{get;set;}
  public string CurrentCategoryID {get;set;}
  public string NavigationParameters{get;set;}
}

答案 2 :(得分:2)

我建议introduce a parameter object(正如@mit所建议的那样)并利用这个机会在那里封装你的一些逻辑。这应该会立即简化您的方法。也许你可以将这些属性中的一些私有化,因为它们仅在封装在参数对象中的逻辑中需要。

    //Your static method
    public static string NavigationCall(CustomNavigation customNavigation)

    //Disclaimer: I have no idea, whether this is an appropriate name. 
    //It really depends on what you want to do with his class
    class CustomNavigation
    {
        public string InputURL { get; private set; }
        public string FFBaseURL { get; private set; }
        public IEnumerable<string> ExcludeParams { get; private set; }
        public string CurrentCategoryID { get; private set; }
        public string NavigationParameters { get; private set; }

        public CustomNavigation(string inputUrl, string excludeParam, string fBaseUrl, string currentCategoryID, string navigationParameters)
        {
            // various guard clauses here...

            NavigationParameters = navigationParameters;
            CurrentCategoryID = currentCategoryID;
            FFBaseURL = fBaseUrl;
            InputURL = inputUrl;

            // Parse string here -> Makes your method simpler
            ExcludeParams = new List<string>(excludeParam.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries));
        }

        //Example for encapsulating logic in param object
        public void AddKeys(HttpContext currentContext)
        {
            var keys = currentContext.Request.QueryString.Keys
                        .Cast<string>()
                        .Where(key => !ExcludeParams.Contains(key));

            foreach (var key in keys)
                FFBaseURL += key + "=" + currentContext.Request[key] + "&";
        }
    }