C# 内部类属性使除外部类之外的所有访问类都为只读
我是c#新手,当我无意中发现这一点时,我正试图做一些编码。我不知道该怎么说。所以首先是代码。(这是虚拟代码,只是为了解释我的问题) 现在,当用户将该类用作C# 内部类属性使除外部类之外的所有访问类都为只读,c#,inner-classes,readonly,C#,Inner Classes,Readonly,我是c#新手,当我无意中发现这一点时,我正试图做一些编码。我不知道该怎么说。所以首先是代码。(这是虚拟代码,只是为了解释我的问题) 现在,当用户将该类用作 DatabaseConnector dbConnector = new DatabaseConnector(arguments); dbConnector.Cahce.Enabled = false; //Should throw error if(dbConnector.Cahce.Enabled) //should work
DatabaseConnector dbConnector = new DatabaseConnector(arguments);
dbConnector.Cahce.Enabled = false; //Should throw error
if(dbConnector.Cahce.Enabled) //should work.
dbConnector.Executesomemethod();
else
dbConnector.ExecutesomeOthermethod();
因此,基本上我想使内部类缓存启用属性作为除外部类之外的所有类的只读属性。目前我所做的是在每个Executesomemethod(),ExecutesomeOthermethod(),…,n
中检查构造函数/连接方法中已检查的条件,以设置启用的值
所以我想要的是使内部类
属性对除外部类
之外的所有访问类只读的方法。如有混淆,请随意评论。更改属性:
public bool Enabled { get; set; }
致:
将缓存类构造函数更改为:
public Cache(bool enabled)
{
Enabled = enabled;
}
将构造缓存类时更改为:
Cache = new Caching(true);
// remove this line Cache.Enabled = true;
这样的东西适合你的目的吗:
public class DatabaseConnector
{
public Caching Cache { get; set; }
public DatabaseConnector(string[] paramters)
{
Connect(paramters);
}
protected void Connect(string[] paramters)
{
ICaching Cache = new Caching();
Cache.Enabled = true;
}
private interface ICaching
{
bool Enabled { get; set; }
}
public class Caching : ICaching
{
private bool _enabled { get; set; }
public Caching()
{
_enabled = false;
}
bool ICaching.Enabled
{
get { return _enabled; }
set { _enabled = value; }
}
}
}
因此,私有接口将向外部类公开属性,但该类之外的任何对象都无法看到已启用的属性。没有办法做到这一点-除了类本身的可见性之外,外部类对嵌套类中的成员没有额外的访问权
两种选择:
- 将
cachingEnabled
专用字段保留在DatabaseConnector
中,并为Cache
提供一个DatabaseConnector
实例以从中获取它。(它可以读取私有字段,因为它是嵌套类。)
- 将只读部分与可写部分分开:
public interface ICache
{
bool Enabled { get; }
}
public class DatabaseConnector
{
private Cache cache;
public ICache Cache { get { return cache; } }
...
private class Cache
{
// Implementation with writable property
public bool Enabled { get; set; }
}
}
请注意,因为实现是一个私有嵌套类,所以调用方甚至不能强制转换缓存
属性的结果并以这种方式调用setter。(当然,他们可以在完全信任的环境中使用反射。)您的意思是希望继承缓存类的每个类都不能设置除DatabaseConnector类之外的已启用属性吗?我怀疑您不希望缓存
属性本身可由客户端写入,是吗,您是否需要DatabaseConnector
在构建后能够更改Enabled
本身的值?如果不是,尼尔的答案是完美的。如果你这样做,那就没用了。@jonsket不,这个类中有一些属性,比如TimeOut
,还有其他一些东西,比如缓存应该保持多长时间,应该是可写的。@jonsket目前我没有改变任何其他构造函数,但有可能发生这种情况。这就是为什么需要另一种方法。您不希望ICaching
具有只读属性吗?(这也可以更简单地实现…)+1我想我会选择@JonSkeet-first方法,因为我只有一个问题要处理。但似乎我需要读很多关于抽象的东西。但是考虑得好。我也会采用@JonSkeet方法!只有在DatabaseConnector类之外不需要重用缓存类的情况下,才会出现这种情况。
public class DatabaseConnector
{
public Caching Cache { get; set; }
public DatabaseConnector(string[] paramters)
{
Connect(paramters);
}
protected void Connect(string[] paramters)
{
ICaching Cache = new Caching();
Cache.Enabled = true;
}
private interface ICaching
{
bool Enabled { get; set; }
}
public class Caching : ICaching
{
private bool _enabled { get; set; }
public Caching()
{
_enabled = false;
}
bool ICaching.Enabled
{
get { return _enabled; }
set { _enabled = value; }
}
}
}
public interface ICache
{
bool Enabled { get; }
}
public class DatabaseConnector
{
private Cache cache;
public ICache Cache { get { return cache; } }
...
private class Cache
{
// Implementation with writable property
public bool Enabled { get; set; }
}
}