C#静态方法与非静态方法

C#静态方法与非静态方法

C#的类中可以包含两种方法:静态方法和非静态方法。

使用了static 修饰符的方法为静态方法,反之则是非静态方法。

静态方法是一种特殊的成员方法,它不属于类的某一个具体的实例,而是属于类本身。所以对静态方法不需要首先创建一个类的实例,而是采用类名.静态方法的格式 。


1)static方法是类中的一个成员方法,属于整个类,即不用创建任何对象也可以直接调用。

static内部只能出现static变量和其他static方法,而且static方法中还不能使用this等关键字,因为它是属于整个类。
2)静态方法效率上要比实例化高,静态方法的缺点是不自动进行销毁,而实例化的则可以做销毁。

3)静态方法和静态变量创建后始终使用同一块内存,而使用实例的方式会创建多个内存。
4)那么在程序中什么地方可以利用静态字段和静态构造方法,通常适用于于一些不会经常变化而又频繁使用的数据,比如连接字符串,配置信息等,当满足上面所说的两点时,进行一次读取,以后就可以方便的使用了,同时也节约了托管资源,因为对于静态成员,一个静态字段只标识一个存储位置。对一个类无论创建了多少个实例,它的静态字段永远都只有一个副本。
静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态的成员。因为静态成员存在于内存,所以非静态成员可以直接访问类中静态的成员。公用的处理函数,使用静态方法应该没有问题,牵涉到数据共享,静态变量的函数要多考虑,静态变量要小心使用。

静态方法:
原理就是共享代码段;
共享代码段不会产生任何问题;
因为代码段都是给CPU作为"读取"用的,除非你进行恶意"修改"运行时的代码段;
所以静态方法是可以放心使用的;

静态变量:
原理就是共享数据段;
只要没有进行"写入"操作就不会产生问题,但是数据通常都是用于读和写,所以静态变量要注意使用;

下面是一个使用静态方法的简单例子:

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

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int i = MyClass.Add(7, 11);   //调用静态方法
            Console.WriteLine(i);
            Console.ReadKey();
        }


    }
    class MyClass
    {

        public static int Add(int x, int y)
        {
            return x + y;
        }
    }
}
输出结果:18
### C#静态方法与实例方法的区别 在 C# 编程语言中,静态方法和实例方法之间存在显著差异。这些差异不仅影响编码风格的选择,还决定了程序运行时的行为特性。 #### 定义与声明方式 - **静态方法**:由 `static` 关键字修饰的方法称为静态方法。这类方法属于类本身而特定的对象实例。因此,可以通过类名直接调用而不必创建任何对象[^2]。 - **实例方法**:未加 `static` 修饰符的方法即为实例方法。只有当创建了一个具体的对象之后才能对该对象上调用此类方法。 ```csharp public class ExampleClass { public static void StaticMethod() { /* ... */ } // 静态方法 public void InstanceMethod() { /* ... */ } // 实例方法 } ``` #### 访问范围 - **静态方法**无法访问静态成员(字段、属性或其他方法),除通过传递参数的形式间接获取某个具体对象的信息。 - **实例方法**可以直接访问同一类内的所有成员——无论是静态还是静态的成员都可以自由存取。 #### 内存管理 - **静态方法**在整个应用程序生命周期内仅初始化一次,并驻留在全局堆栈区直到应用终止。这意味着即使多次调用了同一个静态函数也不会重复分配额外的空间给它自己[^3]。 - **实例方法**每次新建一个对象都会为其分配独立的工作区域用于存储局部变量等临时数据结构。随着对象销毁,这部分内存也会随之回收释放回系统池中等待再利用。 #### 并发处理能力 考虑到多线程环境下的安全性: - 对于那些可能被多个线程同时执行的任务而言,应当谨慎对待共享资源的竞争条件问题。由于静态上下文中所有的状态都是共有的,所以在高并发场景下容易引发竞态错误或死锁现象。此时建议优先选用实例化版本以确保各自拥有独立的状态副本从而避免冲突发生[^4]。 - 当确认所涉及的操作不具备上述风险因素时,则可以选择效率更高的静态实现形式来简化代码逻辑并提升整体性能表现。 #### 应用场景举例说明 基于以上几点分析可知: - 如果某功能模块完全依赖外部输入参数完成计算过程而无需借助内部维护的数据项的话,那么将其定义成静态形式是比较合理的做法之一[^1]。 - 反之对于那些需要频繁读写私有域值或是与其他关联实体交互协作的情况来说,显然更加适合构建成为常规意义上的成员函数以便充分利用面向对象机制所带来的诸多便利之处。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值