【问题标题】:Access static function inside class-c# [duplicate]访问class-c#中的静态函数[重复]
【发布时间】:2015-11-13 06:33:23
【问题描述】:

下面的 sn-p 来自 HackerRank

class myfun
{
    int x;
    static int y;
    void fun()
    {
        x = 1;
        y = 1;
    }
    static void gun()
    {
        x = 1;//An object reference error
        y = 1;
    }
    static void Main()
    {
       myfun.gun();
       //Error  1   The namespace already contains a definition for 'myfun' 
    }
}

为什么这个错误说它已经包含一个定义?

编辑:我交叉检查了同一解决方案中的其他文件,发现它已在另一个类文件中使用。所以其中一个问题解决了。错误已包含定义已解决。但我仍然不清楚如何在静态函数中使用变量。我可以通过将其更改为静态来实现它。但任何人都可以为此提出替代方案吗?

在静态方法中访问变量的最佳方法是什么?

【问题讨论】:

  • 第一个问题是int x不是static,而是用static方法解决的:static void gun() { x = 1; ...}
  • 帖子中提供的代码不会因 C# 中的错误而失败(忽略 x = 1; 它编译得很好)。请确保您粘贴了正确的代码/错误。请参阅minimal reproducible example 获取指导。
  • 此外,没有迹象表明此问题与 ASP.NET 之间存在 任何 联系...
  • 你用的是什么ide版本?
  • 要访问实例变量,您需要一个instance。这意味着在某处必须有an instantiation,比如var myInstance = new myfun();(顺便说一句,你的名字很糟糕;1)myfun 不是一个函数,2)不要用“my”作为前缀,3)使用 PascalCasing C# 中的类名)。因此,myfun 的每个实例都有自己的一组实例变量(x),而静态变量(在您的情况下为 y)在类型级别定义并在所有实例之间共享。

标签: c# oop static


【解决方案1】:

您的代码无法编译

class myfun
{
    int x; // <- non static, instance
    ...
    static void gun()
    {
        x = 1; // <- ...but addressed within static method
        y = 1;
    }  

也许你应该让x成为静态;另一个问题是,如果你的意思是标准的main 方法(比如CC++Java),你应该这样写:

  // Note capitalization
  static void Main() { ... }

https://msdn.microsoft.com/en-us/library/ms228506(v=vs.90).aspx

【讨论】:

  • 感谢您的纠正。请参阅我更新的问题。但是我如何在静态方法中引用非静态变量?
  • @user833985,您的代码仍然会引发 非静态字段、方法或属性“myfun.x”需要对象引用
  • @Grundy..这个答案也提到了同样的错误。我正在寻找相同的解决方案和我之前的评论,我提出了相同的问题,即如何在静态方法中引用非静态变量?
【解决方案2】:

你的第一个问题是你从你的静态方法调用 X。这应该在那里抛出一个错误。这是一个错误的函数,你试图从其他调用正确的函数调用,但你正在调用的函数是错误的所以它永远不应该工作。你最好把 X 也设为静态。

【讨论】:

    猜你喜欢
    • 2013-01-31
    • 2020-11-25
    • 2015-06-12
    • 2011-09-30
    • 2013-12-23
    • 1970-01-01
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多