-1

我有一个类定义,其中定义了一个只读成员。

private readonly Dictionary<string, string> map = new Dictionary<string, string>();

现在为了测试我的设计,我想在它的类定义之外访问这个成员。我正在考虑提供一种get方法,但无法编写无错误的语法。

是否可以为成员赋值(使用new)并且仍然能够定义其get方法?

PS:我是 C# 语言的新手。

编辑: 我没有写代码,它只是我从一个已经写好的模块中复制的一个语句。我在模块中进行了一些设计更改,并希望在代码中尽可能少地更改对其进行测试,因此我希望在类外获得该成员的只读访问权限。

4

5 回答 5

2

有人可能会争辩说你不应该为类的私有成员编写测试。测试应该只使用公共接口而不依赖于类的内部,因为你应该能够在不破坏任何测试的情况下重构类的内部。

如果您添加一个“仅用于测试”的公共 getter,则无法保证有人会在项目的某个地方开始使用。

如果您真的想公开字典并使用 .NET 4.5,请使用ReadOnlyDictionaryclass 确保调用者不会更改任何内容。

public IDictionary<string, string> Map
{
    get { return new ReadOnlyDictionary<string, string>(map); }
}
于 2012-12-12T14:02:18.130 回答
2

您可以定义一个只读属性以允许公共访问您的字段:

private readonly Dictionary<string, string> map = 
    new Dictionary<string, string>();

public Dictionary<string, string> Map
{
    get { return map; }
}

请注意,这只会阻止外部类更改分配给 的实例引用map,而不是更改字典本身的内容。

于 2012-12-12T14:01:11.390 回答
0

只需创建一个简单的 getter

public  Dictionary<string, string> Mapping
{
   get { return map; }
}
于 2012-12-12T14:00:26.183 回答
0

您可以编写一个public属性函数来返回private readonly map,例如:

public Dictionary<string, string> Map { { get { return map; } } }

但是,Dictionary仍然是可变的。如果您想要一个只读的Dictionary,请参阅这个SO question

于 2012-12-12T14:01:15.457 回答
0

你的意思是这样的?

readonly Dictionary<string, string> _map = new Dictionary<string, string>();

public Dictionary<string, string> Map
{
    get { return _map; }
}

你为什么要制作这个变量readonly


如果您尝试授予对字典中包含的值的访问权限,则可以创建一个公开字典而不允许对其进行修改的方法:

public string GetMapValue(string key)
{
    return _map[key];
}
于 2012-12-12T14:00:45.473 回答