VB.NET命名空间缩写:如何在等效的C#代码中实现这一点

本文关键字:代码 这一点 实现 命名空间 NET 缩写 VB | 更新日期: 2023-09-27 18:23:44

我天生就是一名VB.NET程序员,很难弄清楚这一点。如有以下方面的帮助,我们将不胜感激。

我需要获得下面的C#代码(1)才能工作。等效的VB.NET运行得很好,但C#则不然。

请注意,(2)和(3)都可以工作,但这实际上是自动生成的代码,我需要VB.NET和C#版本尽可能相似。

  1. 这不会编译(Engine的完全限定名称为ThreeD.QVB.Engine):

    using ThreeD.QVB;
    namespace QVBScript
    {
        public class ScriptCode
        {
            public void Main(ref Engine.QVBObjectsDictionary objects,
                             Engine.Commands commands)
            {
                …
    
  2. 然而,这个确实有效:

    //using ThreeD.QVB; // I'm instead using fully-qualified names in the method
    namespace QVBScript
    {
        public class ScriptCode
        {
            public void Main(ref ThreeD.QVB.Engine.QVBObjectsDictionary objects,
                            ThreeD.QVB.Engine.Commands commands)
            {
                …
    
  3. 这也起作用:

    using eng = ThreeD.QVB.Engine;
    namespace QVBScript
    {
        public class ScriptCode
        {
            public void Main(ref eng.QVBObjectsDictionary objects, 
                             eng.Commands commands)
            {
                …
    

VB.NET命名空间缩写:如何在等效的C#代码中实现这一点

在VB.NET中,如果名称空间的前半部分有import,则只能引用后半部分。在C#中,你不能这样做。您必须具有完整命名空间的using,或者完全限定您的类型名称。不同的语言,不同的规则。

在上一个示例中,您不需要使用别名。

using ThreeD.QVB.Engine;
namespace QVBScript
{
    public class ScriptCode
    {
        public void Main(ref QVBObjectsDictionary objects, Commands commands)
        {
            UI.Output Output = (UI.Output)objects["Output"];

要记住的基本规则:

using A.B;

  • 是否允许您引用命名空间AA.B中的类型,而无需完全限定它们的命名空间(同一文件中的所有位置)。

  • 不允许通过从名称中省略A.A.B.部分来缩写AA.B.的子命名空间的名称。

namespace A.B { … }

  • 是否允许您引用命名空间AA.B中的类型,而无需完全限定它们的命名空间(在块内)。

  • 允许您通过从名称中省略A.A.B.部分来缩写AA.B的子命名空间的名称。


示例:

using System.Collections;
namespace A
{
  class Top : IDisposable, // importing System.Collections also imports System   
              IEnumerable, // inside the imported namespace
              System.Collections.Generic.IEnumerable<int>
  {…}                      // ^ "using" does not permit namespace abbreviation
}
namespace A.B
{
  class Middle : Top,      // namespace A available inside namespace A.B
                 C.IBottom // namespace blocks permit namespace abbreviation
  {…}
}
namespace A.B.C
{
  interface IBottom {…}
}
相关文章: