C# 实用程序 Class - 为通用设置和编译 w/o Main

C# Utility Class - Setting up for General Use and Compiling w/o Main

好的,开始学习一些 C#。很棒的语言,总的来说喜欢使用它,但我不明白如何克服这种缺乏实用性的问题 classes。本质上,我想设置一个通用实用程序 class,它可以包含在一个文件夹中,只需执行 "using namespace Globals/Utilities/etc." 命令即可用于任何项目。本质上:

using System;
namespace Globals {
    public static class Commands {
        public static void WaitForReturn() {
            Console.WriteLine("Press Enter to continue.");
            Console.ReadLine();
        }
    }
}

与上述类似,因此在任何其他 class 中,我可以通过将其作为预处理指令包含在内来调用这些函数。

using System;
using Globals;

namespace RectangleDemo {
    <rectangle definition here>

    class Demo {
        static void Main(string[] args) {
            Rectangle r = new Rectangle();
            Rectangle s = new Rectangle(5, 6);
            r.Display();
            s.Display();
            WaitForReturn();
        }
    }
}

事实上,我正在尝试简单地编译我的 'utility' class(比上面列出的更多)来检查错误,但它只是告诉我它可以'不要编译它,因为没有 main 方法。有什么建议吗?

(是的,我知道我有 java 编码风格,我同意!)

使用 C#6,您可以导入静态方法,这样您就可以得到以下编码风格:

using System;
using static Globals.Commands;

namespace MyConsole
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            WaitForReturn();
        }
    }
}

namespace Globals
{
    public static class Commands
    {
        public static void WaitForReturn()
        {
            Console.WriteLine("Press Enter to continue.");
            Console.ReadLine();
        }
    }
}

按照 Tim 的建议,如果您不需要主入口点,请使用 Class 库项目而不是控制台应用程序。

C# 无法按您期望的方式工作。导入 namespaces/classes 和文件之间没有关系,因此 using Globals; 不会转化为文件内容包含 à la C/C++(即与 #include "Globals.cs" 不同)。

在命令行上,C# 编译器接受构成源的文件列表:

csc Demo.cs Globals.cs

如果您正在使用 IDE,例如 Visual Studio,您会 linkGlobals.cs 放入您的项目中。 link,我的意思是更像是一个象征性的 link(尽管实际上并非如此),而不是通过 [= 静态 linking 36=]er 就像通常在 C/C++ 设置中那样。

因此,为了使“包含公共代码”的方案生效,您需要通过简单地始终将 Globals.cs 添加到构成项目的 C# 文件列表中进行编译(在命令中提供给编译器行或添加到 IDE 中的项目),然后使用 static import:

using System;
using static Globals.Commands; // <-- import statically allows methods to be
                               //     used without class name qualification

namespace RectangleDemo {
    // <rectangle definition here>

    class Demo {
        static void Main(string[] args) {
            Rectangle r = new Rectangle();
            Rectangle s = new Rectangle(5, 6);
            r.Display();
            s.Display();
            WaitForReturn();
        }
    }
}