C# 如何在程序中求解CS0120(非静态字段、方法或属性需要对象引用)?

C# 如何在程序中求解CS0120(非静态字段、方法或属性需要对象引用)?,c#,C#,我一直需要将我的驱动程序转换成字节,这样我就可以在不下载任何东西的情况下加载它 这是我试过的 class Program { public byte[] StreamFile(string filename) { FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read); // Create a byte array of file stream length

我一直需要将我的驱动程序转换成字节,这样我就可以在不下载任何东西的情况下加载它

这是我试过的

class Program
{
    public byte[] StreamFile(string filename)
    {
        FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read);

        // Create a byte array of file stream length
        byte[] ImageData = new byte[fs.Length];

        //Read block of bytes from stream into the byte array
        fs.Read(ImageData, 0, System.Convert.ToInt32(fs.Length));

        byte[] bytes = System.IO.File.ReadAllBytes(filename);

        //Close the File Stream
        fs.Close();
        return ImageData; //return the byte data

    }

    static void Main(string[] args)
    {
        StreamFile(@"");
    }
}
我的
Main
中出现错误

非静态void字段、方法或属性“Program.StreamFile(string)”需要对象


有人知道为什么会发生这种情况吗?

您得到的错误是因为从静态主方法内部调用了非静态方法, 也许你应该改变你的题目


将static关键字添加到StreamFile方法。

此外,我不清楚您想要实现什么,您的代码没有编译,因为您需要将StreamFile设置为静态,因为您是从静态方法调用它的。 因此,这修复了语法错误

类程序
{
//!!!!!!!!!添加这个
公共静态字节[]流文件(字符串文件名)
{
FileStream fs=newfilestream(文件名,FileMode.Open,FileAccess.Read);
//创建文件流长度的字节数组
字节[]图像数据=新字节[fs.Length];
//将字节块从流读入字节数组
读取(ImageData,0,System.Convert.ToInt32(fs.Length));
byte[]bytes=System.IO.File.ReadAllBytes(文件名);
//关闭文件流
fs.Close();
return ImageData;//返回字节数据
}
静态void Main(字符串[]参数)
{
流文件(@“”);
}
}
您可以通过这种方式重写代码并使其更加健壮(.net core)

类程序
{
公共静态字节[]流文件(字符串文件名)
{
返回System.IO.File.ReadAllBytes(文件名);
}
静态void Main(字符串[]参数)
{
流文件(@“”);
}
}
已编辑下面的代码显示了如何使用
使用
,但不需要更多关于如何处理缓冲区的知识(我刚刚提出了一个例外,因为这超出了范围)

类程序
{
公共静态字节[]流文件(字符串文件名)
{
字节[]数据;
//让流自行管理
使用(var fs=new FileStream(文件名,FileMode.Open,FileAccess.Read,FileShare.Read))
{
//如果您想询问文件的长度,请确保没有人在一段时间内更改它。请参阅上面的FileShare.Read
数据=新字节[fs.Length];
if(data.Length!=fs.Read(data,0,data.Length))
抛出新的InvalidOperationException(“出错了”);
}
返回数据;
}
静态void Main(字符串[]参数)
{
流文件(@“”);
}
}
请注意,
using
构造会在您使用的资源超出范围1时自动关闭/处置该资源。这样你就不会犯错误,你的意图也很清楚

您必须锁定该文件(在您的情况下,只是要求任何人都不能通过
FileShare.Read
)更改它),否则您可能会在该文件上遇到竞争条件,因为您可能读取了不一致的数据



1他们必须实现
IDisposable
接口。

是-您试图调用实例方法(
StreamFile
),但没有实例可供调用。使
StreamFile
静态,或创建
Program
的实例来调用该方法。我还建议您使用
using
语句自动关闭文件流,即使代码引发异常,并阅读.NET命名约定(例如,局部变量的
imageData
,而不是
imageData
)还要注意的是,问题的标题实际上与您看到的错误消息无关。问题在于调用方法,而不是方法的实现,或者您试图在方法中实现什么。了解如何诊断导致问题的代码的哪个方面很重要。这是一项需要时间的技能,但值得回顾每个问题并思考如何进一步细分。最后,请注意
File.ReadAllBytes
已经存在,因此您根本不需要
StreamFile
方法。请注意,这是调用
Stream.Read
并忽略返回值,这通常是个坏主意。我会完全摆脱
StreamFile
,只需调用
File.ReadAllBytes
。。。