在与 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。
我最近从用 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。