0

我在实用程序类中有一个函数

  namespace GUI.code
 {
   public class Utility
  {
     public string GetFileName(string grpID)
    {
        string filenameUNC = "\\\\" + "localhost" + "\\AgentShare\\";

        string realPath = GetPath(filenameUNC);

        return realPath;
    }
   }
  }

现在我从项目中的另一个页面调用这个函数,如下所示:

new utility.GetCSFileName(ID);

为什么我需要添加新的,为什么我不能这样称呼它

GetCSFileName(ID);

当我有

     using GUI.code;

在上面

如果我删除新的,我会收到此错误

错误 1 ​​非静态字段、方法或属性 'copiunGUI.code.GUIUtility.GetCSFileName(string) 需要对象引用

有什么建议么

4

7 回答 7

3

如果您Utility.GetFileName()将声明更改为public static string GetFileName(string grpID)

static意味着该成员在类的所有实例Utility之间共享。请记住,c# 是一种面向对象的语言。非静态成员称为实例成员,并且必须在类的不同实例上调用。每次调用 时new Utility(),您都在创建这样一个实例,这与其他实例不同。

当类的每个实例都需要在内部维护信息(状态)时,这很有用。然而,如果一个特定的成员不使用状态数据——它接受参数,确实工作,并且可选地返回一个结果——它可以被声明为静态的。然后你不是从实例变量而是从类名本身调用它(在这种情况下是Utility.GetFileName().

当一个类的所有成员都是 时static,您可以添加static到类声明本身。那时,您将永远无法调用new Utility(),在这种情况下,这可能是您想要的。

于 2010-08-05T15:36:57.873 回答
2

您需要将您的方法标记为静态。

public class Utility
{
     public static string GetFileName(string grpID)
     {
            string filenameUNC = "\\\\" + "localhost" + "\\AgentShare\\";

            string realPath = GetPath(filenameUNC);

            return realPath;
     }
}

然后,您将能够调用您的方法Utility.GetFileName(...)

在此处阅读有关静态方法/类的更多信息。

于 2010-08-05T15:37:13.410 回答
1

看起来您想将您的方法(可能还有您的类)标记为静态:

public static class Utility
{
   public static string GetFileName(string grpID)
   ...

然后你可以这样称呼它:

string filename = Utility.GetFileName(ID);
于 2010-08-05T15:36:41.947 回答
1

使方法静态,您可以在没有类实例的情况下使用它

例如

public static string GetFileName(string grpID)

用法:

Utility.GetCSFileName(ID);
于 2010-08-05T15:36:58.327 回答
1

如果您将方法设置为静态方法,则不必有一个新方法:

public static string GetFileName(string grpID)
{
 //your code here
}

然后你仍然需要调用类名,但你不必实例化它:

所以代替:
Utility util = new Utility(); util.GetFileName("myString");

你可以做:

Utility.GetFileName("myString");

你不能这样做的原因GetFileName("myString")是你没有从定义它的类内部调用它。

于 2010-08-05T15:39:12.503 回答
1

当一个方法用static关键字标记时,这意味着您不必按照您的意图创建对象的新实例(使用“new”)来调用该方法。

需要注意的一件事是,如果将方法标记为静态,则它不能调用任何非静态方法,只能调用静态方法。您也不能使用对象的任何非静态属性。

于 2010-08-05T15:39:34.467 回答
1

诀窍是将方法定义为静态的。这将做到:

 namespace GUI.code
 {
   public class Utility
  {
     public static string GetFileName(string grpID)
    {
        string filenameUNC = "\\\\" + "localhost" + "\\AgentShare\\";

        string realPath = GetPath(filenameUNC);

        return realPath;
    }
   }
  }

现在你可以写了utility.GetCSFileName(ID);。但是你还是得提阶级。

于 2010-08-05T15:41:37.463 回答