C#静态和非静态的区别

C#的类中可以包含两种方法:C#静态方法与非静态方法。那么他们的定义有什么不同呢?他们在使用上会有什么不同呢?让我们来看看最直观的差别:使用了static 修饰符的方法为静态方法,反之则是非静态方法。

比较一、C#静态成员:

静态成员属于类所有,非静态成员属于类的实例所有。

每创建一个类的实例,都会在内存中为非静态成员新分配一块存储;静态成员属于类所有,为各个类的实例所公用,无论类创建了多少实例,类的静态成员在内存中只占同一块区域。

比较二、C#静态方法

C#静态方法属于类所有,类实例化前即可使用。

非静态方法可以访问类中的任何成员,静态方法只能访问类中的静态成员。因为静态方法在类实例化前就可以使用,而类中的非静态变量必须在实例化之后才能分配内存,这样,C#静态方法调用时无法判断非静态变量使用的内存地址。所以无法使用。而静态变量的地址对类来说是固定的,故可以使用。

比较三、C#静态方法是一种特殊的成员方法

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

static内部只能出现static变量和其他static方法!而且static方法中还不能使用this....等关键字..因为它是属于整个类!

静态方法效率上要比实例化高,静态方法的缺点是不自动进行销毁,而实例化的则可以做销毁。

静态方法和静态变量创建后始终使用同一块内存,而使用实例的方式会创建多个内存。

比较四、C#静态方法中获取类的名称

静态方法中用:

string className =   System.Reflection.MethodBase. GetCurrentMethod().ReflectedType.FullName; 

非静态方法中还可以用:

string className = this.GetType().FullName; 
使用静态得准则就是:1.保证不会产生并发。2. 在方便快捷和开发难度上做一个衡量

转载于:https://www.cnblogs.com/zhxhdean/archive/2011/04/21/2023250.html

### 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、付费专栏及课程。

余额充值