精华内容
参与话题
问答
  • C#中静态与非静态方法比较

    千次阅读 2013-07-23 22:31:08
    C#静态方法与非静态方法的区别不仅仅是概念上的,那么他们有什么具体的区别呢?让我们通过本文向你做一下解析。 C#的类中可以包含两种方法:C#静态方法与非静态方法。那么他们的定义有什么不同呢?他们在使用上会有...

    C#静态方法与非静态方法的区别不仅仅是概念上的,那么他们有什么具体的区别呢?让我们通过本文向你做一下解析。

    C#的类中可以包含两种方法:C#静态方法与非静态方法。那么他们的定义有什么不同呢?他们在使用上会有什么不同呢?

    让我们来看看最直观的差别:使用了static 修饰符的方法为静态方法,反之则是非静态方法。

    下面我们分四个方面来看看C#静态方法与非静态方法的差异:

    C#静态方法与非静态方法比较一:
    C#静态成员:
    1、静态成员属于类所有,非静态成员属于类的实例所有。
    2、每创建一个类的实例,都会在内存中为非静态成员新分配一块存储;

    3、静态成员属于类所有,为各个类的实例所公用,无论类创建了多少实例,类的静态成员在内存中只占同一块区域。

    C#静态方法与非静态方法比较二:
    C#静态方法
    1、C#静态方法属于类所有,类实例化前即可使用。
    2、非静态方法可以访问类中的任何成员,静态方法只能访问类中的静态成员。
    3、因为静态方法在类实例化前就可以使用,而类中的非静态变量必须在实例化之后才能分配内存,

    这样,C#静态方法调用时无法判断非静态变量使用的内存地址。所以无法使用。而静态变量的地址对类来说是固定的,故可以使用。

    C#静态方法与非静态方法比较三:
    C#静态方法是一种特殊的成员方法 它不属于类的某一个具体的实例,而是属于类本身。所以对静态方法不需要首先创建一个类的实例,而是采用类名.静态方法的格式 。
    1.static方法是类中的一个成员方法,属于整个类,即不用创建任何对象也可以直接调用! static内部只能出现static变量和其他static方法!而且static方法中还不能使用this....等关键字..因为它是属于整个类!
    2.静态方法效率上要比实例化高,静态方法的缺点是不自动进行销毁,而实例化的则可以做销毁。
    3.静态方法和静态变量创建后始终使用同一块内存,而使用实例的方式会创建多个内存.
    4.C#中的方法有两种:实例方法,静态方法.

    C#静态方法与非静态方法比较四:
    C#静态方法中获取类的名称
    静态方法中用:
    string className =   System.Reflection.MethodBase.GetCurrentMethod().ReflectedType.FullName;

    非静态方法中还可以用:
    string className = this.GetType().FullName; 

    具体示例:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace _14静态类静态成员
    {
        class Program
        {
            static void Main(string[] args)
            {
                MyClass mc = new MyClass();
                mc.M1();
    
                //1>调用静态方法的时候必须通过类名直接来调用,不能通过对象来调用,也就是说使用静态成员不需要实例化对象。
                //2>静态成员会在整个应用程序退出时,才释放资源,所以可以在整个应用程序中共享数据。
                //3>静态类不能被实例化,不能被继承。
                //4>由于静态成员会在整个程序退出时,才释放资源,所以尽量避免写静态字段或静态属性,最好只写静态方法。
                //5>当给一个普通类添加静态字段后,系统会默认为该类生成一个静态构造函数【静态构造函数不能有访问修饰符、并且也不能带参数】
                //6>静态类的构造函数,只会在第一次使用静态类之前,执行,并且只会执行一次。
                //静态构造函数不能有访问修饰符,不能有参数。
    
                MyClass my = new MyClass();
                //非静态方法,调用方式:实例名.方法名
                my.M1();
    
                // 静态方法,调用方式:类名.方法名
                MyClass.M2();
                Console.ReadKey();
    
                //1.什么情况下要将一个类标记为静态类?
                //答:当这个类是一个工具类,里面都是方法。为了让用户调用的时候方便,不需要实例化对象
                //这时可以将该类标记为static类,此时该类中只能包含静态成员,不能包含实例成员。比如:Convert、Math、File、Console....
                
                //2.什么情况下需要在一个普通类中编写一个静态成员,而这个类不能标记为static?
                //- 当这个类需要被实例化的时候。如果这个类中有一个成员是所有对象都共享的数据,
                //这时可以将该类中的这个成员标记为静态的,但是这个类还是一个实例类。
    
            }
        }
    
        /// <summary>
        /// 非静态方法,调用方式:实例名.方法名
        /// </summary>
        class MyClass 
        {
            public void M1() 
            {
                Console.WriteLine("M1");
            }
    
            //static:静态
            /// <summary>
            /// 静态方法,调用方式:类名.方法名
            /// </summary>
            public static void M2() 
            {
                Console.WriteLine("M2");
            }
        }
    }

    C#静态方法与非静态方法的区别解析旨在诠释C#静态方法的含义,希望对你了解和学习C#静态方法与非静态方法有所帮助。 



    展开全文
  • C# 之 静态方法和非静态方法对比

    千次阅读 2019-03-29 22:15:55
    C# 静态方法和非静态方法简析, C# 静态方法和非静态方法的区别, C# 静态方法和非静态方法的内存占用误解

    C#静态成员

    静态成员属于类所有,为各个类的实例所公用,无论类创建了几多实例,类的静态成员在内存中只占同一块区域。

    1. 、静态成员属于类所有,非静态成员属于类的实例所有。
    2. 、每创建一个类的实例,都市在内存中为非静(动)态成员新分派一块存储;

    静态数据成员区别于动态数据成员,静态变量并不是稳定的,只是静态变量在声明的时候不管有没有赋值,都会凭据它的类型分派对应的内存空间,他的可访问性和作用区间与动态变量是一样的


    非静态类可以包含静态方法、字段、属性或事件。 即使未创建类的任何实例,也可对类调用静态成员。 静态成员始终按类名(而不是实例名称)进行访问。 静态成员只有一个副本存在(与创建的类的实例数有关)。 静态方法和属性无法在其包含类型中访问非静态字段和事件,它们无法访问任何对象的实例变量,除非在方法参数中显式传递它。
    更典型的做法是声明具有一些静态成员的非静态类(而不是将整个类都声明为静态)。 静态字段的两个常见用途是保留已实例化的对象数的计数,或是存储必须在所有实例间共享的值。
    静态方法可以进行重载,但不能进行替代,因为它们属于类,而不属于类的任何实例。
    虽然字段不能声明为 static const,不过 const 字段在其行为方面本质上是静态的。 它属于类型,而不属于类型的实例。 因此,可以使用用于静态字段的相同 ClassName.MemberName 表示法来访问常量字段。 无需进行对象实例化。



    通常我们调用方法的三种形式:

    	class Program
        {
            static void Main(string[] args)
            {
                //第一种方式, 声明实例,调用实例方法   
                ClassName someClass = new ClassName();
                ClassName.Method();
                //第二种方式,通过一个静态的实例,去调用实例方法   
                ClassName.instance.Method();
                //第三种方式,直接调用静态方法   
                ClassName.Method();
    	}
    }
    

    有时候我们对静态方法和实例化方法会有一些误解。

    下文参考链接:https://blog.csdn.net/BIAOBIAOqi/article/details/6732117

    1、大家都以为 “ 静态方法常驻内存,实例方法不是,所以静态方法效率高但占内存。”

    要知道一个.NET类型的静态方法是属于这个.NET类型的。而这个.NET类型是一个.NET 程序集的一部分。这个.NET程序集是被一个AppDomain装入到内存里面来的。这个AppDomain是可以从内存卸载的。一个有.NET CLR的进程里面可以有多于一个的AppDomain,第一个AppDomain之后的AppDomain都可以动态创建和卸载。这些AppDomain中的.NET程序集,既可以有静态方法,也可以有实例方法。不管是静态方法还是实例方法,都是随其程序集所在的AppDomain一起创建和卸载。第一个AppDomain在整个程序运行结束时也会最后被卸载。其中所含的.NET程序集自然也卸载

    静态方法不存在常驻内存一说,在加载时机和占用内存上,静态方法和实例方法是一样的,在类型第一次被使用时加载。调用的速度基本上没有差别。

    2、大家都以为 “ 静态方法在堆上分配内存,实例方法在堆栈上”

    事实上所有的方法都不可能在堆或者堆栈上分配内存,方法作为代码是被加载到特殊的代码内存区域,这个内存区域是不可写的。

    方法占不占用更多内存,和它是不是static没什么关系。
    因为字段是用来存储每个实例对象的信息的,所以字段会占有内存,并且因为每个实例对象的状态都不一致(至少不能认为它们是一致的),所以每个实例对象的所有字段都会在内存中有一分拷贝,也因为这样你才能用它们来区分你现在操作的是哪个对象。
    但方法不一样,不论有多少个实例对象,它的方法的代码都是一样的,所以只要有一份代码就够了。因此无论是static还是non-static的方法,都只存在一份代码,也就是只占用一份内存空间。
    同样的代码,为什么运行起来表现却不一样?这就依赖于方法所用的数据了。主要有两种数据来源,一种就是通过方法的参数传进来,另一种就是使用class的成员变量的值……

    3、大家都以为 “实例方法需要先创建实例才可以调用,比较麻烦,静态方法不用,比较简单”

    事实上如果一个方法与他所在类的实例对象无关,那么它就应该是静态的,而不应该把它写成实例方法。所以所有的实例方法都与实例有关,既然与实例有关,那么创建实例就是必然的步骤,没有麻烦简单一说。

    当然你完全可以把所有的实例方法都写成静态的,将实例作为参数传入即可,一般情况下可能不会出什么问题。

    从面向对象的角度上来说,在抉择使用实例化方法或静态方法时,应该根据是否该方法和实例化对象具有逻辑上的相关性,如果是就应该使用实例化对象 反之使用静态方法。这只是从面向对象角度上来说的。

    如果从线程安全、性能、兼容性上来看 也是选用实例化方法为宜。



    我们为什么要把方法区分为:静态方法和实例化方法 ?

    如果我们继续深入研究的话,就要脱离技术谈理论了。早期的结构化编程,几乎所有的方法都是“静态方法”,引入实例化方法概念是面向对象概念出现以后的事情了,区分静态方法和实例化方法不能单单从性能上去理解,创建c++,java,c#这样面向对象语言的大师引入实例化方法一定不是要解决什么性能、内存的问题,而是为了让开发更加模式化、面向对象化。这样说的话,静态方法和实例化方式的区分是为了解决模式的问题。

    展开全文
  • C#静态方法与非静态方法

    千次阅读 2013-03-22 22:19:22
    C#静态方法与非静态方法 C#的类中可以包含两种方法:静态方法和非静态方法。 使用了static 修饰符的方法为静态方法,反之则是非静态方法静态方法是一种特殊的成员方法,它不属于类的某一个具体的实例,而是...

    C#静态方法与非静态方法

    C#的类中可以包含两种方法:静态方法和非静态方法。

    使用了static 修饰符的方法为静态方法,反之则是非静态方法。

    静态方法是一种特殊的成员方法,它不属于类的某一个具体的实例,而是属于类本身。所以对静态方法不需要首先创建一个类的实例,而是采用类名.静态方法的格式 。


    1)static方法是类中的一个成员方法,属于整个类,即不用创建任何对象也可以直接调用。

    static内部只能出现static变量和其他static方法,而且static方法中还不能使用this等关键字,因为它是属于整个类。
    2)静态方法效率上要比实例化高,静态方法的缺点是不自动进行销毁,而实例化的则可以做销毁。

    3)静态方法和静态变量创建后始终使用同一块内存,而使用实例的方式会创建多个内存。
    4)那么在程序中什么地方可以利用静态字段和静态构造方法,通常适用于于一些不会经常变化而又频繁使用的数据,比如连接字符串,配置信息等,当满足上面所说的两点时,进行一次读取,以后就可以方便的使用了,同时也节约了托管资源,因为对于静态成员,一个静态字段只标识一个存储位置。对一个类无论创建了多少个实例,它的静态字段永远都只有一个副本。
    静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态的成员。因为静态成员存在于内存,所以非静态成员可以直接访问类中静态的成员。公用的处理函数,使用静态方法应该没有问题,牵涉到数据共享,静态变量的函数要多考虑,静态变量要小心使用。

    静态方法:
    原理就是共享代码段;
    共享代码段不会产生任何问题;
    因为代码段都是给CPU作为"读取"用的,除非你进行恶意"修改"运行时的代码段;
    所以静态方法是可以放心使用的;

    静态变量:
    原理就是共享数据段;
    只要没有进行"写入"操作就不会产生问题,但是数据通常都是用于读和写,所以静态变量要注意使用;

    下面是一个使用静态方法的简单例子:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                int i = MyClass.Add(7, 11);   //调用静态方法
                Console.WriteLine(i);
                Console.ReadKey();
            }
    
    
        }
        class MyClass
        {
    
            public static int Add(int x, int y)
            {
                return x + y;
            }
        }
    }
    
    输出结果:18
    展开全文
  • Java 静态方法与非静态方法的调用

    千次阅读 2019-05-28 17:35:41
    调用静态方法 一般格式如下 类名.方法() //应为静态方法属于类本身,在同一个类中可以直接 调用 方法() 调用非静态方法 格式 对象名.方法() 一个小demo 方便理解 package me; public class Book { public void...

     

     调用静态方法 一般格式如下

    类名.方法() //应为静态方法属于类本身,在同一个类中可以直接 调用 方法()

     调用非静态方法 格式

    对象名.方法()

    一个小demo 方便理解

    package me;
    public class Book {
        public void info() { //定义一个方法
            String name = "英语"; //局部变量
            System.out.println(name);
        }
    
        public static void me(){
            String name = "数学";
            System.out.println(name);
        }
        public static void main(String[] args) {
            Book book = new Book();
            book.info(); //非静态方法调用  对象名.方法()
    
            Book.me(); //静态方法调用 类名.方法()
    //        me(); //当然可以直接使用 因为静态是Book类共享的
        }
    }
    

     

    展开全文
  • 静态和非静态方法

    千次阅读 热门讨论 2013-10-23 23:28:32
    静态和非静态方法  静态方法和非静态方法设计之初的目的就是前者是针对类,也就是某一种对象集体所拥有的,而非静态方法是针对某一个对象的。     静态方法和非静态方法的比较如下     下边一C#为例来...
  • 静态方法调用非静态方法

    千次阅读 2017-12-27 15:47:49
    静态方法不能(直接)调用非静态变量,非静态方法可以引用静态变量。 静态方法不属于对象,是属于类的,不需要实例化; 而非静态变量是属于对象的,需要先实例化。 在一个类的静态成员中去访问其非静态成员,因为...
  • 首先,静态函数只有当程序结束的时候才从内存消失,生命周期长。而非静态则是动态加载到内存,不需要的时候... 另外,静态函数中不能使用非静态变量,静态方法不可以定义this,super关键字(因为静态比对象先加载,而t
  • 人工智能,零基础入门!http://www.captainbed.net/inner https://blog.csdn.net/cherishme1988/article/details/12095637
  • 静态方法

    万次阅读 2013-11-30 23:44:50
    * 静态方法 1) 是属于类的方法 2) 使用类名直接调用, 在本类中可以省略类名 3) 静态方法中"没有" 隐含参数this(super) 3.1 静态方法不能访问当前对象(this)的属性和方法 4) 静态方法经常用于工具方法和工厂...
  • 静态方法与非静态方法的区别

    万次阅读 多人点赞 2016-05-17 14:26:43
    区别就是静态只能被静态调用,而非静态可以调用静态和非静态
  • 静态方法和非静态方法区别?

    千次阅读 多人点赞 2019-08-24 23:42:26
    静态方法static(类方法)和 非静态方法(实例方法)的区别: 方法我们主要分为三种: 1.构造方法 2.非静态方法(普通方法/实例方法) 3.静态方法(类方法) 对于1(补充一下):构造方法分为无参构造方法 和 有参...
  • Android kotlin静态属性、静态方法

    千次阅读 2018-05-27 20:15:34
    Kotlin类不支持静态方法和成员,由于Kotlin支持全局函数和变量,因此我们可以直接使用全局函数和变量来代替类中静态方法和静态成员变量。不过还有一个问题没解决,如果要使用类中的这些全局函数和变量,该如何处理呢...
  • 总结的很好所以记录下: 静态类: 在类(class)上加入static修饰, ...那么如果要在此静态类中添加函数、变量、属性,则必须都是静态的。 静态类的主要特性: 1:仅包含静态成员。 2:无法实例化。  3:...
  • 静态方法中不能调用非静态方法,那么在静态方法中通过实例化一个非静态的对象, 来实现对非静态方法的调用应该怎么理解 public class test1{ public static void main(string []args){//静态的方法 test2 t=new test...
  • JAVA的静态变量、静态方法、静态类

    万次阅读 多人点赞 2012-12-30 20:45:46
    静态变量和静态方法都属于静态对象,它与非静态对象的差别需要做个说明。 (1)Java静态对象和非静态对象有什么区别?  比对如下:  静态对象 非静态对象  拥有属性:
  • 一 抽象类和抽象方法 用abstract修饰的方法称为抽象方法 含有抽象方法的类必须定义为抽象类 使用场景: 为了描述抽象的概念,不予具体的事物相关联 只是当做派生类的基类来使用 抽象的特征: 抽象方法只做声明...
  • Android 静态方法调用非静态方法

    千次阅读 2017-06-16 13:39:32
    Java里默认不允许静态方法直接调用非静态方法。如果非要使用,只能通过类对象的引用去调。静态方法里的传参:当前类对象。 举例: public class StaticMethodTest{ /**线程安全单例模式*/ private ...
  • 静态方法是随着类的加载而加载的,对象是在类加载之后创建的,也就是说静态方法先于对象存在。当你创建一个对象时,程序为其在堆中分配内存,一般是通过this指针来指向该对象。静态方法不依赖于对象的调用,它是...
  • Java静态方法调用非静态方法

    千次阅读 2018-09-19 20:23:42
    静态方法(static mehod)不能直接调用非静态方法(non-static method),可以通过一个对象的引用传入静态方法中,再去调用该对象的非静态方法。在主函数(static方法)中,经常创建某个类的实例,再利用其引用变量调用他...
  • 静态方法中调用非静态方法

    千次阅读 2018-08-18 20:22:12
     静态static方法中不能调用非静态non-static方法,准确地说是不能直接调用... 在主函数(static方法)中我们经常创建某个类的实例,再利用其引用变量调用它的非静态方法。 //StaticMethodTest.java //A ststic m...
  • 我想从静态方法中调用非静态方法: Class SMS { public static void First_function() { SMS sms = new SMS(); sms.Second_function(); } public void Second_function() { Toast.makeText...
  • 初学java,看到书上的编纂,可能出现了错误。 第二版(中文版)284页中原话: 问:非静态的方法可以存取静态的变量吗?...我知道静态方法是不可以调用非静态的变量和非静态方法的。 对于非静态方法现在混乱了。求解答
  • 静态方法调用非静态方法:class Test{ public function fn1(){ echo 2*2; // $this-&gt;fn2(); } public static function fn2(){ echo 3*3; $obj = new Test; $obj-&gt;fn1...
  • 叙述:为了充分说明静态块,静态方法,构造方法,普通方法的执行顺序看下面的例子: package test; /** *  * 含有继承时,各种发法(静态块,静态方法,构造方法,普通方法)的执行顺序 * @author  * */ public ...
  • 静态方法和非静态方法相互调用

    千次阅读 2018-10-21 13:11:22
    对于静态方法,其他的静态或非静态方法都可以直接调用它。  而对于非静态方法,其他的非静态方法是可以直接调用它的。但是其他静态方法只有通过对象才能调用它。静态方法不能被非静态方法覆盖。 package web; ...
  • Synchronized同步静态方法和非静态方法总结

    万次阅读 多人点赞 2017-03-23 14:54:53
    1.Synchronized修饰非静态方法,实际上是对调用该方法的对象加锁,俗称“对象锁”。  Java中每个对象都有一个锁,并且是唯一的。假设分配的一个对象空间,里面有多个方法,相当于空间里面有多个小房间,如果我们把...
  • 为什么静态方法不能调用非静态变量,非静态方法可以引用静态变量? 理由很简单,静态方法不属于对象,是属于类的,是不需要实例化的,而非静态变量是属于对象的,需要先实例化。在一个类的静态成员中去访问其非静态...

空空如也

1 2 3 4 5 ... 20
收藏数 502,081
精华内容 200,832
关键字:

静态