C#命名空间:调用方法和类

本文关键字:方法 调用 命名空间 | 更新日期: 2023-09-27 18:20:41

我一直在摆弄命名空间来改进程序的结构。我遇到过一个案例,我想使用一个公共静态方法,该方法返回一个值,而不调用其封闭类。其中一种方法是使用out参数。所以,假设我有这个代码:

namespace Namespace1
{
     namespace Namespace2
     {
          public class ClassName
          {
               public ClassName(Data data, out int AnInt)
               {
                     AnInt = (int)data;
               }
          }
     }
}

我可以如下使用:

Int AnInt;
Namespace1.Namespace2.ClassName(data, out AnInt);

但是,假设我想去掉out参数。有没有任何方法可以做到这一点,而不暴露层次结构的另一个级别、添加using指令或添加Func<>代表说:

Int AnInt = Namespace1.Namespace2.ClassName(data);

C#命名空间:调用方法和类

代码中的一个问题是您有一个与类同名的"方法"。这是为类的构造函数保留的,该构造函数没有"return"值,因此必须使用out参数来提供输出(创建的实例除外)。虽然构造函数有out参数是可能的,但这非常奇怪,几乎可以肯定地以更标准的方式完成。

您当然可以创建一个返回值的静态方法:

  public class ClassName
  {
       public static int CalcSomeInt(Data data)
       {
             return (int)data;
       }
  }

然后称之为:

int i = ClassName.CalcSomeInt(data);

或者如果你真的想使用完全限定的名称:

int i = Namespace1.Namespace2.ClassName.CalcSomeInt(data);

如果你问一个静态方法是否可以在不引用类的情况下调用,那么答案是否定的。然而,在C#6中,你可以有一个"静态别名",让你引用静态成员而不指定类:

using static Namespace1.Namespace2.ClassName.
...
int i;
i = CalcSomeInt(data);

但请注意,编译器将类名隐式添加到方法调用中,如果与其他可访问方法存在任何歧义,则必须指定类名来解决歧义。

您可以这样做:

namespace Namespace1 {
    namespace Namespace2 {
        public class ClassName {
            public string SomeMethod(int data, out int AnInt) {
                AnInt = data;
                return "hello world";
            }
            public string SomeMethod(int data) {
                int dummy;
                return SomeMethod(data, out dummy);
            }
        }
    }
}

你的电话可能看起来像:

string s1 = new Namespace1.Namespace2.ClassName().SomeMethod(3);
int x;
string s2 = new Namespace1.Namespace2.ClassName().SomeMethod(3, out x);

在这两种情况下,字符串都包含值"helloworld"。第二次通话后,您的"x"设置为"3"。

但是,老实说,整个概念闻起来有点。。。