C#静态方法

转载 2007年09月19日 10:08:00
 
C#静态方法
 
 

学习C#静态函数及变量的一个精典例子与代码

(1)用于对静态字段、只读字段等的初始化。              

(2)添加static关键字,不能添加访问修饰符,因为静态构造函数都是私有的。      

(3)类的静态构造函数在给定应用程序域中至多执行一次:只有创建类的实例或者引用类的任何静态成员才激发静态构造函数

(4)静态构造函数是不可继承的,而且不能被直接调用。            

(5)如果类中包含用来开始执行的 Main 方法,则该类的静态构造函数将在调用 Main 方法之前执行。任何带有初始值设定项的静态字段,则在执行该类的静态构造函数时,先要按照文本顺序执行那些初始值设定项。  

(6)如果没有编写静态构造函数,而这时类中包含带有初始值设定的静态字段,那么编译器会自动生成默认的静态构造函数。

以下用例子代码进一步说明:

/**************************************************

* 静 态 构 造 函 数 练 习

* (1)①②③……为执行顺序

* (2)输出结果: static A()

* static B()

* X = 1, Y = 2

***************************************************/

using System;

class A { public static int X; static A()

//④ 执行完后返回到③ { X = B.Y + 1; Console.WriteLine("static A()"); } } class B { public static int Y = A.X + 1;

//③ 调用了A的静态成员,

// 转到A的静态构造函数----> static B()

//② 如果带有初始值设定项的静态字段,

// 执行该类的静态构造函数时,

// 先要按照文本顺序执行那些初始值设定项。

// 转到初始值设定项----> { Console.WriteLine("static B()"); } static void Main()

//① 程序入口,

// 如果类中包含用来开始执行的 Main 方法,

// 该类的静态构造函数将在调用 Main 方法之前执行。

// 转到B的静态构造函数----> { Console.WriteLine("X = {0}, Y = {1}", A.X, B.Y);

//⑤ 输出结果 Console.ReadLine(); } }

 

什么是静态方法

 

静态方法的1个特别作用就是不用创建类的对象,而直接用类里面的方法(public static 2个条件),

例如: class A { public static void b() {..............} }

可以这样直接用: A.b(); 那么在程序中如何可以利用静态字段和静态构造方法,通常适用于于一些不会经常变化而又频繁使用的数据,比如连接字符串,配置信息等,当满足上面所说的两点时,进行一次读取,以后就可以方便的使用了,同时也节约了托管资源,因为对于静态成员,一个静态字段只标识一个存储位置。对一个类无论创建了多少个实例,它的静态字段永远都只有一个副本。 static: 类变量(对象共享)可以用类名,对象名点取,间接使用。 类方法

1)static方法中不能直接使用非静态成员, 因为非静态成员与实例相关,通过对象点取间接使用

2)static方法中不能用this(与实例相关)

3)非static方法中可以使用static成员

 

静态方法有什么弊端?

问:我翻看一些源码工程时看到几乎没有什么静态方法唯独Ms的SQLHelper中几乎全是静态方法 为什么呢?

答1:在一些系统中使用非常频繁的方法都使用静态方法可以提高系统性能我是这么认为的 :)

答2:本身不可升级, 重写 这要看一个软件产品的目的是什么了.

答3:为了方便,不用实例化,但这样程序编译运行时就占用了系统资源

答4:静态的属性和方法在程序启动的时候,就全部装入内存的,而不管这些方法、属性以后有没有用到。即使是没有人再访问程序,这部分内存仍然不会释放还有就是,所有访问者看到的静态属性的数据几乎都是一样的,比如A用户设置了UserName这个属性,B用户访问的时候,得到的UserName仍然是A用户设置的那个。这种特性,如果用在固定数据中,那不会有太大问题,比如连接字符串之类的

 答5:静态方法/数据成员是属于类的,不是属于某一个对象的,因而调用它不需要实例化;静态方法和静态数据成员相当于共享变量。为该类的所有对象所共有,因而在需要共享数据时,定义这种类型时很好的选择。 一但定义一个类后(不一定要实例化对象)该类的所有静态成员就载入内存(并不是程序启动,就装入内存,没有定义该类时它不会载入内存) 静态成员的作用域与它所属的类的作用域相同

C# 中动态方法与静态方法的误区

误区一、 静态方法常驻内存,实例方法不是,所以静态方法效率高但占内存。 事实上,方法都是一样的,在加载时机和占用内存上,静态方法和实例方法是一样的,在类型第一次被使用时加载。调用的速度基本上没有差别。...
  • lllliulin
  • lllliulin
  • 2015年10月14日 21:37
  • 1630

C#静态方法和非静态方法

简单说一下静态方法和非静态方法。 类里面可以包含有静态方法和非静态方法,静态方法用static关键字修饰。 public class OneClass { public static vo...
  • liuqinghui1990
  • liuqinghui1990
  • 2017年08月06日 22:34
  • 251

C# 反射详解:定义、创建对象、调用实例方法及静态方法

C# 反射详解 定义 动态创建对象及调用实例方法 1、反射的定义及功能介绍:审查元数据并收集关于它的类型信息的能力。元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会...
  • u014019959
  • u014019959
  • 2014年05月18日 16:31
  • 2682

C#窗口传值及方法调用1--通过静态方法实现

普通的传递方式为属性,委托,构造函数传递。 这种传递方式仅实现当Form1打开Form2,将Form2的值传给Form1或者将Form1的值传给Form2。 如果Form1打开Form2,Form...
  • opm161
  • opm161
  • 2016年01月27日 16:33
  • 1036

C# 委托代理静态的方法

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Con...
  • cvMat
  • cvMat
  • 2016年12月18日 09:52
  • 871

C#控制台基础 调用非静态类的静态方法与非静态方法

慈心积善融学习,技术愿为有情学。善心速造多好事,前人栽树后乘凉。我今于此写经验,愿见文者得启发。 program.cs using System; using Syst...
  • yushaopu
  • yushaopu
  • 2016年09月04日 15:43
  • 1653

c#学习笔记--静态方法和实例方法、方法的重载、操作符的重载

C#静态方法和实例方法、方法的重载、操作符的重载
  • chensi16114
  • chensi16114
  • 2016年07月13日 09:32
  • 921

C#中File静态类及其常用静态方法实例详解

刚才写了一个小的测试程序,全面详述了c#中的关于文件操作的各种静态方法的用法,现分享一下----------YYC using System; using System.Collections.G...
  • u011390632
  • u011390632
  • 2013年12月06日 16:49
  • 2258

C# 静态扩展方法

原文地址:http://www.douban.com/note/165446133/ 静态类特征: 1.不能用sealed或abstract修饰符; 2.必须直接继承System.Obj...
  • for_cxc
  • for_cxc
  • 2016年03月09日 12:34
  • 1902

C#重载运算符必须静态吗? 为什么必须是静态的?

public static Vector operator +(Vector lhs, Vector rhs) { //运算符重载代码 } 运...
  • wu_pan123
  • wu_pan123
  • 2017年12月13日 10:19
  • 58
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#静态方法
举报原因:
原因补充:

(最多只允许输入30个字)