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
。。。