关于c#静态方法和实例方法的辨析和应用

作者&投稿:单于屠 (若有异议请与网页底部的电邮联系)
~

  本文将围绕c#静态方法和实例方法讨论一下 针对一些观点 如 静态方法是常驻内存 还有 静态方法比实例方法先装载 做一个辨析 同时讨论下何时用静态方法 何时用实例方法

  前几日 在微软的好友发给我一个链接 《静态方法和实例化方法之间的区别你知道了嘛? 欢迎讨论!! 问题最终 》 然后说这里某些观点需要澄清一下 希望我写一篇blog 我当时读了这篇blog 文比较短 列举了静态方法和实例方法的几种案例 也没有论点 然后就请大家讨论 后面评论就比blog热闹多了 言辞也激烈 后来该blog作者干脆把这篇blog删了 现在已经看不到这篇blog了 现在我写这篇blog 一是针对一些观点做个辨析 二是完成好友的所托

  c#静态方法和实例方法的几种用法

  见如下代码 这三种形式我们应该都用过

  view sourceprint? public class SomeClass

   {

        private string myfield = null;

        public static instance = new SomeClass();

        public instranceMethod() {};

        public static staticMethod() {};

   }

  

   public class AnotherClass

   {

        public static Main()

        {

            //第一种方式 声明实例 调用实例方法

          SomeClass someClass = new SomeClass();

             someClass instanceMethod();

  

            //第二种方式 通过一个静态的实例 去调用实例方法

          SomeClass instance instanceMethod();

  

            //第三种方式 直接调用静态方法

          SomeClass staticMethod();

        }

   }

  这几种方式在调用时间 还有线程安全 面向对象的编程方面都有差别 后文会谈到

   静态方法是常驻内存

  这是那位blog作者在评论中给出的观点 我觉得 静态方法是常驻内存 的说法是不对的 要知道一类型的静态方法是属于这类型的 而这类型是一 程序集的一部分 这程序集是被一个AppDomain装入到内存里面来的 这个AppDomain是可以从内存卸载的 一个 CLR的进程里面可以有多于一个的AppDomain 第一个AppDomain之后的AppDomain都可以动态创建和卸载 这些AppDomain中程序集 既可以有静态方法 也可以有实例方法 不管是静态方法还是实例方法 都是随其程序集所在的AppDomain一起创建和卸载 第一个AppDomain在整个程序运行结束时也会最后被卸载 其中所含程序集自然也卸载 看图 会更明白点 所以静态方法不存在常驻内存一说

  图

   静态方法比实例方法先装载

  这也是那篇blog的评论中某些人提出的观点 我不知道他们的论据是什么 但是我已经做过实验 而且也写过这两篇blog关反射和metadata加载 致Jeffray Zhao等几位和firelong和[继续讨论]关于Windows assembly的加载来证程序集的加载方式是整个地加载 而不是用到某个metadata才加载该metadata 用到某个方法才加载该方法 因为静态方法和实例方法同属于一类型 而一类型属于一程序集 在整个地加载一程序集的时候 不管是静态方法还是实例方法 都随该程序集全部加载进内存 所以 静态方法比实例方法先装载 也是不成立的

  何时用静态方法 何时用实例方法

  先说实例方法 当你给一个类写一个方法 如果该方法需要访问某个实例的成员变量时 那么就将该方法定义成实例方法 一类的实例通常有一些成员变量 其中含有该实例的状态信息 而该方法需要改变这些状态 那么该方法需要声明成实例方法

  静态方法正好相反 它不需要访问某个实例的成员变量 它不需要去改变某个实例的状态 我们把该方法定义成静态方法

  第一种方式 声明实例 调用实例方法

  当一个类有多个实例 例如学生这个类 实例可以有学生甲 学生乙 学生丙 等等 我们就用第一种方式 在多线程的情况下 只要每个线程都创建自己的实例 那么第一种方法通常是线程安全的

  第二种方式 通过一个静态的实例 去调用实例方法

  这种情况比较特殊 通常是整个程序里该类唯一的一个实例 我们通过调用该实例的实例方法来改变该实例的某些状态 这一个实例在多线程的情况下 通常是线程不安全的 除非我们给这个实例加锁 防止其他线程访问该实例

  第三种方式 直接调用静态方法

lishixinzhi/Article/program/net/201311/11604




