关于C#中的Static 关键字,用法和作用不必多说,大家耳熟能详的有 静态类、字段、方法、属性、运算符、事件和构造函数等等
静态方法,
public static void TestStaticMethod()
{
//...
}
类中的静态属性声明,
class TestA
{
static int a = 10;
//...
public TestA(){}
}
最近在看项目代码想重构时,发现下面这段代码:我搞不懂为何要声明为static
的呀?我想请问的是我什么时候应该使用static声明一个方法?有最佳实践吗?
public static HttpResponse GetResponse(HttpRequest request)
{
HttpWebRequest httpWebRequest = GetWebRequest(request);
HttpResponse httpResponse = new HttpResponse(httpWebRequest.RequestUri.AbsoluteUri);
HttpWebResponse httpWebResponse = null;
try
{
httpWebResponse = (HttpWebResponse) httpWebRequest.GetResponse();
}
catch (WebException ex)
{
if (ex.Response != null)
{
httpWebResponse = (HttpWebResponse) ex.Response;
}
else
{
throw new ClientException(ex.ToString());
}
}
catch (Exception ex)
{
throw new ClientException(ex.ToString());
}
return httpResponse;
}
当用面向对象的编程语言编写面向过程的代码时,自然就会用 static
当面向接口编程(依赖接口)时,想用 static 也用不了
当使用依赖注入时,想用 static 也用不了
平时写代码时,写工具类,或者说无状态时,使用了Static,但如果说无状态又不够严谨,比如我如果就想要一个变量,记录这个类的状态,那又得用 static了。还要慢慢摸索一下。
没有对象依赖的工具方法吧.
没有,这个方法在一个非静态类中的非静态方法里面调用了
是否使用静态,相信楼主肯定知道静态与实例方法的调用区别:一个是类型调用,一个是实例调用。个人建议更应该从OOP的角度思考这个问题:什么样的行为是需要具体的对象去执行的,什么样的行为是某一个类型/类别拥有的?
举个例子:每个人都有自己的姓名、工作方式、成长经历这些实例属性或方法。人类的历史或者说发展史是由每个人组成,但却不是属于具体某个人的,而是整个人类的。这种场景就可能需要考虑到用静态去描述。
具体一点:System.Net.WebRequest类的Create方法,不管子类是HttpWebRequest还是FtpWebRequest,只要是这种类型都有一种Create请求的行为。所以将该方法设计为类型的静态方法(而不是父类上的实例方法),至于创建出来的WebRequest到底是Http还是Ftp,这个根据你传入的url参数内部处理好了,不用关心。还可以注意到的一点是WebRequest父类是抽象的,或者会对你更有启发。
另外,静态方法并不是线种安全的。使用静态方法,还需要考虑多线程环境下对资源操作的原子性处理。
以上,希望对楼主有所帮助。
感谢您提供的建议和见解
我也献丑一下...
根据静态和非静态成员创建时的方式不同, 导致一个类的所有实例的同一静态变量的值是同一个. 同一个类的不同实例的同一非静态变量的值可以是不同的值.
所以你在写项目的时候, 是否可以考虑, 如果类的所有实例的一个参数都为同一个值得话, 给弄成static的好一些?