Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C中只读成员的get方法#_C# - Fatal编程技术网

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); }
}