在与 C# 中的 Class 不同的文件中有一个 Main() 例程

Having a Main() routine in a separate file from a Class in C#

我最近从用 gVIM 编写的 C++ 分支到用 Visual Studio Express 编写的 C#。有人告诉我,我必须忘掉很多东西才能真正有效地使用 C#,但这是我的问题:

在 C++ 中,当编写 class 或数据类型时,我会为 class 定义和驱动程序创建单独的文件。然后我会 #include 驱动程序中的 class 以便使用它。在 Visual Studio Express 2013 中如何做到这一点并不是很清楚,我查阅的所有教程在同一文件中都有 class 定义和 Main() 例程。

目前我的解决方案文件夹中只有两个文件:驱动程序 p1.cs 和类型 definition/implementation targetInt.cs。允许 p1.cs 使用我的 targetInt.cs 类型的最佳方法是什么?它是否只是因为是同一解决方案的一部分而具有访问权限?如果是这样,我该如何避免在我的类型定义中没有 Main() 例程?

这是解决方案的屏幕截图以及我在尝试构建解决方案时遇到的错误。尝试在 p1.cs 中声明指向已共享命名空间的 targetInt 对象时,我没有收到错误消息。

http://i793.photobucket.com/albums/yy218/tombombodil/solution_zps6a743e2d.png

如果我需要澄清任何事情,请告诉我。

您所写的问题归结为缺少共享名称空间 - 因为 targetInit 存在于单独的名称空间中,Program 需要 using targetInit.cs 来访问 targetInit类型。但是,它们可以通过在同一个 项目 中相互访问 - 一个解决方案可以包含多个项目,如果它们不相互引用,则它们无法访问每个项目其他类型。

通常,任何给定的 class 的 naemspace 实际上是它的文件夹路径,并且 class 名称与文件名相同(Visual Studio 在你制作新的 class 文件时为你做。

至于 Main() 定义,您只需要其中一个,因为您只有一个入口点供系统在程序开始时跳转到 - 具有多个 Main() 函数不会'当 OS 需要一个清晰的地方开始执行时,这没有多大意义。

Main() 方法和 class 定义放在同一个文件中很方便,因此可以一起阅读所有代码 - 了解实际项目的设置方式,尝试GitHub 并分叉了几个开源项目。

它确实不是很复杂,但它与 C++ 不同。因此,如果您有一个看起来像这样的文件:

namespace MyNamespace
{
    public class MyClass
    {
        //...stuff
    }
}

然后你想要另一个包含你的 Main 的文件(除了一个简单的项目之外,你还需要另一个文件),它看起来像这样:

using MyNamespace;   // unless you use the same namespace for both

namespace SomeOtherNamespace
{
    class Program
    {
        static void Main(string[] args)
        {
            var c = new MyClass();
            // alternatively, without the using statement, you can just fully qualify 
            // your class name like so:
            // var c = new MyNamespace.MyClass();
        }
    }
}

但请注意,这些文件需要在同一个项目中。如果它们在不同的项目中,您仍然可以这样做,但是您必须将对 MyClass 项目的引用添加到 Program 项目中。您不能做的只是让一个孤立的 C# 文件漂浮在您的解决方案中并期望它能够工作。

有两种方法可以直接在 C# 中使用另一个 class:
1-将 class 放在我的 class 的同一个命名空间中(即使它们在不同的文件中),这段代码阐明了这一点:

//file TargetInt.cs
namespace MyNameSpace
{
    class TargetInt
    {
    }
}  
//file p1.cs
namespace MyNameSpace
{
    class p1
    {
        static void Main(string[] args)
        {
        }
    }
}

请注意,两个 class 都在 MyNameSpace 命名空间中。
2-如果另一个 class 包含在另一个名称空间中,您可以通过在文件的上部开头声明此语句来简单地使用它:

//file TargetInt.cs
namespace OtherNameSpace
{
    class TargetInt
    {
    }
}
//file p1.cs
using OtherNameSpace;
namespace MyNameSpace
{
    class p1
    {
        static void Main(string[] args)
        {
        }
    }
}

using OtherNameSpace; 可以直接使用 TargetInt class。