【问题标题】:Not understanding classes and usage不了解类和用法
【发布时间】:2011-10-21 11:21:25
【问题描述】:

不了解类和用法

我有一个VS2010的项目,这个项目有多个类(项目中的子项目) 我正在尝试在类中使用一种方法,就像在本地 winforms 项目中一样 浏览器

   using System.Diagnostics;

   namespace DataBaseAccess
   {
          public class Class1
          {
               string[] lines = System.IO.File.ReadAllLines("names.txt");

               public string startgenerationofnames()
               {
                  foreach (string value in lines)
                  {
                     Debug.WriteLine(lines);
                     //call next class with the current value
                  }
               }
         }
   }

我想使用 winforms 中的这个类,我已经创建了这个类。

DataBaseAccess.Class1 makenames = new DataBaseAccess.Class1();

并且想以正常方式使用它,就像没有课时一样 浏览器

 DataBaseAccess.Class1.startgenerationofnames();

除了运行 Debug.WriteLine(lines); 之外,我不期待返回值,也不期待类中的任何东西 我显然无法理解这个基本任务并且已经搜索了好几天了。 感谢您的帮助

【问题讨论】:

    标签: c# winforms oop


    【解决方案1】:

    您可以将您的方法和类转换为静态来调用该方法,而无需类的实例。

    using System.Diagnostics;
    
    namespace DataBaseAccess
    {
        public static class Class1
        {
            private static string[] lines = System.IO.File.ReadAllLines("names.txt");
    
            public static void startgenerationofnames()
            {
                foreach (string value in lines)
                {
                    Debug.WriteLine(lines);
                    //call next class with the current value
                }
            }
        }
    }
    

    现在你可以像这样调用它:

    DataBaseAccess.Class1.startgenerationofnames();
    

    【讨论】:

    • 不会编译,并且类没有必要是静态的才能拥有静态方法。
    • 注意:不能在静态方法中使用lines,因为lines 不是静态的。我说的对吗?
    • @AdamHouldsworth - 我知道,但传统知识是,当一个类只有静态方法时,最好将类设为静态以记录其意图。
    • @Marco - 是的,我更新了我的代码以反映这一点。使线条静止。
    【解决方案2】:

    将您的类创建为静态类和静态方法。然后你可以在不实例化类的情况下调用方法。

    【讨论】:

    • 为了包含静态方法,不需要将类设为静态。
    • 我将类设为静态,但现在从 winform 我该如何称呼它?当我尝试创建类时,智能没有显示任何内容
    • @AdamHouldsworth - 是的,但 OP 说这是使用该类的唯一方法,因此最好将其设为静态类来记录其意图。
    • @j0rd4n 同意,但是,答案没有说明这一点,并且听起来静态方法需要静态类,因此我的评论。
    • 如果类和 windows 窗体在同一个命名空间中,您只需将该类称为 Class1.startgenerationofnames();如果它不在同一个命名空间中,它将是 DataBaseAccess.Class1.startgenerationofnames();我还可以看到您的返回类型是字符串,而您目前没有返回任何字符串值?此外,我们假设您的课程在同一个项目中,如果不是,您必须添加一个项目引用。
    【解决方案3】:

    有两件事... 1 您的 startgenerationofnames 需要返回一个字符串...或者您可以将其更改为 void 返回类型。

    2 将读取所有行的加载移动到函数本身中...作为对象构造的一部分,您不想做任何类似的事情...因为它会给您一个不太明显的错误怎么了。

    试试这个……

     public static class Class1
                    {
    
               public static void startgenerationofnames()
              {
                   string[] lines = System.IO.File.ReadAllLines("names.txt");
                   foreach (string value in lines)
                  {
                    Debug.WriteLine(lines);
                    //call next class with the current value
                  }
            }
        }
    

    【讨论】:

      【解决方案4】:

      您不需要将类设为静态,只需将方法设为静态即可。但是,您目前不能这样做,因为您的方法使用类的实例成员:

      string[] lines ...

      方法的标准静态定义包括 static 关键字:

      public static string startgenerationofnames()

      我认为您不希望返回 (?),并且您需要将这些行移动到方法中(或在类中将它们设为静态):

      public static void StartGenerationOfNames()
      {
          string[] lines = System.IO.File.ReadAllLines("names.txt");
      
          foreach (string line in lines)
          {
              Debug.WriteLine(line);
          }
      }
      

      如果您根本不希望类被实例化,您可以将类本身设为静态:

      public static class Class1

      这会强制类中的任何成员都是静态的,并阻止人们通过以下方式实例化它:

      Class1 c = new Class1();

      类的用法与您对静态方法的期望一样:

      Class1.StartGenerationOfNames();

      【讨论】:

        【解决方案5】:

        您可以定义 public string startgenerationofnames() 以在不实例化 Class1 的情况下使用它,但在这种情况下这会失败,因为您正在使用(在 startgenerationofnames 内部)非静态变量。
        你可以使用:

        public class Class1
        {
            static string[] lines = System.IO.File.ReadAllLines("names.txt");
            public static string startgenerationofnames()
            {
                foreach (string value in lines)
                {
                     Debug.WriteLine(line); // not lines
                     //call next class with the current value
                }
                return ""; // or what you need
             }
        }
        

        【讨论】:

        • @AdamHouldsworth:是的,我刚刚编辑了我的答案。无论如何,我的示例想向 OP 展示他如何在没有类实例的情况下调用此方法。非常感谢!
        猜你喜欢
        • 2012-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-22
        • 1970-01-01
        • 1970-01-01
        • 2017-07-31
        相关资源
        最近更新 更多