我有一个这样的课程
#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”。我认为你现在遇到了问题。
我试图通过再次声明静态变量值来解决这个问题,但它似乎不是编写程序的好方法。
我试图使属性非静态。但它返回错误,因为NavigationCall()是一个静态函数,我不能在其中调用非静态属性。
现在我正在寻找解决这个问题的正确方法,我认为这个问题是由于对OOPS概念的错误理解而来找我的。任何人都可以在这里解决问题,或者问题是否存在问题在某些资源中,我可以理解如何找到解决方案?
答案 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] + "&";
}
}