于成龙简介个人资料
于成龙在二十余年的宦海生涯中,三次被举“卓异”,所到之处,皆有政声。尤其是始终清廉自守,多行善政,深得士民爱戴。康熙帝赞誉他为“天下廉吏第一”,是清代循吏的代表人物。历史评价:康熙曾破例亲自撰碑文并题写“高行清粹”匾额赐给于成龙,评价他为“清官第一,天下第一廉吏” 。康熙帝后来...

于成龙个人介绍
于成龙(1638年~1700年),汉军镶红旗人,字振甲,号如山。历任乐亭知县、通州知州、江宁知府、安徽按察使、直隶巡抚、都察院左都御史、汉军都统、兵部尚书、加总督衔直隶巡抚、河道总督等职。康熙三十九年,病卒于淮安河道总督署,享年六十三岁,谥号襄勤。青少年时代的于成龙是在不断的移居中生活的,颠...

廉吏于成龙文言文翻译
以下是对“廉吏于成龙”的文言文翻译:原文 于成龙,字北溟,山西永宁人。顺治十八年,以副榜贡生授广西罗城知县,年四十五矣。罗城当万山,中多瘴疠。大盗时扰,居民鲜少。成龙到官,招抚流亡,躬自劝课,给以牛种,民率得安居乐业。累迁至直隶通州知州。翻译 于成龙,字北溟,山西永宁人。顺治十八年...

于成龙相当于现在什么官
于成龙相当于现代地方局书记官。于成龙在古代中国的官职体系中有丰富的经历,职务包括但不限于县令、知州、同知、知府、两江总督等,相当于现代的兼任政协副主席的地方局书记,行政级别高于副国级,稍低于正国级。于成龙(1638年至1700年),汉军镶红旗人,字振甲,号如山,历任乐亭知县、通州知州、江宁...

于成龙传原文及翻译
于成龙传原文如下:于成龙,字北溟,山西永宁人。顺治十八年,授广西罗城知县。罗城居万山中,盛瘴疠,民犷悍。方兵后,遍地榛莽,县中居民仅六家,无城郭廨舍。[u]成龙到官,召吏民拊循之,申明保甲。盗发即时捕治,请於上官,谳实即处决,民安其居,尽力耕耘。与民相爱如家人父子。牒上官请宽徭役...

于成龙简介 于成龙的后代
于 成龙 简介 于 成龙 (1617年9月26日—1684年5月31日) 字北溟,号于山,清代山西永宁州(今山西省吕梁市方山县)人。 1661年(清十八年),被任命为罗城县知县,在任上明确保甲制度,百姓安居乐业,全力耕作土地。1667年(清康熙六年),于 成龙 升任四川合州知州。后迁任湖广黄冈的知州,历任...

于成龙简介
于成龙(1617年9月26日—1684年5月31日) 字北溟,号于山,清代山西永宁州(今山西省吕梁市方山县)人。1661年(清顺治十八年),于成龙被任命为罗城县知县,在任上明确保甲制度,百姓安居乐业,全力耕作土地。1667年(清康熙六年),于成龙升任四川合州知州。后迁任湖广黄冈的知州,历任代理武昌知府...

于成龙简介(中国电影动作巨星)
成龙(JackieChan),原名陈港生,1954年4月7日出生于中国香港,华语电影演员、导演、制作人、编剧、歌手、武术指导、配音演员、商人。他以其独特的动作喜剧风格和对危险特技的极高执着度而闻名于世,被誉为“中国电影动作巨星”。成龙出生在一个贫苦的家庭,父母都是工人。他的父亲曾在澳门赌场做过保安...

于成龙简介:曾被康熙皇帝称为古今第一清官
顺治十八年,一个名叫于成龙的中年人,在广西罗城县当了县令。于成龙,永宁县人,农民出身。他经历过明清交替,看得清沧桑,深知民间疾苦。当时都说广西烟雨弥漫,北方人十有八九活不下去。当时于成龙已经45岁了,家里还有点财产,可以养家的生计。他的亲戚朋友都劝他不要去。然而,于成龙立即卖掉了...

小于成龙的事迹有哪些?
于成龙生于1638年8月14日(清崇德三年农历七月初五),出生地为辽东盖州。1700年4月16日(康熙三十九年农历二月二十七)卒于淮安河道总督署,享年六十三岁。于成龙生父为于国安,生母为康氏。于成龙11岁举家从龙入关至北京通州,后移居通州张家湾。于成龙13岁时又移居延庆州,16岁时又移居固安南房上村...

