1

好的,所以努力学习一些 C#。很棒的语言,一般都喜欢使用它,但我不明白如何克服这种缺乏实用程序类的问题。本质上,我想设置一个通用实用程序类,它可以包含在一个文件夹中,并且只需执行“使用命名空间 Globals/Utilities/etc”即可用于任何项目。命令。在本质上:

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

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

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();
        }
    }
}

事实上,我试图简单地编译我的“实用程序”类(比上面列出的更多)来检查错误,但它只是告诉我它无法编译它,因为没有 main 方法。有什么建议么?

(是的,我知道我有一种 java 编码风格,我可以接受!)

4

2 回答 2

5

使用 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();
        }
    }
}

正如蒂姆所建议的,如果您不想要主入口点,请使用类库项目而不是控制台应用程序。

于 2016-06-10T23:11:59.703 回答
2

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

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

csc Demo.cs Globals.cs

如果您使用的是像 Visual Studio 这样的 IDE,您可以将其链接Globals.cs您的项目中。并且通过链接,我的意思是更像一个符号链接(尽管它实际上不是),而不是通过链接器进行静态链接,就像您通常在 C/C++ 设置中那样。

因此,要使“包含公共代码”的方案工作,您需要通过简单地始终添加Globals.cs到构成项目的 C# 文件列表(在命令行上提供给编译器或添加到 IDE 中的项目)来进行编译,并且然后使用静态导入

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();
        }
    }
}
于 2016-06-10T23:53:02.897 回答