c#类引用而不是实例引用

时间:2012-02-20 17:09:21

标签: c# class variables reference instance

我可以在本地引用C#中的类,而不是类的实例吗?以下代码不会编译,但作为示例,例如:

void someFunc()
{
    var a = System.Math;
    var b = a.Abs(4);
}

编辑:在真正的程序中,它不是System.Math类,我想构造类并返回构造的值。我最初并不认为我想要使用该类的上下文是相关的,可能它不应该是。

Anastasiosyal有一个有趣的想法,使用当地的代表来做。

6 个答案:

答案 0 :(得分:8)

您可以引用一个类:

Type math = typeof(System.Math);

但你不能使用常规点语法在其上调用静态方法:

// Wont compile:
math.Abs(5);

如果您只是想缩短(和恕我直言,混淆)您的代码,您可以reference classes with aliases via a using directive

// Untested, but should work
namespace MyUnreadableCode {
    using m = System.Math;
    class Foo {
        public static Int32 Absolut(Int32 a) {
            return m.Abs(a);
        }
    }
}

答案 1 :(得分:3)

您无法为变量分配静态类的值。问题是为什么你想要这样做,可能还有其他方法可以解决你的问题

e.g。您可以使用委托来分配您要执行的操作:

Func<int,int> operation = Math.Abs; 
// then you could use it like so: 
int processedValue = operation(-1);

答案 2 :(得分:2)

在c#中,他们被称为类型。你可以分配它们:

Type a = typeof(SomeClass);

但是,您必须将其实例化才能使用它。我相信你想要的是像java一样的静态导入,但不幸的是,它们在c#中不存在。

简短的回答:不像你上面的那样。

答案 3 :(得分:2)

在C#6.0中,他们引入了static import feature,可以解决问题。

using static System.Math;

class MyProgram
{
    static void Main(string[] args)
    {
        var b = Abs(4); // No need to specify the name of Math class
    }
}

答案 4 :(得分:1)

据我所知,你需要引用一个短名称的班级?试试这个(在文件顶部,使用语句部分):

using m = System.Math;

稍后在您的代码中:

m.Abs(...)

有道理吗?

答案 5 :(得分:0)

没有。将Type视为实例方法绑定到原始类型上的静态方法的值是不可能的。为此,您需要构造一个新类型,将其方法调用转发为原始类型。

class MyMath { 
  public int Abs(int i) {
    return Math.Abs(i);
  }
}

var x = new MyMath();