Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将对象引用传递给方法时,它必须是静态的吗?_C# - Fatal编程技术网

C# 将对象引用传递给方法时,它必须是静态的吗?

C# 将对象引用传递给方法时,它必须是静态的吗?,c#,C#,当我尝试编写一些代码来了解如何将对象的引用传递给方法时,当我尝试删除方法头部中的static时,会出现一个错误。错误消息显示:非静态字段、方法或属性需要对象引用。。。。。。但是参数中是否已经存在引用?我见过不使用静态的代码,那么为什么这不起作用呢?我知道,当从非对象类使用方法时,会使用static。希望您能理解一些解释。谢谢 // Method internal static string ChangeName(Box obj) { return obj.

当我尝试编写一些代码来了解如何将对象的引用传递给方法时,当我尝试删除方法头部中的static时,会出现一个错误。错误消息显示:非静态字段、方法或属性需要对象引用。。。。。。但是参数中是否已经存在引用?我见过不使用静态的代码,那么为什么这不起作用呢?我知道,当从非对象类使用方法时,会使用static。希望您能理解一些解释。谢谢

    // Method
    internal static string ChangeName(Box obj)
    {
        return obj.BoxName;
    }
编辑:我添加了整个代码。我从主方法内部调用的问题是静态的吗

class Program
{
    static void Main(string[] args)
    {

        Box box1, box2;
        box1 = new Box("Nick","R90",1);
        box2 = new Box("Hanna","B27",2);

        Console.WriteLine(ChangeName(box2));
        Console.Read();

    }

    // Methods
    private static string ChangeName(Box obj)
    {
        return obj.BoxName;
    }
}

静态方法的调用方式如下:

MyClass.Method(arg);
MyClass myInstance = new MyClass();
myInstance.Method(arg);
实例方法的调用方式如下所示:

MyClass.Method(arg);
MyClass myInstance = new MyClass();
myInstance.Method(arg);
这两者不相容

如果要更改方法签名,还需要更改调用该方法的每个位置

编辑:您正在使用非限定呼叫。以下是使用非限定呼叫的规则

  • 静态方法可以调用静态方法
  • 静态方法无法调用实例方法。(这是你的问题。)
  • 实例方法可以调用静态方法
  • 实例方法可以调用实例方法
该方法实际上应该作为Box类中的实例方法来实现。然后你会说:

Console.WriteLine(box2.ChangeName());

如果您无权访问Box代码,那么您可以编写一个扩展方法,或者按照您的示例将该方法保持为静态。

静态方法的调用方式如下:

MyClass.Method(arg);
MyClass myInstance = new MyClass();
myInstance.Method(arg);
实例方法的调用方式如下所示:

MyClass.Method(arg);
MyClass myInstance = new MyClass();
myInstance.Method(arg);
这两者不相容

如果要更改方法签名,还需要更改调用该方法的每个位置

编辑:您正在使用非限定呼叫。以下是使用非限定呼叫的规则

  • 静态方法可以调用静态方法
  • 静态方法无法调用实例方法。(这是你的问题。)
  • 实例方法可以调用静态方法
  • 实例方法可以调用实例方法
该方法实际上应该作为Box类中的实例方法来实现。然后你会说:

Console.WriteLine(box2.ChangeName());

如果您无法访问Box代码,那么您可以编写一个扩展方法,或者按照您的示例将该方法保持为静态。

错误可能是您调用此方法的地方;如果从静态方法调用,则必须显式调用对象实例或调用静态方法。

调用此方法时可能出现错误;如果从静态方法调用,则必须显式调用对象实例或调用静态方法。

您尝试的非静态方法的代码是什么?您是否只删除了单词
static
?您向我们显示的代码是正确的。显示代码的其他部分。您尝试的非静态方法的代码是什么?您是否只删除了单词
static
?您向我们显示的代码是正确的。显示代码的其他部分。确定,但使用Console.WriteLine(box2.ChangeName());那么没有参考带来的方法!?当我使用代码时,我得到了一条红线?就像我说的,“这个方法实际上应该作为Box类中的实例方法来实现。”好的,但是使用Console.WriteLine(box2.ChangeName());那么没有参考带来的方法!?当我使用代码时,我得到了一条红线?就像我说的,“这个方法实际上应该作为Box类中的实例方法来实现。”