public static,public和static方法有什么区别?

时间:2013-01-08 10:02:24

标签: c# asp.net-mvc-3

我有一些关于C#方法范围的相关问题,以及ASP.Net中的最佳用例:

  1. C#中,有什么区别:
    • 一个public static方法
    • 一个public方法
    • 一个static方法
  2. 我正在使用 MVC 网络服务;就我的问题#1中的方法范围而言,在每个method scope类型的内存占用情况下会产生什么差异,例如,static将在使用后释放函数内存?< / LI>

6 个答案:

答案 0 :(得分:11)

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

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

public static是一种static方法, 可供外部呼叫者访问。

在两种情况下内存使用都是相同的:方法中声明的任何变量都限定在方法调用本身(作为实现细节:通过堆栈;还有:我假设没有“捕获变量”,并且没有{ {1}}或async用法),

这一点中没有任何内容特定于ASP.NET / MVC。但是,控制器上的“动作”方法是IIRC,预计是公共/实例,所以 yield修饰符,而没有 {{1} }修饰符。

基本上:

辅助功能:

  • none指定:默认为“private”(或外部类的“internal”)
  • “private”:仅适用于该类型内的代码
  • “protected”:可用于该类型或子类型中的代码
  • “internal”:可用于同一程序集中的代码
  • “protected internal”:“受保护”(联合)“内部”
  • “public”:可供所有有权访问
  • 的来电者使用

静态/ etc:

  • 无指定:基于实例;需要一个实例,代码可以自动访问实例成员(通过public)和static成员
  • “static”:不需要实例;代码只能自动访问this.成员

答案 1 :(得分:3)

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

考虑以下课程。

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

答案 2 :(得分:3)

默认情况下,类成员是私有的,因此如果您未指定静态方法是plublic,则无法从类外部访问您的方法。

有关访问修饰符的更多信息,请参阅: Access Modifiers (C# Programming Guide)

答案 3 :(得分:2)

为人们提供示例非常好,但是这些内容已在互联网上得到很好的记录,并且非常简单的搜索可以产生明确的结果。让我放纵一下,找到关于主题的MSDN参考资料(顺便提一下,两个主题,成员访问和非实例成员并不严格相关):

首先,您有access modifiers,在这种情况下具体为public

  

公开

     

可以通过其中的任何其他代码访问类型或成员   相同的装配或引用它的另一个装配。

会员是否static,这是不相关的。

然后你有static, non-instance stuff

  

<强>静态

     

静态类和类成员用于创建数据和函数   无需创建类的实例即可访问。静态的   类成员可用于分隔数据和行为   独立于任何对象标识

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

内存管理是另一回事;没有任何方法,属性,字段,无论访问和上下文,都会神奇地减少内存,这是开发人员必须考虑的每行代码(在编码时借助CLR的内置内存管理)适当地)。

答案 4 :(得分:0)

public是一个访问修饰符。所以只要它被应用,它就是指范围。

答案 5 :(得分:-1)

static Foo

不公开,这意味着它在课堂外不可见。