公共静态方法,公共方法和静态方法有什么区别?

3

我有几个关于C#中方法作用域的问题,以及在ASP.Net中的最佳使用方式:

  1. C#中,以下三种方法有何区别:
    • public static方法
    • public方法
    • static方法
  2. 我正在使用MVCWeb服务;就我在问题#1中提到的方法作用域而言,每种方法作用域类型在内存占用方面将有何不同?例如,static方法在使用后是否会释放函数内存?
6个回答

14

public 单独使用表示这是一个基于实例的成员,可供外部调用者(具有对类型本身的访问权限)访问。

static 单独使用表示该成员不是基于实例的:您可以在不需要任何特定实例(甚至根本不需要任何实例)的情况下调用它;如果没有可访问性限定符,则默认为非公共 - 因此,该成员将无法被外部调用方访问。

public static 是一个static方法,可供外部调用者访问。

在这两种情况下,内存使用情况相同:在方法中声明的任何变量都限定于方法调用本身(作为实现细节:通过堆栈;另外:假定没有“捕获变量”、没有asyncyield用法)。

这并不特定于ASP.NET / MVC。但是,控制器上的"action"方法预计应为公共/实例化,因此应该使用public修饰符,并且不应该使用static修饰符。

基本上:

可访问性:

  • 未指定:默认为“私有”(外部类为“内部”)
  • “private”:仅对类型内的代码可用
  • “protected”:对类型或子类型内的代码可用
  • “internal”:对同一程序集中的代码可用
  • “protected internal”:为“protected”(联合)“internal”
  • “public”:对所有具有访问权限的调用者可用

静态/等等:

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

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

3

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

有关访问修饰符的更多信息,请参见: 访问修饰符(C#编程指南)


1

虽然人们提供给你示例很好,但这些东西已经在互联网上有了详细的文档,一个非常简单的搜索就可以得出明确的结果。让我来满足你,找到关于这些主题的MSDN参考资料(顺便说一下,成员访问和非实例成员并不严格相关):

首先,您有访问修饰符,特别是在这种情况下是public

public

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

无论成员是否为static,都是如此,这是无关紧要的。

然后,您有静态、非实例内容

静态
静态类和类成员用于创建可以在不创建类实例的情况下访问的数据和函数。静态类成员可用于分离与任何对象标识无关的数据和行为。
因此,任何差异都是可能访问和“实例”规则的组合。
内存管理是另一回事;没有任何方法、属性、字段,无论访问和上下文如何,都会神奇地减少内存,这是您作为开发人员必须在每行代码中考虑的事情(在适当编码时使用CLR的内置内存管理帮助)。

0

public是一个访问修饰符。因此,无论应用在何处,它都涉及作用域。


-1
static Foo

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接