2011-09-07 21 views
4

简单的问题,我不认为这是可能的,但之前已经感到惊讶。有没有办法调用静态函数而不必提及类型?

我有所有类型的数学函数库,让我们一个很简单的例子floorcap:

class MathLib { 
    public static double floorcap(double floor, double value, double cap) { 
     return Math.Min(Math.Max(floor, value), cap); 
    } 
} 

在另一个类的另一种方法,我想只要键入

var mat_adjusted = floorcap(1, maturity, 5); 

但这不起作用,因为它没有在这个类中声明,它在一个库中。它使我类型

var mat_adjusted = MathLib.floorcap(1, maturity, 5); 

这会增加噪声代码。我可以缩短到

using m = MyMathLibrary.MathLib; 

.. yadayada 

var mat_adjusted = m.floorcap(1, maturity, 5); 

但仍然,我宁愿不必一直键入类名称。那可能吗?我也在F#中编写代码,并且您习惯于在一段时间后不必拼出类型/模块等。当我必须编写C#时,这件事让我感到困扰(一点点),因为它分散了事物的“肉”。

这里有很多功能,当你需要调用一些函数嵌套等所有这些点和类名称加起来。我喜欢我的代码尽可能干净。

由于提前,

格特 - 扬

+4

是的,使用同一个类中的方法。 :) – ChaosPandion

+1

我不知道为什么你有点符号的问题 - 'MathLib.FloorCap(1,2,3)'看起来很干净,只有几个字符。 –

+0

有效地考虑了扩展方法和'本地包装',忘记了在示例中的注意事项。包装会增加很多开销,扩展方法也会混淆代码。关键是代码应该尽可能地看起来像非程序员会写下来的那样。 – gjvdkamp

回答

5

没有,这是不可能的 - 它如果事情范围内驻留加以限定于它所驻留(明显的程度你的当前情况,那么你可以,但这可能会错过问题和目的)

这是因为没有什么直接的生命比任何类型等都高 - 所以没有“全局呼叫”的意义,所以说话。

+0

Downvoter,请提供您downvote的原因 –

+2

您的名字在这里适用... – ChaosPandion

+2

事实上,downvote很好奇,但meh。 –

1

如果您希望节省打字时间,您可以将方法存根复制并粘贴到每个客户端类别。

private static double floorcap(double floor, double value, double cap) { 
    return MathLib.floorcap(floor, value, cap); 
} 
+0

+1正是我要说的。可能应该让它保密。 – Daniel

+0

@丹尼尔 - 我在脑海里想到了这个想法。 – ChaosPandion

+2

这是一个维修噩梦。 –

3

做到这一点的一种方法是改为使用扩展方法。举例来说,如果你在一个静态类定义你的榜样作用:

static class MathLib 
{ 
    public static double floorcap(this double value, double floor, double cap) 
    { 
     return Math.Min(Math.Max(floor, value), cap); 
    } 
} 

然后你可以使用它像这样:

var mat_adjusted = maturity.floorcap(1, 5); 
+0

您仍然需要限定它:无论是通过静态类名称,类型名称,这是一个合格的调用。 –

+0

@Mr。失望:是的,但OP希望输入更少的代码;这给了他几乎最基本的代码,并且与他所期望的'floorcap(1,maturity,5)'例子相当好,因为静态类或名称空间没有任何噪声。 –

+0

@Ron Warholic,你是对的。现在我实际上不会在我的代码中执行此操作,除非我在MathLib中仅使用了几个广泛使用的函数。 – InvisibleBacon

0

可能给你的东西就像你想要什么的唯一方式是使用扩展方法来扩展算术类型要使用:

public static class MathLibExt { 
    public static double FloorCap(this double value, double floor, double cap) { 
    return Math.Min(Math.Max(floor, value), cap); 
    } 
} 

// call like 
var value = 25.0; 
var capped = value.FloorCap(1, 10); 
0

有办法做到这一点,如在每一个来电贵丽类中定义的方法private static brary;然而,我认为最好的解决方案就是克服它,每次输入类名称。

相关问题