【问题标题】:Can there be stand alone functions in C# without a Class?C# 中可以有没有类的独立函数吗?
【发布时间】:2022-01-25 01:00:56
【问题描述】:

在 C/C++ 中,我有一堆从 main() 调用的函数,我想用 C# 重写它。我可以拥有独立的功能(方法)还是必须将它们放在另一个类中?我知道我可以在同一个类中拥有方法,但我希望每个函数/方法都有一个文件。

像这样工作:

using System.IO;
using System;


class Program
{
    static void Main()
    {
House balls = new House();
balls.said();

    }
}
    public class House
    {
        public void said()
        {
            Console.Write("fatty");
            Console.ReadLine();

        }
    }

但是我必须创建一个 House 的实例并调用 said(),而在 C 中我只能调用 said()。

【问题讨论】:

  • 你可以使用静态方法然后你不需要创建一个实例
  • 提示:想想你的代码的这些行发生了什么:Console.Write(...);Console.ReadLine();
  • 任何没有真正一流功能的语言都是完全可怕的。

标签: c#


【解决方案1】:

作为参考,我想在这里添加C#6的using static添加。

您现在可以使用静态类的方法,而不必一遍又一遍地键入该类的名称。一个匹配问题的例子是:

House.cs

public static class House
{
    public static void Said()
    {
        Console.Write("fatty");
        Console.ReadLine();
    }
}

Program.cs

using static House;

class Program
{
    static void Main()
    {
        Said();
    }
}

【讨论】:

  • 终于,我想了很久但错过了这个概念。
  • @JWP 同时 C# 9 已经到来,它添加了“顶级语句”,这可能也很有趣。见the MS docs
【解决方案2】:

没有。如果它们确实不适合您现有的任何类,请将它们设为 static 并将它们放入 static 实用程序类中。

【讨论】:

    【解决方案3】:

    C# 中没有独立函数的概念。一切都是对象。

    您可以在某些实用程序类上创建静态方法,并在不创建类实例的情况下调用这些方法,例如

    class Program
    {
        static void Main()
        {
        House.said();
        }
    }
    
    public class House
        {
            public static void said()
            {
                Console.Write("fatty");
                Console.ReadLine();
    
            }
        }
    

    【讨论】:

      【解决方案4】:

      感谢top-level statements feature

      在您的可执行项目中,现在允许使用以下语法:

      using SomeNamespace;
      
      // The following statements are seemingly defined without even a method,
      // but will be placed inside a "Main" static method in a "$Program" static class
      SayHello();
      var classFromSomeNamespace = new SomeClass(); // from SomeNamespace
      classFromSomeNamespace.SomeMethod();
      
      // This function is seemingly defined without a class,
      // but on compile time it will end up inside a "$Program" static class
      void SayHello()
      {
          Console.WriteLine("Hello!");
      }
      
      // Here the "traditional" syntax may start
      namespace SomeNamespace
      {
          public class SomeClass
          {
              public void SomeMethod()
              {
                  Console.WriteLine("SomeMethod called");
              }
          }
      }
      

      需要注意的是,上述语法仅对项目中的单个文件有效,编译器实际上仍将这一切包装在带有静态方法的$Program 静态类中。专门引入此功能是为了避免程序入口点的样板代码,并且可以轻松地用 C# 编写“脚本”,同时保留完整的 .NET 功能。

      【讨论】:

        【解决方案5】:

        您必须将它们放在一个类中,但该类可以像其他人提到的那样是静态的。如果您真的希望每个方法都有一个单独的文件,您可以将该类标记为部分以获取以下内容:

        Program.cs
        ----------
        class Program
        {
            static void Main()
            {
                House.said();
                House.saidAgain();
            }
        }
        
        House-said.cs
        -------------
        public static partial class House
        {
            public static void said()
            {
                Console.Write("fatty");
                Console.ReadLine();
            }
        }
        
        House-saidAgain.cs
        ------------------
        public static partial class House
        {
            public static void saidAgain()
            {
                Console.Write("fattyAgain");
                Console.ReadLine();
            }
        }
        

        不过,我不建议将每一个分开。主要使用部分类,以便设计器生成的代码不会覆盖同一类中的任何自定义代码。否则,您很容易得到数百个文件,并且没有简单的方法从一种方法转移到另一种方法。如果你认为你需要一个部分类,因为方法的数量越来越难以维护,那么你可能需要将逻辑分离到另一个类中。

        【讨论】:

          【解决方案6】:

          尽管 .NET 中存在独立函数的概念,但 C# 不允许您指定此类函数。您需要将它们粘贴在静态 Utils 类或类似的类中。

          【讨论】:

            【解决方案7】:

            如果您将您的方法声明为static(即:public static void said()),那么您可以使用House.said() 调用它,这与您在 C# 中获得的一样接近。

            【讨论】:

              【解决方案8】:

              您可以将所有方法添加到 Program 类中,但这很快就会变成无法维护的混乱,通常称为 God Class 或 Ball of Mud 反模式。

              为每个函数维护一个文件同样会变得一团糟。 Design Patterns 回答了“我在哪里放置我的方法”和“我应该创建哪些类”的问题。类聚合行为(函数)并且应该做一件事(单一职责。)

              【讨论】:

              • 是的,特别想避开神级。
              • 为做事(actors、builders)和携带数据(数据传输对象)创建类。不要害怕有很多类,因为这(在一定程度上)表明良好的分离的担忧。 C# 中的开源项目是如何组织类和方法的良好指导来源。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2012-11-26
              • 2020-11-19
              • 2014-12-19
              • 2014-12-10
              • 2019-01-16
              • 1970-01-01
              • 2015-02-13
              相关资源
              最近更新 更多