静态变量 静态对象 静态函数

来源:互联网 发布:人员管理 知乎 部门 编辑:程序博客网 时间:2024/04/28 07:45

 

先明确一下

语言:asp.net C#


1
、静态变量:
static string str1 = "1234";

2、静态对象
static SqlConnection cn = new SqlConnection();

3、静态函数
class aa
{
    public static string test(string str)
    {
        return str "111";
    }
}

调用

aa.test("123");


4
、非静态函数(就是需要实例化的)
class aa
{
    public string test(string str)
    {
        return str  "111";
    }
}

调用
aa a1 = new aa();
a1.test("123");


其中静态变量和静态对象是比较好理解,也没有什么争论。争论最大的是静态函数这一块。

1、静态变量。在内存里是应该只有一份,不管是不是多线程,是不是多用户同时访问,静态变量只占

   用一  份内存。 存放在全局/静态存储区

2静态对象和静态变量也差不多,只有一份。  存放在全局/静态存储区

   个人认为 SqlConnection 是不应该只用静态的,除非你的网站没有(或很少)并发访问的情况。
   否则就很容易出现千军万马过独木桥的现象。挤不过去了就会瘫痪的。而且连接池也就无用武之地了。


3
非静态函数,就是在调用的时候必须先实例化,然后才能访问到。

   实例化到底做了什么呢?是不是把整个类都复制了一份供调用者使用呢?
   那么函数(或者说是类)呢?也又生成了一份吗?

   在内存中为每个实例分配一块内存。

   函数被隐含加上了一个指向所属类实例的指针this,用以将实例传给函数

   所以用的是实例化类的属性 &&  (函数参数、返回值定义) 等。


4
静态函数,直接调用不需要实例化,也没有属性

   没有实例化,函数是一份的,多少人调用,都是这一份。那么函数用的参数和返回值呢?也是只有

   一份吗?

   (1)类的静态成员函数是属于整个类而非类的对象,所以它没有this指针,这就导致了它仅能访问类的静态数据和静态成员函数。
   (2)
不能将静态成员函数定义为虚函数。因为他没有this指针,并且是属于整个类而不是属于某个实例化的。
   (3)
由于静态成员声明于类中,操作于其外,所以对其取地址操作,就多少有些特殊,变量地址是指向其数据类型的指针 ,函数地址类型是一个“nonmember函数指针

   (4)由于静态成员函数没有this指针,所以就差不多等同于nonmember函数,结果就产生了一个意想不到的好处:成为一个callback函数,使得我们得以将C++C-based X Window系统结合,同时也成功的应用于线程函数身上。 
   (5)static
并没有增加程序的时空开销,相反她还缩短了子类对父类静态成员的访问时间,节省了子   类的内存空间。

       (6)静态数据成员在<定义或说明>时前面加关键字static
      (7)
静态数据成员是静态存储的,所以必须对它进行初始化。
      (8)
静态成员初始化与一般数据成员初始化不同:
      
初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相混淆;初始化时不加该成员的访问权限控制符privatepublic等;初始化时使用作用域运算符来标明它所属类;所以我们得出静态数据成员初始化的格式:

         <
数据类型><类名>::<静态数据成员名>=<>
      (9)
为了防止父类的影响,可以在子类定义一个与父类相同的静态变量,以屏蔽父类的影响。这里有一点需要注意:我们说静态成员为父类和子类共享,但我们有 重复定义了静态成员,这会不会引起错误呢?不会,我们的编译器采用了一种绝妙的手法:name-mangling 用以生成唯一的标志。

 

 小结

    静态函数和非静态函数最大的区别是,静态的不能访问所在类的属性和内的私有变量,其他的好像都一样了。

再有就是在调用的时候会不会复制一遍算法(函数本身)?(我感觉是都不会复制的)。

    两者需要的参数,返回值应该是独立的,一个调用者一份,一个调用者不会访问到其它调用者的参数和返回值。(函数被隐含加上了一个指向所属类实例化的指针