C# C中只读成员的get方法#
我有一个类定义,其中定义了只读成员C# C中只读成员的get方法#,c#,C#,我有一个类定义,其中定义了只读成员 private readonly Dictionary<string, string> map = new Dictionary<string, string>(); private readonly Dictionary map=new Dictionary(); 现在为了测试我的设计,我想在其类定义之外访问这个成员。我正在考虑提供一个get方法,但无法编写无错误语法 是否可以为成员赋值(使用new),并且仍然能够定义其get方法
private readonly Dictionary<string, string> map = new Dictionary<string, string>();
private readonly Dictionary map=new Dictionary();
现在为了测试我的设计,我想在其类定义之外访问这个成员。我正在考虑提供一个get
方法,但无法编写无错误语法
是否可以为成员赋值(使用new
),并且仍然能够定义其get
方法
附言:我对C语言不熟悉
编辑:
我没有编写代码,只是从已经编写的模块中复制了一条语句。我在模块中做了一些设计更改,并希望在代码中进行尽可能小的更改来测试它,因此我希望在类外获得此成员的只读访问权限。只需创建一个简单的getter
public Dictionary<string, string> Mapping
{
get { return map; }
}
公共字典映射
{
获取{返回映射;}
}
你的意思是这样的
readonly Dictionary<string, string> _map = new Dictionary<string, string>();
public Dictionary<string, string> Map
{
get { return _map; }
}
您可以定义只读属性以允许公众访问您的字段:
private readonly Dictionary<string, string> map =
new Dictionary<string, string>();
public Dictionary<string, string> Map
{
get { return map; }
}
专用只读字典映射=
新字典();
公共字典地图
{
获取{返回映射;}
}
请注意,这只会阻止外部类更改分配给
map
的实例引用,而不会更改字典本身的内容。您可以编写public
属性函数来返回private readonly map
,例如:
public Dictionary<string, string> Map { { get { return map; } } }
公共字典映射{{get{return Map;}}}
但是,
字典
仍然是可变的。如果您想要一个只读的字典,请参见此。有人可能会认为您不应该为类的私有成员编写测试。测试应该只使用公共接口,而不依赖于类的内部,因为您应该能够在不破坏任何测试的情况下重构类的内部
如果您添加一个“仅用于测试”的公共getter,则不能保证有人会在项目中的某个地方开始使用它
如果确实要公开字典并使用.NET 4.5,请使用ReadOnlyDictionary
类以确保调用方不会更改任何内容
public IDictionary<string, string> Map
{
get { return new ReadOnlyDictionary<string, string>(map); }
}
公共词典地图
{
获取{returnnewreadonlydictionary(map);}
}
唯一的问题是内部词典现在可以从外部修改。@Oded:我认为readonly对.NET中的词典没有同样的效果。它仍然是可变的@0A0D-为True,但返回副本仍将保持内部词典的安全。您的答案也有同样的问题(看起来完全相同…@Oded:这就是为什么您要使用ReadOnlyDictionary:)@0A0D-来展开。引用是不可变的,而不是字典。这对于所有引用类型都是正确的-它们的成员往往也是可变的(取决于它们是如何编写的)直接公开内部引用类型通常是一个坏主意——考虑从属性或方法返回字典的副本,以确保它不会被用户修改。是否尝试提供只读访问?您知道只读字典仍然是可变的吗?您到底想测试什么?readonly
关键字意味着变量只能在构造函数中赋值。并不是说你不能添加或删除值/键。@MarkByers:是的,我想提供只读访问,但对可变内容一无所知,因为我是C#的新手。@RaviGupta:首先了解内部内容很重要。您可以在.NET 4.5中使用ReadOnlyDictionary
public IDictionary<string, string> Map
{
get { return new ReadOnlyDictionary<string, string>(map); }
}