当前位置:编程学习 > C#/ASP.NET >>

c#.net里static的作用是什么

举个例子说说,什么情况下用static? 谢谢 --------------------编程问答-------------------- 表示静态的关键字
说明此对象在应用中只存在一份 --------------------编程问答-------------------- C# 是面向对象的程序设计语言,每一个函数都属于一个类。 

当一个方法被声明为Static时,这个方法是一个静态方法,编译器会在编译时保留这个方法的实现。也就是说,这个方法属于类,但是不属于任何成员,不管这个类的实例是否存在,它们都会存在。就像入口函数Static void Main,因为它是静态函数,所以可以直接被调用。 

当一个方法被声明为Virtual时,它是一个虚拟方法,直到你使用ClassName variable = new ClassName();声明一个类的实例之前,它都不存在于真实的内存空间中。这个关键字在类的继承中非常常用,用来提供类方法的多态性支持。 

例如,有一个类Test,Test类拥有两个方法Hello()和greet(): 
public class test 

public void Hello() 

System.Console.WriteLine("hello, world!"); 

..... 

类TestMe派生自类Test,那么当你使用如下的代码: 
Test a = new TestMe(); 
创建一个TestMe类的新实例后,假如你试图执行如下的代码: 
a.Hello(); 
那么,自然就会运行基类Test的Hello()方法,但是如果你想给予派生类TestMe一个它自己的Hello()方法,你就要在Test类中将Hello()方法声明为虚拟的: 
public virtual void Hello() 

... 

然后在派生类中以override关键字表示覆盖基类的方法: 
public class TestMe : Test 

... 

public overrice void Hello() 

System.Console.WriteLine("hello from TestMe class!!!"); 


.... 

这时调用a.Hello(),就会出现“hello from TestMe class!!!”字样,而不是“Hello,world!”说明基类的方法已经被覆盖了。这就是多态性的表现。 

从上面不难看出,一个静态的方法是真实存在的,而一个虚拟方法可以被派生类重写,这二者是冲突的,其实对于一个方法,C#规定只能使用下面这些限定符中的一个: 
override virtual static abstract sealed 
代表的含义分别为: 
重载函数、虚拟函数、静态函数、抽象函数、密封函数(不可派生) 

另外,C#中定义一个方法的声明为: 

可见性 类型 返回值 方法名(参数列表){方法体} 

例如 
public static void Test(int a){System.Console.WriteLine(a.ToString());} 

这是一个公有的静态函数,函数名为Test,无返回值,有一个整形参数a,作用是把a的值输出在屏幕上。 --------------------编程问答-------------------- 比如有类
class a
{
   static void function1()
   {}
}
和类
class b
{
   b()
   {}
   void function2()
   {}
}
如果要使用function1的时候,直接使用类名a.function1()就可以了,如果要使用function2()的话需要对b进行构建一个对象  也就是:b haha = new b(),然后haha.function2(),可以这样进行使用,
也就是说对于static修饰过的方法或者属性,对于所有的该类的对象都只有相同的一个,而没有修饰过的则表示,对于不同的对象,会有不同的属性,比如不同的人有不同的名字,身高等。 --------------------编程问答-------------------- 学习 --------------------编程问答-------------------- 各位很热心,我也不用说了
其实大家都这样奉献,相信CSDN会更好 --------------------编程问答-------------------- 混分 --------------------编程问答-------------------- 学习,混个脸熟。 --------------------编程问答-------------------- 前一段时间在思考同楼主一样的问题。 --------------------编程问答-------------------- 学习 --------------------编程问答-------------------- public static 最好一个人开车
public 可以很多人一起开车 --------------------编程问答-------------------- JF --------------------编程问答-------------------- ding --------------------编程问答-------------------- 不用实例化就可以访问的。。。。。 --------------------编程问答-------------------- 去重修吧 --------------------编程问答-------------------- static 修饰的成员表示的是一个类的静态成员,可以理解为它是整个类所共有的,与非static 修饰符修饰的区别是,调用它的时候要用类名.成员(或者方法),而实例化成员是对象.成员(或者方法);比如:
public class Car
{
static int id;
string Name;
...
public Car()
{
this.id=id+1;
...
}
}
在使用的时候访问或者设置值我们用:Car.id="1";而访问或者设置Name我们要这样:
 Car Benz=new Car(); 
Benz.Name="奔驰";
大概就这样!比如这里我们想要记录Car的数量,每次实例化一个对象的时候,id 就加1. --------------------编程问答-------------------- 仔细看看楼上各位的应该能明白吧.我只是过来路过看看 --------------------编程问答-------------------- 表示静态 --------------------编程问答-------------------- hao  --------------------编程问答--------------------
引用 1 楼 ice_frank 的回复:
表示静态的关键字
说明此对象在应用中只存在一份

等于默认传了个THIS参数吧
--------------------编程问答--------------------
引用 1 楼 ice_frank 的回复:
表示静态的关键字
说明此对象在应用中只存在一份

