为什么"静态"关键字需要在C#中的程序类中?

时间:2016-02-04 06:51:58

标签: c# static

我不确定为什么当我不使用" static"时,该功能有错误:

"An object reference is required for non-static field,method, or property.Dos2Unix(string)"

代码如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
class Program
{
    static void Main(string[] args)
    {
        var f = @"\D:\temp\test.xls";
        Dos2Unix(f);
    }
    private void Dos2Unix(string fileName)
    {
       const byte CR = 0x0D;
       const byte LF = 0x0A;
       byte[] data = File.ReadAllBytes(fileName);
       using (FileStream fileStream = File.OpenWrite(fileName))
       {
           BinaryWriter bw = new BinaryWriter(fileStream);
           int position = 0;
           int index = 0;
           do
           {
             index = Array.IndexOf<byte>(data, CR, position);
             if ((index >= 0) && (data[index + 1] == LF))
             {
               // Write before the CR
               bw.Write(data, position, index - position);
               // from LF
               position = index + 1;
             }
           }
                while (index > 0);
                bw.Write(data, position, data.Length - position);
                fileStream.SetLength(fileStream.Position);
            }
    }
 }
}

当我使用关键字&#34; static&#34;时,没有错误。

我不确定我犯了什么错误。需要一些帮助。

4 个答案:

答案 0 :(得分:3)

调用非静态方法this时,参数隐含地传递给方法

  private void Dos2Unix(string fileName) {
    ...
    var sample = this.GetType(); // <- possible call
    ...
  }

静态方法无法提供此类参数(this),因此您有错误。 在您的情况下,您不希望在Program方法中使用Dos2Unix类实例,因此请将其设为静态:

  class Program 
  {
    static void Main(string[] args)
    {
        var f = @"\D:\temp\test.xls";
        Dos2Unix(f);
    } 

    // Please, note "static"
    private static void Dos2Unix(string fileName) 
    {
      ...
    }
  }

从技术上讲,您根本不需要Program类实例,因此将整个类声明为static

   // class is static
   static class Program 
   {
      static void Main(string[] args)
      {
        var f = @"\D:\temp\test.xls";
        Dos2Unix(f);
      } 

      // all methods are static
      private static void Dos2Unix(string fileName) 
      {
       ...
      }
   }

答案 1 :(得分:2)

你不能直接从静态方法调用非静态方法,因为Program类的main方法是静态的,你只能从这个方法调用程序类的静态方法。

要从Main方法调用非静态方法,您可以创建程序类的对象,并在此对象上调用非静态方法。

static void Main(string[] args)
{
    var f = @"\D:\temp\test.xls";
    Program p = new Program();
    p.Dos2Unix(f);
}

静态方法无法调用非静态方法是有原因的,因为静态方法不依赖于该类的实例,另一方面非静态方法与实例绑定(可以访问非静态数据)成员)。认为一个静态方法调用一个非静态方法来访问实际上对于类不存在的实例成员,因为静态方法是在类而不是实例上调用的。您可以在此post进一步阅读。

答案 2 :(得分:0)

如果要从静态方法Main调用非静态方法,则必须创建Program类型的新对象:

new Program().Dos2Unix(f);

答案 3 :(得分:0)

您需要创建一个类的实例。 这应该有效:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
class Program
{
    static void Main(string[] args)
    {
        Program p = new Program();
        var f = @"\D:\temp\test.xls";
        p.Dos2Unix(f);
    }
    private void Dos2Unix(string fileName)
    {
       const byte CR = 0x0D;
       const byte LF = 0x0A;
       byte[] data = File.ReadAllBytes(fileName);
       using (FileStream fileStream = File.OpenWrite(fileName))
       {
           BinaryWriter bw = new BinaryWriter(fileStream);
           int position = 0;
           int index = 0;
           do
           {
             index = Array.IndexOf<byte>(data, CR, position);
             if ((index >= 0) && (data[index + 1] == LF))
             {
               // Write before the CR
               bw.Write(data, position, index - position);
               // from LF
               position = index + 1;
             }
           }
                while (index > 0);
                bw.Write(data, position, data.Length - position);
                fileStream.SetLength(fileStream.Position);
            }
    }
 }
}

所以基本上你只需要添加:

Program p = new Program();

并将您的方法称为:

p.Dos2Unix("....");

那是因为你无法在静态方法中访问非静态方法(顺便说一下你也不能使用它)。