首页 新闻 会员 周边

C#中关于何时使用静态(static)方法的问题?

0
悬赏园豆:20 [已解决问题] 解决于 2019-04-01 19:21

关于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;
        }
C#
BUTTERAPPLE的主页 BUTTERAPPLE | 老鸟四级 | 园豆:3190
提问于:2019-03-20 20:06
< >
分享
最佳答案
4

当用面向对象的编程语言编写面向过程的代码时,自然就会用 static

当面向接口编程(依赖接口)时,想用 static 也用不了

当使用依赖注入时,想用 static 也用不了

收获园豆:10
dudu | 高人七级 |园豆:30994 | 2019-03-20 20:49

平时写代码时,写工具类,或者说无状态时,使用了Static,但如果说无状态又不够严谨,比如我如果就想要一个变量,记录这个类的状态,那又得用 static了。还要慢慢摸索一下。

BUTTERAPPLE | 园豆:3190 (老鸟四级) | 2019-04-01 19:21
其他回答(3)
0

没有对象依赖的工具方法吧.

吴瑞祥 | 园豆:29449 (高人七级) | 2019-03-20 20:33

没有,这个方法在一个非静态类中的非静态方法里面调用了

支持(0) 反对(0) BUTTERAPPLE | 园豆:3190 (老鸟四级) | 2019-03-20 20:42
1

是否使用静态,相信楼主肯定知道静态与实例方法的调用区别:一个是类型调用,一个是实例调用。个人建议更应该从OOP的角度思考这个问题:什么样的行为是需要具体的对象去执行的,什么样的行为是某一个类型/类别拥有的?
举个例子:每个人都有自己的姓名、工作方式、成长经历这些实例属性或方法。人类的历史或者说发展史是由每个人组成,但却不是属于具体某个人的,而是整个人类的。这种场景就可能需要考虑到用静态去描述。
具体一点:System.Net.WebRequest类的Create方法,不管子类是HttpWebRequest还是FtpWebRequest,只要是这种类型都有一种Create请求的行为。所以将该方法设计为类型的静态方法(而不是父类上的实例方法),至于创建出来的WebRequest到底是Http还是Ftp,这个根据你传入的url参数内部处理好了,不用关心。还可以注意到的一点是WebRequest父类是抽象的,或者会对你更有启发。
另外,静态方法并不是线种安全的。使用静态方法,还需要考虑多线程环境下对资源操作的原子性处理。
以上,希望对楼主有所帮助。

收获园豆:5
碧海清天 | 园豆:156 (初学一级) | 2019-03-21 10:01

感谢您提供的建议和见解

支持(0) 反对(0) BUTTERAPPLE | 园豆:3190 (老鸟四级) | 2019-03-21 10:56
0

我也献丑一下...

  • 静态成员在加载类的时候就会被加载, 并通过类进行访问.
  • 非静态成员在对象实例化时被创建, 通过对象来进行访问.

根据静态和非静态成员创建时的方式不同, 导致一个类的所有实例的同一静态变量的值是同一个. 同一个类的不同实例的同一非静态变量的值可以是不同的值. 所以你在写项目的时候, 是否可以考虑, 如果类的所有实例的一个参数都为同一个值得话, 给弄成static的好一些?

收获园豆:5
YanyuWu | 园豆:221 (菜鸟二级) | 2019-03-21 11:08
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册