UP.... --------------------编程问答-------------------- 路过 学习    . --------------------编程问答-------------------- 接分... --------------------编程问答-------------------- 路过 接分... --------------------编程问答-------------------- 我自己觉得就是为了在另外一个类里方便调用,先new一个对象,然后通过对象.就可以访问到静态方法。
说的不对的地方请大家指教。 --------------------编程问答-------------------- ╮(╯▽╰)╭!不好意思,刚才我讲错了,应该是直接通过类然后再.就可以调用它的静态方法了,给大家献丑了! --------------------编程问答-------------------- 下列情况下使用static:

1,这个类中,基本都是纯方法,并且是比较通用的,为了调用方便(直接用类名.方法名,不需要new 一个实例)。

2,static既可以修饰类,也可以修饰方法,你可以写一个static类,里面都是static方法。

除此之外,没有区别。性能也不存在什么区别(网上有些人认为性能更优)。说白了,是个习惯问题。 --------------------编程问答--------------------
引用 3 楼 myyihua 的回复:
比如有类
class   a
{
      static   void   function1()
      {}
}
和类
class   b
{
      b()
      {}
      void   function2()
      {}
}
如果要使用function1的时候,直接使用类名a.function1()就可以了,如果要使用functio……


调用static 类型的函数,不需要实例化。 --------------------编程问答-------------------- 看懂一些了。。 --------------------编程问答-------------------- 路过 学习 --------------------编程问答-------------------- 不用实例化直接用 --------------------编程问答-------------------- 看MSDN上的还是看这个好、、、、、
--------------------编程问答-------------------- 最大的作用是保留中间值,所有对象共用一个内存区域,通过类名。直接访问 --------------------编程问答-------------------- 当一个方法被声明为Static时,这个方法是一个静态方法,编译器会在编译时保留这个方法的实现。
也就是说,这个方法属于类,但是不属于任何成员,不管这个类的实例是否存在,它们都会存在。
就像入口函数Static   void   Main,因为它是静态函数,所以可以直接被调用。 --------------------编程问答-------------------- 用了static修饰后,在每个类你都能直接用类名。来调用,很方便。
如写与数据库连接时
public class DBHelper
{
public static  sqlconnection conn=new sqlconnection("server=.;database=库名;uid=sa;pwd=123456");
}


在别的类里要用到连接时就直接用DBhelper.conn.open(); //打开数据库
                           DBhelper.conn.open(); //关闭数据库 --------------------编程问答--------------------
引用 10 楼 spkl1 的回复:
public   static   最好一个人开车
public   可以很多人一起开车


比喻很形象  我感觉

public   static   只能一个人开车
public   new 一下可以很多人一起开车
--------------------编程问答-------------------- 学习啦 --------------------编程问答-------------------- ~~~~~~~~~~ --------------------编程问答--------------------
引用 23 楼 longyuan_ly008 的回复:
路过 接分...

up --------------------编程问答-------------------- 静态标示符。你就不能去看看msdn? --------------------编程问答-------------------- 表示静态的关键字
用它可以用类名调用,可以访问静态成员,
不能直接访问实例成员,不能直接调用实例方法
调用前需要初始化 --------------------编程问答-------------------- 不知道什么是static, 还是不知道C#中的static ? --------------------编程问答-------------------- 静态修饰符 --------------------编程问答-------------------- 静态修饰符, --------------------编程问答-------------------- 静态,不用NEW,多个同类型对象共享 --------------------编程问答-------------------- 2楼
 UP
--------------------编程问答-------------------- 说的很好,解惑了 --------------------编程问答-------------------- 见书中详细解释 --------------------编程问答--------------------
引用 26 楼 tstfish 的回复:
下列情况下使用static:

1,这个类中,基本都是纯方法,并且是比较通用的,为了调用方便(直接用类名.方法名,不需要new 一个实例)。

2,static既可以修饰类,也可以修饰方法,你可以写一个static类,里面都是static方法。

除此之外,没有区别。性能也不存在什么区别(网上有些人认为性能更优)。说白了,是个习惯问题。


我顶这个 --------------------编程问答-------------------- 帮忙顶起
--------------------编程问答-------------------- 好像是  是 个关键字吧   可以 修饰 方法 变量 等等   就是 调用和 传统的 不同 类名 直接调用 相对的 存储位置也不同  一个类中 公用这 一块内存空间


这 是我理解的 ..... --------------------编程问答--------------------
引用 32 楼 yingzhilian2008 的回复:
最大的作用是保留中间值,所有对象共用一个内存区域,通过类名。直接访问


ding --------------------编程问答-------------------- 当你需要你的东西不止在一个地方可以用的时候

就申明为static    比如变量 比如方法 比如类(要在别的类使用而不用实例化的时候)

