65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

1.00/5 (13投票s)

2001年9月23日

1分钟阅读

viewsIcon

127302

downloadIcon

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 运算符。

© . All rights reserved.