香蕉视频app

香蕉视频appKeep on going never give up.

Let's Go

C# 學習筆記(22)靜態與非靜態的區別

C#Lonely2019-05-07 20:52:2674次0條

C#靜態成員與非靜態成員

香蕉视频app1、靜態成員屬于類所有,被類的所有對象所共享,非靜態成員屬于類的實例所有。

2、靜態成員屬于類所有,為各個類的實例所公用,無論類創建了多少實例,類的靜態成員在內存中只占同一塊區域。 非靜態成員每創建一個實例都會分配一塊新的內存。


C#靜態方法

C#靜態方法屬于類所有,類實例化前即可使用。靜態方法不要求要實例,而非靜態方法需要先有一個實例。

香蕉视频app非靜態方法可以訪問類中的任何成員,靜態方法只能訪問類中的靜態成員。因為靜態方法在類實例化前就可以使用,而類中的非靜態變量必須在實例化之后才能分配內存,這樣C#靜態方法調用時無法判斷非靜態變量使用的內存地址,所以無法使用。而靜態變量的地址對類來說是固定的,故可以使用。


靜態類的主要特性:

1、僅包含靜態成員。

2、無法實例化。

3、是密封的。

4、不能包含實例構造函數。


靜態成員

1、非靜態類可以包含靜態的方法、字段、屬性或事件;

2、無論對一個類創建多少個實例,它的靜態成員都只有一個副本;

香蕉视频app3、靜態方法和屬性不能訪問其包含類型中的非靜態字段和事件,并且不能訪問任何對象的實例變量;

香蕉视频app4、靜態方法只能被重載,而不能被重寫,因為靜態方法不屬于類的實例成員;

5、雖然字段不能聲明為 static const,但 const 字段的行為在本質上是靜態的。這樣的字段屬于類,不屬于類的實例。因此,可以同對待靜態字段一樣使用ClassName.MemberName 表示法來訪問 const 字段;

6、C# 不支持靜態局部變量(在方法內部定義靜態變量)。


靜態構造函數

1、靜態類可以有靜態構造函數,靜態構造函數不可繼承;

2、靜態構造函數可以用于靜態類,也可用于非靜態類;

香蕉视频app3、靜態構造函數無訪問修飾符、無參數,只有一個 static 標志;

4、靜態構造函數不可被直接調用,當創建類實例或引用任何靜態成員之前,靜態構造函數被自動執行,并且只執行一次。


靜態變量與非靜態變量的區別如下: 

1、內存分配

 靜態變量在應用程序初始化時,就存在于內存當中,直到它所在的類的程序運行結束時才消亡; 而非靜態變量需要被實例化后才會分配內存。 

2、生存周期 

靜態變量生存周期為應用程序的存在周期; 非靜態變量的存在周期取決于實例化的類的存在周期。 

3、調用方式 

靜態變量只能通過“類名.靜態變量名”調用,類的實例不能調用; 非靜態變量當該變量所在的類被實例化后,可通過實例化的對象名直接訪問。 

4、共享方式 

靜態變量是全局變量,被所有類的實例對象共享,即一個實例的改變了靜態變量的值,其他同類的實例讀到的就是變化后的值; 非靜態變量是局部變量,不共享的。 

5、訪問方式 

靜態成員只能訪問靜態成員,不能訪問非靜態成員; 非靜態成員可以訪問靜態成員。


靜態和非靜態的區別:

香蕉视频app(1)、在非靜態類中,既可以有實例成員(非靜態),也可以有靜態成員。

(2)、在調用實例成員的時候,需要使用對象名.實例成員;  在調用靜態成員的時候,需要使用類名.靜態成員名;


總結:

1、靜態成員必須使用類名去調用,而實例成員使用對象名去調用。

2、靜態方法中,只能訪問靜態成員,不允許訪問實例成員。

3、實例方法中,即可以使用靜態成員,也可以使用實例成員。

4、靜態類中,只允許有靜態成員,不允許出現實例成員。


注意:

1、靜態類在整個項目中資源共享,只有在程序全部結束之后,靜態類才會釋放資源。

香蕉视频app      //內存 :堆、棧、靜態存儲區域(靜態類存這)                釋放資源   GC垃圾回收器

2、非靜態類在實例化后是在內存中是獨立的,它的變量不會重復,在使用后會及時銷毀,所以不會出現未知的錯誤。

香蕉视频app3:建議如果你想將你的類當做一個“工具類”去使用,這個時候可以考慮將類寫成靜態的,如:Console類。


代碼示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp
{
    class MyClass
    {        
        public void Print_1()
        {
            Console.WriteLine("我是一個非靜態方法");
        }
        
        public static void Print_2()
        {
            Console.WriteLine("我是一個靜態方法");
        }
        
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            MyClass p = new MyClass();
            p.Print_1(); //調用非靜態方法用對象名.方法名();來調用。
            MyClass.Print_2();//調用靜態方法用類名.方法名();來調用
            Console.ReadKey();
        }
    }
}





暗錨,解決錨點偏移

文章評論

    嘿,來試試登錄吧!