数据服务类就是典型的用static   。。。 --------------------编程问答-------------------- 类使用的成员和方法 --------------------编程问答-------------------- static静态关键字,能修饰常量,类,属性等...
一般是不用初始化就可以直接使..
但是这样话就会出现一个问题..
我图方便在页面的后台(.cs页),初始化一个public static GetUserName=string.empty来接受别的页面值得用户名参数,但是这个时候如果有二个用户同时登陆,并且都是用GetUserName这个静态常量接受的话,第二用户的信息就会覆盖第一个用户的,不知道有没人遇到过类似的.... --------------------编程问答-------------------- static一般修饰常量,类,属性等。。
如果是一个类被static 了  
需要调用这类的方法时 不需要实例化  直接使用,
static 也要慎用, --------------------编程问答-------------------- 接分来了额 --------------------编程问答-------------------- 2楼的 你跟人家说那么多他能明白吗?简单的说 你某个类里面的某个方法用static的时候 将来调用这个方法的时候 直接可以用 类名.方法名 不用static修饰的时候将来调用需要先new出这个类的实例 然后再用类的实例去.方法名 才能调用到 --------------------编程问答-------------------- 接分    ! --------------------编程问答-------------------- static就是静态的意思。如你创建一个方法是静态的。那你可以直接通过类名.方法名调用如果不是静态的那你就要先创建类对象才可以点出来。这就是它的优点。 --------------------编程问答-------------------- 这个根据需要咯,也没有什么 --------------------编程问答-------------------- 可以就像BS系统中的Session一样存储用户信息,比如你在登陆窗口Login有一个static的变量iUserID,你可以在用户登录后,将用户的ID设置到iUserID中,以后其他窗口中直接用Login.iUserID即可直接获得用户的ID(假设登陆后Login窗口不关闭,只是隐藏) --------------------编程问答-------------------- 也可以建立一个Static变量用来存储数据库的访问字段等 --------------------编程问答-------------------- xue  xi  --------------------编程问答-------------------- 路过 学习 --------------------编程问答-------------------- 表示静态 --------------------编程问答-------------------- 路过!接分 --------------------编程问答-------------------- 只知道是静态的意思,顺便学习下 --------------------编程问答-------------------- 楼上的都说的很清楚了。不必多说了!接分…… --------------------编程问答-------------------- 现在想到的有三种用法:
1,定义一种静态的成员:
pulic static string name; 
(private static string name 感觉这个没有多大用处)
可以在类外面直接调用.
2,定义一种静态方法:
public static void Dosomething();
同样可以在类的外面直接调用.
3,在.net 3.0的新的方法,可以在类的外面直接类的成员的方法.
例如:对DataTable类的扩展
   publi static class ExpandEM
   {
      public static GetOnlyValue(this DataTable  self ,string filedName)
         {
             
         }
    } --------------------编程问答-------------------- 很简单的就是C#中的2个类型:值类型,引用类型~static 属于值类型~它的值是编译器自动生成的 --------------------编程问答-------------------- 静态的 至于定义为静态的方便之处还得楼主亲子体会 --------------------编程问答-------------------- 路过。。。 --------------------编程问答-------------------- 不用实例化直接调用 --------------------编程问答-------------------- 学习 --------------------编程问答-------------------- 接 分 --------------------编程问答-------------------- 这看上去好像水帖~~~~~ --------------------编程问答-------------------- 是静态关键字,变量或方法一旦被定义静态的,在该应用程序中只存在一份,并被实例化可以直接使用 --------------------编程问答--------------------
引用 47 楼 zhu_chuan_hang 的回复:
见书中详细解释

我也顶这个, --------------------编程问答-------------------- 学习中 --------------------编程问答--------------------
引用 77 楼 qihongwei_2000_0 的回复:
是静态关键字,变量或方法一旦被定义静态的,在该应用程序中只存在一份,并被实例化可以直接使用


混分!! --------------------编程问答-------------------- 学习,混个脸熟。 --------------------编程问答-------------------- 静态,程序初始化时分配内存空间。 --------------------编程问答-------------------- 过路的,进来瞧瞧。 --------------------编程问答-------------------- 混分...... --------------------编程问答-------------------- 相当不错的帖子 --------------------编程问答-------------------- 受教!!! --------------------编程问答-------------------- static 表示静态,和不加static的区别就是,它在程序执行的时候直接分配内存。而其他是执行到才分配,随着作用域的结束也会消失,而static不会。 --------------------编程问答-------------------- 仅代表我个人意见啊。 --------------------编程问答-------------------- static 是固定情人(公共或私有),没有后代,可以乱伦。 --------------------编程问答-------------------- 每天回帖即可获得10分可用分! --------------------编程问答-------------------- 加分,lz --------------------编程问答--------------------
引用 37 楼 stf_smile 的回复:
~~~~~~~~~~
 up --------------------编程问答-------------------- 表示静态的关键字
说明此对象在应用中只存在一份 --------------------编程问答-------------------- 看 一楼就行... --------------------编程问答-------------------- 学习啦 Up
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,