38.C#--面对对象静态函数和非静态函数的区别

本文详细解析了C#中静态方法与非静态方法的区别,通过创建Person类并定义静态与非静态方法,演示了两者的调用方式。静态方法可以直接通过类名调用,而非静态方法则需先实例化对象。文章通过具体代码示例,帮助读者理解两者的工作原理及应用场景。

//一.新建Person类
namespace _38.面对对象静态函数和非静态函数的区别
{
//新建个Person类
public class Person
{
private static string _name; //静态字段
public static string Name //属性,对字体的限定
{
get { return Person._name; }
set { Person._name = value; }

    }

    private char _gender;   //字段
    public char Gender    //属性,对字体的限定
    {
        get { return _gender; }
        set { _gender = value; }
    }

    public void M1()    //方法
    {
        Console.WriteLine("我是一个非静态方法!");
    }

    public static void M2()   //方法
    {
        Console.WriteLine("我是一个静态方法!");
    }
}

}

//二.主函数
namespace _38.面对对象静态函数和非静态函数的区别
{
class Program
{
static void Main(string[] args)
{
//以下是重点,区别实例成员和静态成员的调用
//调用实例成员,先new一个对象,然后用对象去调用
Person p = new Person();
p.M1();
//静态方法调用,直接类名去点方法名
Person.M2();

        Console.WriteLine();
        Console.ReadKey();

    }
}

}

转载于:https://blog.51cto.com/12679593/2385682

<think>好的,用户想了解C#静态成员函数静态成员函数区别。我需要根据提供的引用资料来整理答案。首先,回顾一下引用内容: 引用[2][3]提到静态函数属于类,而静态函数属于实例。静态函数不能访问静态成员,因为没有this指针。引用[4][5]详细说明C#静态成员的特点,比如静态方法不能访问静态成员,只能访问其他静态成员,并且不需要实例化就可以调用。 用户的问题可能关注几个方面:定义、访问权限、调用方式、内存管理使用场景。我需要分点说明这些区别,确保每个点都清晰,并引用相关资料支持。例如,静态函数没有this指针,所以无法访问实例变量,而静态函数可以。同时,静态成员在类加载时初始化,生命周期更长。 还要注意用户可能混淆的地方,比如通过实例访问静态成员虽然可行但不推荐,这点需要强调。另外,是否需要提到构造函数?引用[5]提到静态构造函数,可以简单带过,但重点放在方法上。 需要检查是否有遗漏的区别,比如虚函数的问题,引用[3]提到静态函数不能声明为虚函数,这点也很重要。此外,静态方法可以在类内外定义,但外部定义时不能重复使用static关键字,这也是一个细节。 最后,生成相关问题时要围绕用户可能进一步想了解的内容,比如性能影响、设计模式中的应用等。确保问题有针对性,帮助用户深入理解。</think>### C#静态成员函数 vs 静态成员函数核心区别 #### 一、定义与归属 1. **静态成员函数** - 使用`static`关键字修饰,属于类本身而具体实例 - 在类加载时完成初始化,生命周期持续到程序结束[^5] - 示例: ```csharp public class Calculator { public static int Add(int a, int b) => a + b; } ``` 2. **静态成员函数** - 归属于类的实例,需通过对象调用 -对象创建而存在,随对象销毁而释放[^2] - 示例: ```csharp public class Person { public void Speak() => Console.WriteLine("Hello"); } ``` #### 二、访问权限差异 | 特性 | 静态成员函数 | 静态成员函数 | |---------------------|-----------------------|-------------------------| | 访问静态成员 | ✅ 直接访问 | ✅ 直接访问 | | 访问静态成员 | ❌ 需通过实例参数传递 | ✅ 直接访问 | | 包含this指针 | ❌ | ✅ | | 声明虚函数 | ❌ | ✅ | *注:静态函数可通过传递对象参数访问其静态成员,如引用[1]中`A::func(A a)`通过参数a访问实例成员* #### 三、内存与调用方式 - **静态函数** 存储在独立内存区域,调用方式:`ClassName.Method()` ```csharp Calculator.Add(2, 3); // 无需创建Calculator实例 ``` - **静态函数** 依附于对象内存空间,调用方式:`instance.Method()` ```csharp var person = new Person(); person.Speak(); // 必须实例化后调用 ``` #### 四、典型应用场景 1. **静态函数适用场景** - 工具类方法(如数学计算`Math.Pow()`) - 工厂模式创建实例 - 全局配置访问器 2. **静态函数适用场景** - 对象状态相关的操作(如`FileStream.Read()`) - 需要访问实例字段的方法 - 多态方法实现 #### 五、特殊注意事项 1. 通过实例调用静态方法虽可行但不推荐(编译器会警告)[^5] 2. 静态构造函数在首次访问类时自动执行且仅执行一次 3. 线程安全需特别注意,静态成员在多线程环境下可能引发竞争条件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值