C#-静态与非静态的区别

静态和非静态的区别
1、在非静态类中,既可以有实例成员,也可以有静态成员。如下代码:

class Person
    {
       private static  string _name;
        private char _gender;
        
        public void M1()
        {
            Console.WriteLine("//我是非静态方法");
        }
        public static void M2()
        {
            Console.WriteLine(" //我是一个静态方法");
        }
    }

2、在调用实例成员的时候,需要使用对象名.实例成员;在调用静态成员的时候,需要使用类名.静态成员名。如下代码:

static void Main(string[] args)
        {
            //调用实例成员
            Person P = new Person();//实例化
            P.M1();//实例方法
            Person.M2();//静态方法
            Console.WriteLine();
            Console.ReadKey();
        }

总结

1)静态成员必须使用类名去调用,而实例成员使用对象名调用。如下代码:

 Person P = new Person();//实例化
 P.M1();//实例方法
 Person.M2();//静态方法

2)静态函数中,只能访问静态成员,不允许访问实例成员。如下代码:

 class Person
    {
        private static  string _name;
        private char _gender;
        public static void M2()
        {
            _name = "jingtai";
            _gender = 'f';//此行报错,不能引用非静态字段
            Console.WriteLine(" 我是一个静态方法");
        }
    }

 

3)实例函数中,既可以使用静态成员,也可以使用实例成员。如下代码:

 class Person
    {
        private static  string _name;
        private char _gender;
        public void M1()
        {
            _name = "feijingtai";
            _gender = 'm';
            Console.WriteLine("我是非静态方法");
        }
        
    }

 

4)静态类中只允许有静态成员,不允许出现实例成员。否则会报错,如下代码:

static class Person
    {
        private static  string _name;
        //注释掉的部分代码会报错(不能在静态类中声明实例成员)
        //private char _gender;
        //public void M1()
        //{
        //Console.WriteLine("我是非静态方法");
        //}
        public static void M2()
        {
            Console.WriteLine(" 我是一个静态方法");
        }
    }

 

使用:
1)、如果你想要你的类当做一个"工具类"去使用,这个时候可以考虑将类写成静态的。(工具类的意思就是,像工具一样经常需要用到的类,比如:console类,经常需要用来在控制台输入输出)
2)、静态类在整个项目中,谁都可以调用静态类,所以静态类在整个项目中是资源共享。

 

拓展内容:

内存五大块中的三大块:堆, 栈, 静态存储区域

只有在程序全部结束之后,静态类才会释放资源。通过(GC Garbage Collection垃圾回收器)释放资源

转载于:https://www.cnblogs.com/ImOrange/p/10534102.html

