3

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

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

6 回答 6

13

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

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

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

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

其中没有任何内容特定于 ASP.NET / MVC。然而,控制器上的“动作”方法是,IIRC,预计是公共/实例,所以有修饰符public没有static修饰符。

基本上:

可访问性:

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

静态/等:

  • 未指定:基于实例;需要一个实例,并且代码可以自动访问实例成员(通过this.)和static成员
  • “静态”:不需要实例;代码只能自动访问static成员
于 2013-01-08T10:19:47.510 回答
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
于 2013-01-08T10:04:12.383 回答
3

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

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

于 2013-01-08T10:10:48.743 回答
1

人们很乐意为您提供示例,但是这些内容已经在 Internet 上进行了详细记录,并且非常简单的搜索可以得出明确的结果。让我放纵你,找到关于主题的 MSDN 参考(两个主题,顺便说一下,成员访问和非实例成员没有严格相关):

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

上市

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

成员是否是这种情况static,这是无关紧要的。

然后你有静态的、非实例的东西

静止的

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

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

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

于 2013-01-08T10:25:19.863 回答
0

public是访问修饰符。所以无论在哪里应用它都是指范围。

于 2013-01-08T10:04:21.387 回答
-1
static Foo

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

于 2013-01-08T10:04:49.683 回答