公共静态、公共和静态方法的区别是什么

本文关键字:区别 是什么 静态 静态方法 | 更新日期: 2023-09-27 17:50:55

我有一些关于c#中方法作用域的相关问题,以及在ASP中的最佳使用情况。净:

  1. c# 中,它们的区别是什么?
    • a public static方法
    • a public方法
    • a static方法
  2. 我正在使用MVCweb-services;就我的问题#1中的方法范围而言,每种method scope类型占用内存的情况下产生的差异是什么,例如,static在使用后会释放函数内存吗?

公共静态、公共和静态方法的区别是什么

public本身意味着它是一个基于实例的成员,外部调用者(可以访问类型本身的调用者)可以访问它。

static本身意味着成员不是基于实例的:你可以调用它而不需要任何特定的实例(甚至根本不需要任何实例);如果没有可访问性限定符,则假定该成员为非public——因此外部调用者无法访问该成员。

public staticstatic方法,可以被外部调用者访问。

两种情况下的内存使用是相同的:在方法中声明的任何变量的作用域都是方法调用本身(作为实现细节:通过堆栈;另外:我假设没有"捕获的变量",也没有asyncyield的使用),

这不是ASP特有的。. Net/mvc。然而,控制器上的"动作"方法,IIRC,被期望为public/instance,所以 public修饰符,不带 static修饰符。

基本上

:

可访问性:

  • none指定:默认为"private"(或"internal"为外部类)
  • "private":只对该类型内的代码可用
  • "protected":可用于该类型或子类型中的代码
  • "internal":可用于同一程序集中的代码
  • "protected internal": "protected" (union)"内部"
  • "public":对所有访问
  • 类型的调用者可用

Static/etc:

  • none指定:基于实例的;需要一个实例,并且代码可以自动访问实例成员(通过this.)和static成员
  • "static":不需要实例;代码只能自动访问static成员

没有访问说明符的静态方法将是私有的。你不能在课外访问它。

考虑下面的类。

class TestClass
{
    public int MyProperty { get; set; }
    static void SomeStaticMethod()
    {
    }
    public static void SomeOtherStaticMethod()
    {
        SomeStaticMethod(); // You can use the static method inside
    }
    public void InstanceMethod()
    {
        SomeStaticMethod();
    }
}

TestClass tc = new TestClass();
tc.InstanceMethod();
TestClass.SomeOtherStaticMethod();
TestClass.SomeStaticMethod(); // Thats an error because SomeStaticMethod is private and not accessible

默认情况下,类成员是私有的,所以如果你不指定你的静态方法是公共的,你将无法从你的类外部访问你的方法。

有关访问修饰符的更多信息,请参见:访问修饰符

为您提供示例非常好,但是这些东西在Internet上已经有很好的文档记录,并且非常简单的搜索可以产生确定的结果。让我来纵容你,查找主题的MSDN引用(顺便说一下,两个主题,成员访问和非实例成员并不严格相关):

首先是访问修饰符,在本例中具体为public:

公众

对象中的任何其他代码都可以访问该类型或成员同一个程序集或引用它的另一个程序集。

无论成员是否为static,这都是不相关的。

然后是静态的,非实例的东西:

静态

静态类和类成员用于创建数据和函数可以在不创建类实例的情况下访问。静态类成员可用于分离数据和行为独立于任何对象标识

因此,任何差异都是可能的访问和"实例"规则的组合。

内存管理是另一回事;没有一个方法、属性、字段,不管访问和上下文如何,会神奇地减少内存,这是您作为开发人员在编写每行代码时必须考虑的问题(在编写代码时使用CLR的内置内存管理的帮助)。

public是一个访问修饰符。因此,无论它在哪里应用,它都指向作用域

static Foo

不是公共的,这意味着它在类之外不可见。