<think>我们正在处理一个关于C#静态类与静态区别的问题。根据用户的问题,我们需要解释两者的区别以及使用场景。 参考引用内容: 引用[1]:静态类不能被实例化,也不能被继承。它主要用于提供一组静态方法、属性字段,可以直接通过类名访问。 引用[2]:静态成员在程序启动时就会占用内存,而静态成员在实例化时才会占用内存。因此,频繁使用的成员可以考虑静态,以减少多次实例化的开销;而偶尔使用的成员则用静态,避免内存浪费。 引用[3]:静态类与密封类的区别静态类不能被实例化且成员都是静态的;而密封类可以实例化但不能被继承。 引用[4]:静态类与单例类的区别静态类不能支持依赖注入,而单例类可以;静态类存储在内存的高频堆(high frequency heap)中,应用程序卸载时才释放;单例类也可以有静态实例,但还可以有静态成员,因此可以利用垃圾回收管理静态部分。另外,静态类不可扩展,而单例类在特定情况下可以扩展(如私有构造函数)。静态类难以模拟测试,而单例类相对容易测试。 引用[5]:静态类无需也无法实例化,只能有静态成员,静态成员只有一个副本。静态方法中不能使用this关键字,因为静态方法不属于任何对象实例。 我们需要整理出静态静态类(普通类)的主要区别以及使用场景。 区别: 1. 实例化:静态类不能实例化,静态类可以实例化。 2. 继承:静态类不能被继承,静态类可以被继承(除被密封)。 3. 成员:静态类只能包含静态成员(方法、属性、字段、事件等),静态类可以包含静态成员静态成员。 4. 内存:静态类的成员在程序启动时就被加载到内存(高频堆),直到程序结束才释放;静态类的静态成员也是如此,但静态成员在实例化时分配内存,实例不再被引用时可以被垃圾回收。 5. 访问方式:静态类成员通过类名访问;静态类的静态成员通过实例访问,静态成员通过类名访问。 6. this关键字:在静态类的方法中不能使用this,因为this代表当前实例,而静态方法没有实例;静态类的静态方法中可以使用this。 使用场景: 静态类: - 当类仅包含静态方法或工具函数时(如Math类、Console类)。 - 当需要一组全局访问的辅助方法或工具函数,且不需要维护状态(即无实例字段)时。 - 当方法的使用频率很高,且不希望每次调用都创建实例时(避免多次实例化的开销)。 静态类: - 当需要创建多个实例,每个实例有自己的状态(实例字段)时。 - 当需要实现继承多态时。 - 当类的方法需要操作实例数据(即使用实例字段)时。 另外,根据引用[2][4]的内存考虑: - 如果某个成员(如数据库连接字符串)被频繁使用,使用静态可以避免多次实例化带来的内存开销(因为静态成员只有一个副本)。 - 如果某个成员只在特定情况下使用(如登录方法),使用静态更节省内存,因为只在需要时实例化,使用完后可以被回收。 注意:静态类虽然方便,但过度使用会导致内存占用过高,尤其是在大型项目中。同时,静态类难以进行单元测试(尤其是当有静态状态时),所以应谨慎使用。 因此,我们可以这样组织回答: 1. 静态静态类的定义特性。 2. 两者在实例化、成员、内存、访问方式等方面的区别。 3. 使用场景分析,结合内存性能考虑。 4. 注意事项(如测试、内存占用等)。 最后,根据指令,我们需要生成相关问题。 注意:所有数学表达式(如果有的话)要使用$...$或$$...$$格式,但本问题中可能不涉及数学表达式,所以重点在代码文字描述。 另外,在回答中引用的部分末尾添加引用标识。</think>### C# 静态类与静态类的区别及使用场景 #### **核心区别** 1. **实例化与访问** - **静态类**: - 不能实例化(`new StaticClass()` 会报错)[^1][^3] - 所有成员(方法、字段、属性)必须是静态- 通过类名直接访问:`StaticClass.Method()` - **静态类**: - 必须实例化才能使用:`var obj = new NonStaticClass()` - 可包含静态成员静态成员 - 静态成员通过实例访问:`obj.Method()` 2. **内存管理** - **静态类**: - 程序启动时加载到**高频堆(High Frequency Heap)**,直到程序结束才释放[^4][^5] - 所有静态成员**全局唯一**(仅一份内存副本) - **静态类**: - 实例化时在堆中分配内存,可被垃圾回收(GC) - 静态成员同样驻留高频堆,静态成员随实例回收 3. **继承与扩展性** - 静态类**不能被继承**(隐式 `sealed`)[^1][^3] - 静态类可被继承(除显式标记 `sealed`) 4. **`this` 关键字** - 静态方法**不能使用 `this`**(无实例上下文)[^5] - 静态方法可通过 `this` 访问当前实例 --- #### **使用场景** | **场景** | **推荐类型** | **原因** | |--------------------------|------------------|--------------------------------------------------------------------------| | **全局工具类** | 静态类 | 如 `Math`、`Console`,无需状态且频繁调用[^1][^3] | | **高频使用的工具方法** | 静态类 | 避免重复实例化开销(如数据库连接字符串)[^2][^5] | | **需维护状态的对象** | 静态类 | 如用户实体,每个实例有独立字段(`UserId`, `Name`) | | **依赖注入或可测试性** | 静态类 | 静态类难以模拟测试;静态类支持依赖注入[^4] | | **单例模式** | 静态类(单例) | 需控制实例化逻辑时(如延迟初始化),静态类无法实现[^4] | | **临时/低频使用的对象** | 静态类 | 避免内存浪费(实例可被 GC 回收)[^2] | --- #### **代码示例** ```csharp // 静态类:工具方法 public static class StringUtils { public static bool IsEmpty(string s) => string.IsNullOrEmpty(s); } // 使用:StringUtils.IsEmpty(text); // 静态类:带状态的对象 public class User { public int Id { get; set; } // 实例字段 public static int TotalUsers; // 静态字段 public void Save() => /* 保存到数据库 */; } // 使用:var user = new User { Id = 1 }; user.Save(); ``` #### **注意事项** 1. **内存优化**: - 静态成员长期占用内存,避免在大型项目中滥用[^2][^4] 2. **可测试性**: - 静态类难以模拟单元测试(尤其含静态状态时)[^4] 3. **线程安全**: - 静态方法需手动处理线程同步(如 `lock`)[^5] > 关键原则:优先使用静态类,仅在**无状态、高频调用**的工具场景用静态类[^2][^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值