模拟全局函数的 C# 习惯用法





1.00/5 (13投票s)
2001年9月23日
1分钟阅读

127302

372
当您真正想要的是一个全局函数时。
引言
最近,我正在使用 C# 开发一个项目,我发现有几个类需要查询注册表以返回包含路径的字符串。这个函数不简单,简单的复制粘贴会引入维护错误。如果我使用 C++,我会简单地创建一个全局函数,然后这些类可以调用该函数。但是 C# 不允许全局函数。我考虑过
class foo { public GetString(){ //... } }
然后每个类都会执行以下操作
foo bar = new foo();
string WhatIReallyWant = bar.GetString();
但这涉及创建一个新变量,我觉得这实在太丑陋了。然后我找到了一种模拟全局函数的方法,而实际上并没有创建它。方法如下
- 创建一个类,其名称与您想要调用的“函数”名称相同。
- 赋予它一个成员变量,其类型是您想要返回的类型。
- 创建一个构造函数,其参数与您想要传递的参数相同。在该构造函数中,执行您希望函数执行的操作,并将结果分配给上面创建的变量。
- 重载您想要的类型的隐式转换运算符。使其返回该变量。
然后在您的代码中,在调用这个“函数”之前加上 new
运算符。
这是演示项目中的相关代码。这是一个简单的示例,用于反转字符串:
class reverser { private string Data; public reverser(string toReverse) { for (int i=toReverse.Length-1; i>=0; i--) { Data += toReverse[i]; } } public static implicit operator string(reverser r) { return r.Data; } }
如您所见,“函数”的名称是 reverser
,变量名为 Data
,它接受一个字符串参数 toReverse
,然后我们重载了转换为字符串的运算符。转换运算符定义为隐式,因此我们不必在每次调用前都加上 (string)
。然后您可以像这样调用“函数”
string foo = new reverser("foobar");
这看起来几乎像一个常规函数调用,除了 new
运算符。