C# static关键字怎么用,会有什么现象和问题

本文适合有经验的中高级程序员阅读。

本文不是针对初学者的关于static关键字怎么使用的教程式文章,而是主要侧重于使用它后会有什么现象和问题,属于实践后的经验杂谈。

限于我有限的水平和经验,写的东西不一定准确和全面,还请大家帮助斧正。

一、简单说下教程

可能还是有必要简单说下关键字的static教程,使用 static 修饰符可声明属于类型本身而不是属于特定对象的静态成员。 static 修饰符可用于声明 static 类。 在类、接口和结构中,可以将 static 修饰符添加到字段、方法、属性、运算符、事件和构造函数。如下图:

 

二、静态方法常驻内存,所以效率高,速度快,但是内存会比较高

这个观点是错误的,对于同一个类的来说,它的内存开销是一样的,效率也没有所谓的更快,因为都是寻址。

 

三、类的声明

一旦一个类被声明,它将创建该类的所有实例字段的新副本,但static字段只会有一个副本。

同时,类的实例可以通过this进行对象访问,但static不可以。

 

四、使用static变量可能引发的问题

由于static字段,它一旦声明载入内存后,就一直存在,并且只有一个副本,所以,您对该字段的任何修改,将反映到全生命周期。

这也就是说,使用static字段,要防止值被更改,除非您是故意要这么做。

针对这一特性,static常可被用于运行时设计(Runtime)。这样,您就可以拥有全局的,任意地方都可以使用的公共数据。

 

五、新手程序员,为什么通篇都是static

这个对于现代化的程序员来说,通常指2012年后的程序员,他们可能由于进入编程的时候,已经相当现代化了,他们并不知道早期计算机出现,及编程发展之初的样子。

其实我也不知道,我是2000年后接触编程,对于70-80年代的那时候的程序员水准我也只能道听途说。

在那编程之初,一切程序理论都在西方构建,还是混沌初开,很多东西都还是摸索阶段,像什么面向对象、设计模式、各种底层设计、各种编程语言、基础算法设计等等,都需要形成和发展。而现代程序员,是享受那时候的人们的思想成果的。

在很早之时,那时候的西方程序员,也只会通篇static,为什么?因为那时候还没有完全形成面向对象的理论知识,一切都在探索摸索,另外,这些西方程序员,跟神国现在的程序员一个样,年轻,都是经验不足的新手,新手能写出什么样的代码来,您懂的。

那么神国的程序员,为什么现在都这么现代了,还是用人家最早期混沌之初的通篇static呢?答案可能是方便,以及娘胎自带的面向过程天生就会。我曾经听过一个程序员面试,他说自己学习和研究的是面向过程,我当时就乐了,面向过程需要您学习和研究吗,您打小天生就会。

 

六、有了static关键字,又那么方便,为何还要将对象实例化?

这个问题可能是很多人没有思考和想过的问题。是啊,内存一个样,速度也一个样。为啥我就不能通篇static,非要new一个对象?

答案是:面向对象。

随着各种知识理论的形象,面向对象由于良好的健壮扩展维护性等原因,他可以发展出极为方便的不断升级的系统,对于社会进步具有强大的推动作用,所以,这就是需要大家去new一下,而不是老用static的原因。

设想,您老所有类都用static来搞事情,像C#、Java语言。你现在要升级到C#9.0版本,Java N.0版本,你通篇static如何扩展如何维护如何升级,如何推动社会发展?

 

七、什么时候用static

我们知道,所有的类,只要你愿意,都可以把所有方法改为static,传入参数就可以。所有static也可以转为实例方法,去除static。

嗯,对,什么时候用static呢?有什么原则呢?

我基于个人经验提供一些观点,可能不足不对的地方,请大家指出和斧正:

1.使用实例方法,可以让您的代码采用面向对象,从而非常优美。面向对象的优势我就不说了。

2.当您需要很便捷的去访问一个方法的时候,可以采用static。这个便捷取决于你。

3.当您受到系统的限定,必须使用static时,您没有选择的权利,必须使用。比如对象的扩展方法。

4.当您想要使用Fluent方式来快捷操作一个类的时候,可以采用static方式。

5.您有特殊设计要求,比如生命周期的运行时设计。

 

祝您用餐愉快。

 

 

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C#中的static关键字可以用于修饰类、字段、方法、属性、构造函数等。它的作用是将其修饰的成员变为静态成员,即该成员不再与类的实例对象绑定,而是与类本身绑定。这意味着,无论创建多少个类的实例对象,静态成员只有一份,且可以通过类名直接访问。 在引用中,Student类被定义为静态类,其中的字段和方法也被定义为静态的。这意味着我们可以直接通过类名Student来访问其中的静态方法Print(),而不需要创建Student类的实例对象。 在引用中,Person类中的字段和方法被定义为静态的,但是Person类本身并没有被定义为静态类。这意味着我们需要先创建Person类的实例对象,然后通过该实例对象来访问其中的静态方法Print()。 下面是一个示例代码,演示了如何使用static关键字定义静态成员: ```csharp using System; class MyClass { public static int myStaticVar = 42; // 静态字段 public int myInstanceVar = 0; // 实例字段 public static void myStaticMethod() // 静态方法 { Console.WriteLine("This is a static method."); } public void myInstanceMethod() // 实例方法 { Console.WriteLine("This is an instance method."); } } class Program { static void Main(string[] args) { Console.WriteLine(MyClass.myStaticVar); // 直接访问静态字段 MyClass.myStaticMethod(); // 直接调用静态方法 MyClass obj1 = new MyClass(); MyClass obj2 = new MyClass(); obj1.myInstanceVar = 1; obj2.myInstanceVar = 2; Console.WriteLine(obj1.myInstanceVar); // 访问实例字段 Console.WriteLine(obj2.myInstanceVar); obj1.myInstanceMethod(); // 调用实例方法 obj2.myInstanceMethod(); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值