2015-11-05 68 views
1

我一直在使用命名空间来改善我的程序结构。我遇到了一个我希望使用一个公共静态方法的情况,该方法返回一个值而不调用它的封闭类。这样做的一种方法是使用out参数。所以,让我们说我有这样的代码:C#命名空间:调用方法和类

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

但是,让我们说,我想摆脱出来的参数。有没有什么办法可以做到这一点,而不暴露其他层次的层次结构,添加使用指令,或添加Func委托代理?你说:

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

非常不清楚你在找什么...... –

+0

你问成员名称是否可以和它们的封闭类型相同?如果是这样,那么不。你的第一块示例代码将编译一个非静态的构造函数。基于你想要的用法,我会看看使用'Data'的扩展方法来代替 - > int anInt = data。ToInt();' – Comintern

回答

3

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

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

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

然后调用它IKE这样:

int i = ClassName.CalcSomeInt(data); 

,或者如果你真的想使用完全合格的名称:

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

如果您问是否可以调用静态方法没有引用类,那么答案是不过在C#6号,你可以有一个“静态别名”,可以让你引用静态成员,而无需指定类:

using static Namespace1.Namespace2.ClassName. 

... 

int i; 
i = CalcSomeInt(data); 

但要注意的是,编译隐式添加方法调用的类名称,如果与其他可访问方法有任何歧义,则必须指定类名称以解决不明确性。

+0

我正试图探索不同的可能性;我很清楚这很奇怪。感谢您为我清理这个。 :) – Mekronid

1

你可能会做这样的事情:

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

在这两种情况下,字符串保存价值的 “hello world”。第二次通话后,您的“x”设置为“3”。

但是 - 说实话 - 整体概念闻起来有点...在你的代码