饶平县15533399534: C#的静态方法和实例化方法的区别 -
悟雍脂康: 静态方法和非静态方法的区别总结如下: 1、静态方法属于类所有,类实例化前即可使用; 2、非静态方法可以访问类中的任何成员,静态方法只能访问类中的静态成员; 3、因为静态方法在类实例化前就可以使用

饶平县15533399534: C# 中静态方法和实例方法分别指的是什么? -
悟雍脂康: 实例方法,就是对象的方法,静态方法,是类的方法.实例方法不能直接调用,需要实例化类产生一个对象以后,掉用这个类下面的实例方法.静态方法不属于任何一个对象,它直属于类的方法,静态方法不能调用非静态的方法,因为这时的实例方法还没有分配地址.是NULL.但是其他方法可以任意掉用静态方法.public static int add(int i,int j){}//静态方法,即不需要实例化一个对象就可以直接调用.public void remove(){}//实例方法,需要产生一个对象才能调用.带static就是静态方法了C#是面向对象的语言,对象的概念一定要有认识

饶平县15533399534: 静态方法和实例方法的区别 -
悟雍脂康: 关于静态方法和实例方法的一些误区. 一、 静态方法常驻内存,实例方法不是,所以静态方法效率高但占内存. 事实上,方法都是一样的,在加载时机和占用内存上,静态方法和实例方法是一样的,在类型第一次被使用时加载.调用的速度基...

饶平县15533399534: c#请说明什么是类的实例方法和静态方法,以及它们间的区别.
悟雍脂康: 静态方法与实例方法的区别 静态方法方法是属于类的方法,实例方法是属于由类的对象的方法.比如: class A {public static void F1() {};public void F2() {}; }你可以这样用F1 A.F1(); 但是A.F2()就会出错. 可以这样用F2, A a = ...

饶平县15533399534: C#中静态方法,实例方法,构造方法之间的区别和联系!请详细些. -
悟雍脂康: 静态方法需要加static关键字,程序在运行时内存中就已经存在.在调用的时候直接使用class.function()即可,不需要实例化. 实例方法只有在类被实例化后才能调用.比如class c = new class(); c.function(); 构造函数是类在实例化的时候执行的.比如下面那个类在实例化时可以a ca = new a(); 或者a ca = new a(1); class a{ function a(){ } function a(int number){ Console.Write(number); } }

饶平县15533399534: c# 静态方法和实例化后的方法使用起来有什么不同,有什么区别? -
悟雍脂康: 怎么感觉楼上的回答没有说出精髓啊..我来个精髓的..呵呵..他们使用的时候..表象上看是一个需要实例化 一个不需要..其实他们最最重要的区别不在这里..对于静态方法和一些静态的东西..譬如说静态变量啊什么的..这些是程序开始运行的时候就一直...

饶平县15533399534: C#中静态方法和非静态方法的区别 -
悟雍脂康: "C#静态方法与非静态方法的区别不仅仅是概念上的,那么他们有什么具体的区别呢?让我们通过本文向你做一下解析.C#的类中可以包含两种方法:C#静态方法与非静态方法.那么他们的定义有什么不同呢?他们在使用上会有什么不同呢?...

饶平县15533399534: C#中【静态方法】和【非静态方法】的区别?! -
悟雍脂康: 静态方法:1.可以直接用,不用new也就是实例化,通过类名加个点就可以用了2.静态方法里只可以用静态的东西3.静态方法的生命周期长,也就是说,定义一个静态变量,你往里面存东西可以一直存在4.定义的静态方法在内存中有固定的位置,所以一个程序最好不要有太多的静态方法 非静态方法:参考静态方法(取反) 不明白再留言吧#_#

饶平县15533399534: C#中的静态方法与非静态方法的区别是什么? 回答: 19 人气: 152
悟雍脂康: 实例方法比静态方法多传递一个隐含的指针参数,该指针指向该方法所从属的已被实例化的对象.这一区别的外在表现为实例方法内可使用this关键字代表所从属的实例对象,而静态方法不可使用this因为静态方法不针对任何实例对象.实例对象...

饶平县15533399534: 在C#中什么是静态方法,,实例方法? -
悟雍脂康: 1.静态变量 在C#程序中,没有全局变量的概念,这意味着所有的成员变量只有该类的实例才能操作这些数据,这起到了“信息隐藏”的作用.但有些时候,这样做却不是个明智的选择.假设我们要定义一个图书类,要求该类能保存图书的数量...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网