我一直在搞乱命名空间以改善我的程序结构。我遇到了一个案例,我想使用一个公共静态方法,它返回一个值而不调用它的封闭类。一种方法是使用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参数。是否有任何方法可以做到这一点,而不暴露层次结构的另一个级别,添加使用指令,或添加一个Func<>代表?说:
Int AnInt = Namespace1.Namespace2.ClassName(data);
答案 0 :(得分:4)
代码中的一个问题是你有一个"方法"与班级同名。这是为类的构造函数保留的,它没有" return"值,因此必须使用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中你可以有一个"静态别名&# 34;这使您可以在不指定类的情况下引用静态成员:
using static Namespace1.Namespace2.ClassName.
...
int i;
i = CalcSomeInt(data);
但请注意,编译器会隐式地将类名添加到方法调用中,如果与其他可访问方法存在任何歧义,则必须指定类名以解决歧义。
答案 1 :(得分: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"。
但是 - 说实话 - 整个概念闻起来有点......